인스타그램은 사진을 업로드하고, 사람들이 서로 댓글을 달며 서로 follow 관계를 만들 수 있는 사진 SNS 서비스이다.
인스타그램의 간단한 기능들을 구현하기 위해 데이터베이스의 스키마를 디자인하는 실습 과정을 거쳤다.
이번 포스팅에서는 그 과정을 기록한 노션 글을 마이그레이션 한다.
인스타그램 주요 기능 정의
1. 게시물(Post) 작성 기능
인스타그램에서는 여러 개의 사진(A)을 올릴 수 있습니다. 사진을 업로드할 때, 사진을 설명하는 간단한 글(C)이 올라갑니다.
2. 게시물에 댓글 달기 및 좋아요 기능
게시물이 업로드되면 다른 사용자는 이 게시물에 댓글(E)을 달 수 있고, 좋아요(B) 를 눌러 관심을 표할 수 있습니다.
3. 해시태그 기능
게시물에 #감성 #맛집 등의 해시태그(D)를 남길 수 있으며, 이 해시태그를 누르면 이 해시태그가 사용된 모든 게시물을 한 데 모아 볼 수 있습니다.
4. follow 기능
인스타그램에서 친구 관계는 팔로워(follower)와 팔로잉(following)으로 나뉩니다. 김코딩이 최해커를 following 하면, 최해커의 피드가 김코딩의 홈 화면에 나타납니다. 최해커의 입장에서는 김코딩이 follower로 추가됩니다.
위와 같은 기능을 구현하기 위한 스키마를 설계할 것이다.
스키마 설계를 위한 단계는 다음과 같은 방식으로 진행했다.
1. 스키마 설계 단계
- 모델 요구사항 분석
- 분석한 요구사항에서 엔티티를 추출한다
- 각 엔티티가 가질 수 있는 속성들을 뽑아낸다
- 속성들 중 따로 엔티티로 뽑아내고 관계를 가질 수 있는 것들을 골라낸다 (정규화)
- ER 다이어그램을 그려보면서 Entity간의 관계를 정한다
- 테이블로 변환한다
1) 요구사항 분석
* 엔티티로 추출할 것은 오렌지 색으로 표시했다
사용자:
- 게시물을 작성할 수 있다
- 게시물:
- 게시물에는 여러 개의 사진을 올릴 수 있다
- 사진 업로드와 함께 사진을 설명하는 간단한 글이 올라간다
- 게시물:
- 댓글을 달 수 있다
- 댓글:
- 게시물에 댓글을 달 수 있다
- 다른 사용자와 작성자 모두 가능하다
- 댓글:
- 좋아요를 누를 수 있다
- 좋아요:
- 사용자는 게시물에 대한 좋아요를 누를 수 있다
- 좋아요:
- 해시태그를 남길 수 있다
- 해시태그:
- 게시물에 여러 개의 해시태그를 남길 수 있다
- 해시태그를 누르면 해시태그가 사용된 모든 게시물을 모아 볼 수 있다
- 해시태그:
- 팔로우를 할 수 있다
- 팔로우:
- 팔로워가 있고 (팔로우하는 사람 / 팔로우의 주체)
- 팔로잉이 있다 (팔로우 당하는 사람 / 팔로우의 대상)
- 팔로우:
2) 엔티티와 속성 추출
해당 테이블의 고유 속성 / 관계를 통해 이어질 속성
3) 엔티티 간의 관계 추출
Entity | Attribute | Entity → Table |
사용자 | id, 계정아이디, 이메일, 닉네임, 팔로워, 팔로잉, 좋아요, 게시물, 댓글 | users |
게시물 | id, 작성자, 작성시간, 설명글, 사진, 해시태그, 댓글, 좋아요 | posts |
사진 | id, 사진경로, 게시물id | photos |
댓글 | id, 작성자, 작성내용, 게시물id, 작성시간 | comments |
좋아요 | id, 사용자id, 게시물id, 생성시간 | likes |
해시태그 | id, 태그내용, 게시물id | hashtags |
팔로우 | id, 팔로워, 팔로잉, 생성시간 | follow |
관계 | 관계 참여하는 Entity | 관계 유형 |
작성(게시물) | 사용자 : 사용자는 여러 개의 게시물을 올릴 수 있다 게시물 : 하나의 게시물은 하나의 사용자만 올릴 수 있다 |
사용자:게시물 = 1:N |
작성(댓글) | 사용자 : 사용자는 여러 개의 댓글을 달 수 있다 댓글 : 하나의 댓글은 하나의 사용자만 작성할 수 있다 게시물 : 게시물에는 여러개의 댓글이 달릴 수 있다 |
사용자:댓글 = 1:N 게시물:댓글 = 1:N |
업로드(사진) | 사진 : 하나의 사진은 하나의 게시물에만 업로드된다 게시물 : 하나의 게시물에는 여러 개의 사진이 업로드될 수 있다 |
게시물:사진 = 1:N |
좋아요 | 사용자 : 사용자는 여러 개의 좋아요를 누를 수 있다 좋아요 : 좋아요는 사용자와 게시물의 정보를 갖는다 게시물 : 하나의 게시물에는 여러 개의 좋아요가 있을 수 있다 |
사용자:좋아요 = 1:N 게시물:좋아요 = 1:N |
팔로우 | 팔로워 : 팔로우(구독)하는 사용자 (팔로우의 주체)는 여러명일 수 있다 팔로잉 : 팔로우(구독)당하는 사용자 (팔로우의 대상)는 여러명일 수 있다 |
팔로워:팔로잉 = N:M |
해시태그 | 해시태그 : 하나의 해시태그에는 여러 개의 게시물이 연결될 수 있다 게시물 : 하나의 게시물에는 여러 개의 해시태그가 작성될 수 있다 |
해시태그:게시물 = N:M |
→ 해시태그의 경우 join 테이블을 만들어서 N:M 구현할 것
2. 결과
그래픽 UI로 클릭하는 것보다 타이핑이 더 편해서 https://dbdiagram.io/ 을 이용해 스키마를 작성했다.
'CS > Database' 카테고리의 다른 글
[SQL] TestDome Solution - Users And Roles (0) | 2022.09.19 |
---|---|
[SQL] TestDome Solution - Workers (1) | 2022.09.16 |
트랜잭션의 특성 - ACID (0) | 2022.05.12 |