[Database]스키마(Schema)란? / 인스타그램 스키마 그려보기
스키마(Schema)란? (= "데이터베이스의 청사진")
- 데이터베이스에서 데이터가 구성되는 방식과 서로 다른 엔티티 간의 관계에 대한 설명
- DB내에 어떤 구조로 데이터가 저장되느냐~
- 데이터 베이스의 구조, 제약조건에 대한 전반적엔 명세 기술
관계형 데이터베이스 ?
: 테이블(=구조화된 데이트)을 사용하는 데이터베이스
- 데이터(data): 각 항목에 저장되는 값입니다.
- 테이블(table; 또는 relation) : 사전에 정의된 열의 데이터 타입대로 작성된 데이터가 행으로 축적됩니다.
(= 엔터티 entity) - 칼럼(column; 또는 field) : 테이블의 한 열을 가리킵니다.
- 레코드(record; 또는 tuple) : 테이블의 한 행(= row)에 저장된 데이터입니다.
- 키(key) : 테이블의 각 레코드를 구분할 수 있는 값
각 레코드마다 고유한 값을 가집니다. 기본키(primary key), 외래키(foreign key) 등이 있음
테이블 ~ 테이블 사이의 관계는
- 1 : 1 관계
- 1 : N 관계
- M : N 관계
- +자기참조 관계
가 있다.
1 : 1 관계
phone_id는 외래키로, Phonebook 테이블의 phone_id와 연결되어 있다.
전화번호가 단 한 명의 유저와 연결되어 있고,
그 반대도 동일한 경우라면 이 경우는 1:1 관계이다.
*1:1 관계는 자주 사용하지 않는다고 한다!
위의 테이블의 경우 그냥 User테이블에 전화번호 칼럼을 넣어줘도 됨.
1 : N 관계
하나의 레코드가 서로 다른 여러개의 레코드와 연결된 경우이다.
한 명의 유저가 개인용 전화번호, 업무용 전화번호 등 여러개의 전화번호를 가질 수 있다.
그러나 하나의 전화번호는 여러명의 주인을 가질 수는 없다.
이 경우를 1:N 관계라고 한다.
*관계형 데이터베이스에서 제일 많이 사용
M : N 관계
다대다 관계를 위해 스키마 디자인시 - join 테이블을 만든다.
1:n 관계와 비슷하지만,
양방향에서 다수의 레코드를 가질 수 있다는 점이 다르다.
위의 Customer 테이블과 Package 테이블을 조인한 customer_package 테이블을 살펴보면,
고객 한 명이 여러개의 여행 상품을 가질 수 있다. (A여행도 가고, B여행도 가는 경우)
여행 상품 하나 또한 여러 명의 고객을 가질 수 있다. (고객 J와 H모두, A여행 상품을 구매한 경우)
* 1:N 관계와 M:N 관계가 헷갈릴 경우에는 말로 풀어서 볼 경우 쉽게 알 수 있다.
뒤집어서도 문장이 성립할 때, 1:N이 아닌 M:N 관계인 것이다.
Ex1)
하나의 주문에는 여러개의 상품이 담길 수 있다. (O)
하나의 상품은 여러개의 주문에 묶일 수 있다 (O)
------------------------------------------------------------------
주문 ~ 상품 ==> M:N 관계
Ex2)
한 사람의 유저가 여러개의 주문을 생성할 수 있다. (O)
하나의 주문을 여러명의 유저가 생성할 수 있다. (X) --> 주문번호는 고유하다! 함께 살 수 없음.
-----------------------------------------------------------------
유저 ~ 주문 ==> 1:N 관계
자기참조 관계
1:N은 서로 다른 테이블 관계를 나타낼 때 표현한다.
'같은 테이블' 내부에서 일어날 경우 자기참조 관계
인스타그램 스키마 디자인
: 최소 기능을 만족시키는 스키마(or ERD)를 그리기 위해 실습을 진행해보았다.
만족시킬 최저 기능은
1. 게시물 작성 기능
2. 게시물에 댓글 달기 및 좋아요 기능
3. 해시태그 기능
4. follow 기능
이었는데,
게시물 좋아요가 아닌 댓글 좋아요나, 답글, 게시물 사진 다중 포스팅 등
실제 인스타그램의 세부적인 기능들은 생각하지 않고 진행하였다.
테이블간 관계들
크게 회원 관련, 게시글 관련으로 테이블을 생각해볼 수 있었다.
회원 ~ 게시글 ==> 1:N
회원 ~ 팔로우 ==> N:M
회원 ~ 댓글 ==> 1:N
게시글 ~ 해시태그 ==> N:M
게시글 ~ 댓글 ==> 1:N
게시글 ~ 좋아요 ==> 1:N
최종적으로 그린 스키마
erd cloud를 이용했고,
팔로우의 개념이 아직 애매해서 조금 개선될 여지가 있는 것 같다.