인스타그램 database의 schema design을 해보았다.
디자인하는 도중 고민한 부분과 추가적으로 생각할 부분을 정리해보았다.
간단하게 그려본 인스타그램 예시!
➡️ 사용자(user) / 게시글(post) / 글(content) / 댓글(comment) / 좋아요(like) / 해시태그(hastag) / 팔로우(follow)
하나의 user는 여러 개의 post를 작성할 수 있다.
한 개의 post는 하나의 user만 작성할 수 있다.
한 개의 post는 한 개의 content를 작성할 수 있다.
한 개의 content는 한 개의 post에 의해서 작성된다.
한 개의 post는 여러 개의 comment가 달릴 수 있다.
한 개의 comment는 한 개의 post에만 작성될 수 있다.
한 개의 post는 여러 개의 like를 받을 수 있다.
한 개의 like는 한 개의 post에만 적용될 수 있다.
처음 생각 :
한 개의 post는 여러 개의 hastag를 가질 수 있다.
한 개의 hastag는 한 개의 post에만 달릴 수 있다.
고민한 후 :
한 개의 post는 여러 개의 hastag를 가질 수 있다.
한 개의 hastag는 여러 개의 post에 달릴 수 있다.
그렇게 생각한 이유 :
예를 들어 <#맛집>이라는 해시태그를 달거라 가정해보면 <#맛집>이란 태그는 여러 게시글에 작성될 수 있다.
즉, 여러 게시글에 중복해서 작성이 가능하다!
하나의 user는 여러 개의 like를 할 수 있다. (여러 post에 like를 적용할 수 있다.)
한 개의 like는 하나의 user에 의해서만 적용될 수 있다.
하나의 user는 여러 개의 comment를 달 수 있다. (여러 post에 comment를 적용할 수 있다.)
한 개의 comment 하나의 user에 의해서만 달릴 수 있다.
하나의 user는 여러 명의 follower를 가질 수 있다.
하나의 follower 여러 명의 user로부터 팔로잉 받을 수 있다.
❗️dbdiagram을 이용해 작성해보았다.❗️
Table users {
id int [pk, increment] // auto-increment
name varchar
password password
}
Table posts {
id int [pk]
user_id int
content varchar
created_at timestamp [default: `now()`]
}
Table comments {
id int [pk]
user_id int
post_id int
comment varchar
created_at timestamp [default: `now()`]
}
Table likes {
id int [pk]
user_id int
post_id int
created_at timestamp
}
Table hastags {
id int [pk]
hastag varchar
}
Table post_hastag {
post_id int
hastag_id int
}
Table follower {
id int [pk]
name varchar
}
Table following {
user_id int
follower_id int
}
게시글 : 해시태그 = N : M 관계인건 알겠는데 이걸 어떻게 표현할지 많이 고민했다.
으로 표현하면 될 거 같았는데 코드를 그렇게 작성하니 계속 에러가 났다.
다시 강의로 돌아가서 N : M 관계에서 어떻게 표현하면 좋을지 공부했더니
다대다 관계는 두 개의 일대다 관계와 그 모양이 같습니다. 두 개의 테이블과 1:N(일대다) 관계를 형성하는 새로운 테이블로 N:N(다대다) 관계를 나타낼 수 있습니다.
라는 걸 깨달았다. 그렇게해서 "post_hastag" 테이블을 새로 만들었다.
"post_hastag"는 posts와 hastags를 연결하기 위한 테이블이다.
사용자와 팔로워 관계도 위 게시글과 해시태그 관계처럼 N : M 관계다.
그래서 똑같이 users와 follower를 연결 할 새로운 테이블 "following"을 만들었다.
참고 : @seungsang00님의 벨로그