✍️ TILog_08

은유로그·2021년 10월 10일
1

🔥 Log

목록 보기
10/29
post-thumbnail

인스타그램 database의 schema design을 해보았다.
디자인하는 도중 고민한 부분과 추가적으로 생각할 부분을 정리해보았다.


🎨 Instagram 스키마 디자인


간단하게 그려본 인스타그램 예시!

💡 생각해볼 스키마

➡️ 사용자(user) / 게시글(post) / 글(content) / 댓글(comment) / 좋아요(like) / 해시태그(hastag) / 팔로우(follow)


🧱 데이터베이스 설계

user : post = 1 : N

하나의 user는 여러 개의 post를 작성할 수 있다.
한 개의 post는 하나의 user만 작성할 수 있다.

post : content = 1 : 1

한 개의 post는 한 개의 content를 작성할 수 있다.
한 개의 content는 한 개의 post에 의해서 작성된다.

post : comment = 1 : N

한 개의 post는 여러 개의 comment가 달릴 수 있다.
한 개의 comment는 한 개의 post에만 작성될 수 있다.

post : like = 1 : N

한 개의 post는 여러 개의 like를 받을 수 있다.
한 개의 like는 한 개의 post에만 적용될 수 있다.

post : hastag = 1 : N ➡️ N : M

처음 생각 :
한 개의 post는 여러 개의 hastag를 가질 수 있다.
한 개의 hastag는 한 개의 post에만 달릴 수 있다.

고민한 후 :
한 개의 post는 여러 개의 hastag를 가질 수 있다.
한 개의 hastag는 여러 개의 post에 달릴 수 있다.

그렇게 생각한 이유 :
예를 들어 <#맛집>이라는 해시태그를 달거라 가정해보면 <#맛집>이란 태그는 여러 게시글에 작성될 수 있다.
즉, 여러 게시글에 중복해서 작성이 가능하다!

user : like = 1 : N

하나의 user는 여러 개의 like를 할 수 있다. (여러 post에 like를 적용할 수 있다.)
한 개의 like는 하나의 user에 의해서만 적용될 수 있다.

user : comment = 1 : N

하나의 user는 여러 개의 comment를 달 수 있다. (여러 post에 comment를 적용할 수 있다.)
한 개의 comment 하나의 user에 의해서만 달릴 수 있다.

user : follower = N : M

하나의 user는 여러 명의 follower를 가질 수 있다.
하나의 follower 여러 명의 user로부터 팔로잉 받을 수 있다.


🖌 스키마 작성

❗️dbdiagram을 이용해 작성해보았다.❗️

사용자(users)

Table users {
  id int [pk, increment] // auto-increment
  name varchar
  password password
}

게시글(posts)

Table posts {
  id int [pk]
  user_id int
  content varchar
  created_at timestamp [default: `now()`]
}

댓글(comments)

Table comments {
  id int [pk]
  user_id int
  post_id int
  comment varchar
  created_at timestamp [default: `now()`]
}

좋아요(likes)

Table likes {
  id int [pk]
  user_id int
  post_id int
  created_at timestamp
}

해시태그(hastags)

Table hastags {
  id int [pk]
  hastag varchar
}

게시글_해시태그(post_hastag)

Table post_hastag {
  post_id int
  hastag_id int
}

팔로워(follower)

Table follower {
  id int [pk]
  name varchar
}

팔로잉(following)

Table following {
  user_id int
  follower_id int
}

💭 고민한 부분

게시글 ↔️ 해시태그의 관계

게시글 : 해시태그 = N : M 관계인건 알겠는데 이걸 어떻게 표현할지 많이 고민했다.

  • posts.id : hastags.id = 1 : N
  • hastags.id : posts.id = 1 : N

으로 표현하면 될 거 같았는데 코드를 그렇게 작성하니 계속 에러가 났다.
다시 강의로 돌아가서 N : M 관계에서 어떻게 표현하면 좋을지 공부했더니

다대다 관계는 두 개의 일대다 관계와 그 모양이 같습니다. 두 개의 테이블과 1:N(일대다) 관계를 형성하는 새로운 테이블로 N:N(다대다) 관계를 나타낼 수 있습니다.

라는 걸 깨달았다. 그렇게해서 "post_hastag" 테이블을 새로 만들었다.
"post_hastag"는 posts와 hastags를 연결하기 위한 테이블이다.

사용자 ↔️ 팔로워의 관계

사용자와 팔로워 관계도 위 게시글과 해시태그 관계처럼 N : M 관계다.
그래서 똑같이 users와 follower를 연결 할 새로운 테이블 "following"을 만들었다.


🤔 추가적으로 생각해볼 부분

  • 하나의 테이블(릴레이션)에는 반드시 하나 이상의 후보키가 존재해야하는 걸로 알고있는데, post_hastag와 following의 후보키는 뭐로 지정하면 좋을까?
  • 기본키(pk) 뿐만 아니라 외래키도 생각해보는게 좋을 듯 하다.
  • 오늘 작성해본 디자인은 정말 딱 기본 기능들로만 이루어졌다. 그 외 기능들을 추가해보자!
    1. post는 text로 이루어진 글 뿐만 아니라 사진, 비디오 등 여러 타입의 글을 작성할 수 있다.
    2. post에 follower를 태그걸 수 있다.
    3. hastag는 post 뿐만 아니라 comment에도 달 수 있다.
    4. like는 post 뿐만 아니라 comment에도 달 수 있다.
    5. user는 follower를 차단할 수 있다.

참고 : @seungsang00님의 벨로그

profile
๑•‿•๑

0개의 댓글