- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- LEVEL 1
- 코어 자바스크립트
- javascript
- 면접을 위한 cs 전공지식 노트
- typescript
- Refactoring
- react
- mongodb
- MariaDB
- 리팩터링 2판
- TIL
- 알고리즘
- 코딩테스트
- sql
- 아고라스테이츠
- 오늘도 개발자가 안된다고 말했다
- 배포
- Err-Handling
- TWIL
- CSS
- java
- 에러핸들링
- 프로그래머스
- LEVEL 2
- TMIL
- LEVEL1
- CRUD
- First Project
- Docker
- Git
성장에 목마른 코린이
데이터베이스 설계 (관계형 데이터베이스) 본문
데이터베이스 설계
관계형 데이터베이스 (Relational database)
구조화된 데이터는 하나의 테이블로 표현할 수 있습니다.
사전에 정의된 테이블을 relation이라고도 부르기 때문에
테이블을 사용하는 database를 Relational database라고 합니다.
관계형 데이터베이스에서 반드시 알고 있어야 하는 키워드!
- 데이터(data): 각 항목에 저장되는 값입니다.
- 테이블(table; 또는 relation) : 사전에 정의된 열의 데이터 타입대로 작성된 데이터가 행으로 축적됩니다.
- 칼럼(column; 또는 field) : 테이블의 한 열을 가리킵니다.
- 레코드(record; 또는 tuple) : 테이블의 한 행에 저장된 데이터입니다.
- 키(key) : 테이블의 각 레코드를 구분할 수 있는 값입니다. 각 레코드마다 고유한 값을 가집니다. 기본키(primary key)와 외래키(foreign key) 등이 있습니다.
테이블과 테이블 사이의 관계 종류
- 1:1 관계
- 1:N 관계
- N:N 관계
테이블 스스로 관계를 가질 수도 있습니다
- self referencing 관계
1:1 관계
하나의 레코드가 다른 테이블의 레코드 한 개와 연결된 경우입니다.
User 테이블과 Phonebook 테이블이 있다고 가정하겠습니다
User 테이블은 user_id, name, phone_id를 가지고 있습니다.
이 중 phone_id는 외래키(foreign key)로써, Phonebook 테이블의 phone_id와 연결되어 있습니다.
Phonebook 테이블은 phone_id와 phone_number를 가지고 있습니다.
각 전화번호가 한 명의 유저와 연결되어 있고, 그 반대도 동일하다면,
User 테이블과 Phonebook 테이블은 1:1 관계(One-to-one relationship)입니다.
그러나 1:1 관계는 자주 사용하지 않습니다.
1:1로 나타낼 수 있는 관계라면 User 테이블에 phone_id를 대신 phone_number를 직접 저장하는 게 나을 수 있습니다.
1:N 관계
하나의 레코드가 서로 다른 여러 개의 레코드와 연결된 경우입니다.
User 테이블과 Phonebook 테이블의 관계를 다음과 같이 가정하겠습니다.
이 구조에서는 한 명의 유저가 여러 전화번호를 가질 수 있습니다. 그러나 여러 명의 유저가 하나의 전화번호를 가질 수는 없습니다. 이런 1:N 관계는 관계형 데이터베이스에서 가장 많이 사용합니다.
N:N 관계
여러 개의 레코드가 다른 테이블의 여러 개의 레코드와 관계가 있는 경우입니다.
N:N(다대다) 관계를 위해 스키마를 디자인할 때에는, Join 테이블을 만들어 관리합니다.
1:N(일대다) 관계와 비슷하지만, 양방향에서 다수의 레코드를 가질 수 있습니다.
다음과 같이 여행 상품을 관리하는 테이블이 있다고 가정하겠습니다. 여러 개의 여행 상품이 있고, 여러 명의 고객이 있습니다. 고객 한 명은 여러 개의 여행 상품을 구매할 수 있고, 여행 상품 하나는 여러 명의 고객이 구매할 수 있습니다.
이렇게 Customer 테이블과 Package table이 따로 존재한다면, N:N(다대다) 관계는 두 개의 일대다 관계와 그 모양이 같습니다. 두 개의 테이블과 1:N(일대다) 관계를 형성하는 새로운 테이블로 N:N(다대다) 관계를 나타낼 수 있습니다.
이렇게 다대다 관계를 위한 테이블을 조인 테이블이라고 합니다. N:N(다대다) 관계를 그림으로 나타내면 다음과 같습니다.
customer_package 테이블에서는 고객 한 명이 여러 개의 여행 상품을 가질 수 있고, 여행 상품 하나를 여러 명의 고객이 가질 수 있습니다.
customer_package 테이블은 customer_id와 package_id를 묶어주는 역할입니다. 이 테이블을 통해 어떤 고객이 몇 개의 여행 상품을 구매했는지 또는, 어떤 여행 상품이 몇 명의 고객을 가지고 있는지 등을 확인할 수 있습니다.
이렇게 조인 테이블을 생성하더라도, 조인 테이블을 위한 기본키(여기서는 cp_id)는 반드시 있어야 합니다.
자기참조 관계(Self Referencing Relationship)
때로는 테이블 내에서도 관계가 필요합니다. 예를 들어 추천인이 누구인지 파악하기 위해 사용할 수 있습니다.
다음과 같이 유저 테이블이 있습니다.
user_id는 기본 키(primary key), name은 사용자의 이름, 그리고 recommend_id는 추천인 아이디입니다.
User 테이블의 recommend_id는 User 테이블의 user_id와 연결되어 있습니다.
한 명의 유저(user_id)는 한 명의 추천인(recommend_id)를 가질 수 있습니다.
그러나 여러 명이 한 명의 유저를 추천인으로 등록할 수 있습니다.
이 관계는 1:N(일대다) 관계와 유사하다고 생각할 수 있습니다.
그러나 일반적으로 일대다 관계는 서로 다른 테이블의 관계를 나타낼 때 표현하는 방법입니다.
'CodeStates > Section 3 (백엔드)' 카테고리의 다른 글
MongoDB CRUD - Create (0) | 2022.04.17 |
---|---|
Atlas Cluster 생성하기 (0) | 2022.04.17 |
ACID (Atomicity, Consistency, Isolation, Durability) (0) | 2022.04.07 |
(Advanced) Algorithm with Math - 멱집합 (0) | 2022.04.06 |
Algorithm with Math - GCD, LCM (최대 공약수, 최소 공배수) (0) | 2022.04.06 |