6장. 관계 만들기
- 데이터베이스 내에는 여러 개의 테이블이 존재합니다.
- 이 테이블들은 서로 관계를 맺으며 하나의 데이터베이스를 구성합니다.
- 이 글에선 테이블끼리 관계를 맺는 방법에 대해 알아보겠습니다.
📗 관계의 개념
📌 관계란?
- 관계(relationship)란 여러 테이블에 분산 저장된 데이터가 서로 어떻게 연결되어있는지를 정의하는 개념입니다.
- 테이블이 서로 관련 있는 데이터를 묶은 것이라면, 관계는 여러 테이블에 흩어져있는 데이터 간 연결고리를 맺어주는 것을 의미합니다.
- 관계는 1:1관계, 1:N관계(일대다), M:N(다대다)관계가 있습니다.
📌 1:1(일대일) 관계
- 일대일 관계(1:1)는 하나의 데이터가 하나의 데이터와만 연결된 관계입니다.
- A테이블의 한 튜플이 B 테이블의 특정 튜플과 1:1로 매칭될 때 일대일 관계라고 합니다.
- SNS를 예시로 들면 하나의 사용자는 하나의 개인 설정과 연결되어있는 것도 일대일 관계라고 할 수 있습니다.
📌 1:N(일대다) 관계
- 일대다 관계(1:N)는 부모-자식 관계처럼 하나의 데이터가 여러 데이터와 연결된(포함 또는 소유) 관계입니다.
- A테이블의 한 튜플이 B테이블의 여러 튜플과 연결된다면 이는 일대다 관계입니다.(B테이블의 경우는 다대일(N:1) 관계)
- SNS를 예시로 들면 SNS에 사진을 올리면 댓글이 여러개 담깁니다.
- 이는 하나의 사진에 여러 댓글이 달리는 것이므로 사진과 댓글은 일대다 관계라고 할 수 있습니다.
📌 M:N(다대다) 관계
- 다대다 관계(M:N)는 여러 데이터가 여러 데이터와 연결된 관계를 말합니다.
- 예를 들어 한 학생이 여러 과목을 수강하고, 한 과목은 여러 학생을 수용하는 것과 같은 관계입니다.
- SNS를 예시르 들면 사용자와 사진은 좋아요라는 연결고리를 통한 다대다 관계라고 볼 수 있습니다.
- 한 명의 사용자가 여러 사진에 좋아요를 누를 수 있고, 반대로 하나의 사진은 여러 사용자로부터 좋아요를 받을 수 있기 때문입니다.
- 다대다 관계를 구현하기 위해선 연결고리 역할을 하는 중간 테이블이 필요합니다.
- SNS의 예에선 좋아요가 중간 테이블이라 할 수 있습니다.
- 사용자와 좋아요는 1:N 관계(일대다) 관계로 맺어지고, 좋아요와 사진은 N:1 관계(다대일) 관계로 맺어져 서로를 사용자와 사진을 간접적으로 연결지어주기 때문입니다.
- 결과적으로 사용자와 좋아요는 M:N 관계(다대다)가 됩니다.
📗 관계를 만드는 키
📌 기본키(Primary Key)
- 기본키란 테이블 내에서 튜플들을 구분할 수 있는 칼럼 또는 칼럼의 조합입니다.
- 간단히 PK라고도 불립니다.
- 기본키는 튜플의 주민등록번호라고 이해하면 편합니다.
- 동일한 이름(칼럼값)을 가진 튜플들도 주민등록번호(PK)를 통해 구분할 수 있는 것과 같습니다.
- 이 처럼 모든 튜플을 구분하는 데 사용하는 칼럼 또는 칼럼의 조합을 기본키라고 합니다.
- 기본키는 다음과 같은 4가지 특징을 만족해야 합니다.
📖 기본키의 4가지 특징
- 유일성
- 기본키 값은 테이블 내에서 유일한 값을 가져야 함
- 비 널(non-nullable)
- 기본키 값은 NULL값이 되어선 안되고, 반드시 값이 지정되어야 합니다.
- 불변성
- 기본키 값은 한 번 설정되면 변경할 수 없습니다.
- 식별성
- 기본키 값은 각 튜플을 구분하는 명확한 기준 역할을 해야 합니다.
📌 외래키(Forign Key)
- 외래키란 다른 테이블의 기본키를 가리키는 칼럼입니다.
- 간단히 FK라고 합니다.
- 외래키는 두 테이블을 연결하는 역할을 합니다.
- 연결시킬 테이블의 PK칼럼값을 연결받을 테이블의 FK칼럼값으로 설정해 PK키와 일치하는 FK키값을 가진 튜플들을 서로 연결지을 수 있습니다.
- 외래키는 기본키와 다르게 NULL을 허용합니다.
- 외래키가 NULL값이면 연결된 대상이 없음을 뜻합니다.
- 외래키를 통해 다른 테이블과 관계를 맺는 방법은 일대일, 일대다, 다대다 관계에 따라 다릅니다.
- 자세한 내용은 뒤에 나올 다양한 관계 만들기에서 이어 설명하겠습니다.
- 외래키를 설정하는 방법은 다음과 같습니다.
CREATE TABLE 테이블명(
칼럼명1 자료형1,
칼럼명2 자료형2,
.
.
FOREIGN KEY(칼럼명) REFERENCES 연결대상_테이블(연결대상_테이블의_기본키)
)
- 다음과 같이 FOREGIN KEY와 REFERENCES를 통해 관계를 맺을 테이블의 기본키를 함께 입력해주면 외래키가 만들어집니다.

📌 제약 조건
- 외래키로 관계를 만들기 전에 짚고 넘어가야 하는 것이 있습니다.
- 바로 칼럼을 선언할 때 설정할 수 있는 제약 조건에 관한 것입니다.
- 제약 조건은 칼럼에 저장할 수 있는 값에 대한 어떤 제한이나 규칙을 말합니다.
제약 조건
- AUTO_INCREMENT
- 칼럼의 값을 자동으로 1씩 증가시킴
- 정수형 칼럼에 붙일 수 있으며 주로 기본키(PK)와 함께 사용됨
- UNIQUE
- 칼럼의 값을 고유한 값만 허용
- NOT NULL
- 칼럼에 NULL값을 허용하지 않게 함
- DEFAULT
- 칼럼에 기본값을 지정
- 해당 칼럼에 입력값이 주어지지 않으면 기본값이 할당됨
- CHECK
- 칼럼의 값이 특정 조건을 만족하도록 조건을 지정함
- 조건을 만족하지 않는 값이 입력되면 에러 발생
- UNSIGNED
- 숫자형 칼럼에서 음수를 허용하지 않고 양수값만 저장하도록 제한
- 제약조건은 테이블의 값을 지정하는 과정에서 모든 칼럼들에 적용할 수 있는데 이 제약조건을 통해 외래키 등의 관계형 칼럼을 더 자세하게 설정할 수 있습니다.
📗 다양한 관계 만들기
📌 일대일 관계 만들기
- 국가(countries)테이블과 수도(capitals) 테이블 만들어서 서로 일대일 관계로 연결하기

- 테이블에 값 넣기

📌 일대다 관계 만들기
- teams 테이블에 소속된 players 선수 테이블



📌 다대다 관계 만들기
- 진료 테이블을 연결 고리로 의사 테이블과 환자 테이블의 다대다 관계 만들기

- 데이터 삽입하기




📖 관계 만들기 실습 : 별그램 DM
📌 별그램 DB 개요
- users 테이블
- 사용자의 아이디, 닉네임, 이메일 저장
- photos 테이블
- 사진의 아이디, 파일명, 게시자 아이디 저장
- comments 테이블
- 댓글의 아이디, 본문, 작성자 아이디, 댓글이 달린 사진 아이디 저장
- settings 테이블
- 사용자 개인 설정의 아이디, 계정 공개 여부, 계정 추천 여부, 사용자 아이디 저장
- likes 테이블
- 좋아요의 아이디, 좋아요를 누른 사용자 아이디, 좋아요를 받은 사진 아이디 저장
-
DB 생성

-
users 테이블 만들기

-
photos 테이블 만들기

-
comments 테이블 만들기

-
settings 테이블 만들기

- 이제 보니 primary key로 설정된 id값들은 AUTO_INCREMENT를 넣어서 자동으로 값을 매기는 방식을 사용하는게 더 좋네요 😅
- likes 테이블 만들기

- 또 AUTO_INCREMENT 넣는거 깜빡해서 ALTER TABLE 사용해서 수정했습니다.