# PK와 FK
## 미션
---
인스타그램을 참고하여, 사용자-사진-댓글 DB를 만드시오.
![홍팍-SQL-입문-PK와-FK-미션](http://drive.google.com/thumbnail?export=view&sz=w960&id=1RvEkp52Nqh451FROH9RFGrJj27xzw7Dk)
## 개념
---
#### 데이터간 관계를 만드려면
PK와 FK를 연결해야 한다. 여기서 PK(primary key)는 기본키 또는 대표키, FK(foreign key)는 외래키 또는 외부키로 불린다.
![홍팍-SQL-입문-PK와-FK-기본키와-외래키](http://drive.google.com/thumbnail?export=view&sz=w960&id=1S6UhTOkD7K_sHGMrpZGVHdGekcnHBhiH)
#### 기본키(PK)는
일종의 주민등록번호다. 보통 "id"로 명명된다.
![홍팍-SQL-입문-유니크](http://drive.google.com/thumbnail?export=view&sz=w960&id=1SEMA-ktv6dWZVOqD-gqycNJBKbGzPN6a)
주민등록 번호는 누구와도 겹치지 않는다. 이러한 성질을 유니크(unique)라 한다.
![홍팍-SQL-입문-유니크](http://drive.google.com/thumbnail?export=view&sz=w960&id=1SBKCdv_COdxTewnM_OW-gpa9ayP0ES65)
PK는 다음과 같이 선언할 수 있다.
![홍팍-SQL-입문-기본키-생성-PK](http://drive.google.com/thumbnail?export=view&sz=w960&id=1SElZoOiNmwvK76zO-Ch1hr9_1sKuZqL4)
Postgres가 아닌 다른 DBMS는 문법이 약간 다르다. 잘 모를땐? 구글링이 답이다.
- "Primary Key Generation for {DBMS}"
#### 외래키(FK)는
PK를 가리킴으로써 데이터간 관계를 연결한다.
![홍팍-SQL-입문-외래키-PK](http://drive.google.com/thumbnail?export=view&sz=w960&id=1SGIZHSmhC8gH_A06HObF8YEYDE57YWqA)
FK는 다음과 같이 선언한다.
![홍팍-SQL-입문-외래키-FK-생성](http://drive.google.com/thumbnail?export=view&sz=w960&id=1SHM57OB9EfHj1ukZAhFb0diCFpLtfEM3)
자세한 설명은 유튜브 영상을 통해 확인하자.
![홍팍-SQL-입문-더이상-말이-필요-없다](http://drive.google.com/thumbnail?export=view&sz=w960&id=1Nu7x-xbjt3sGns83CSjDXCvQwLsK6V6B)
## 실습
---
#### 테이블 생성
```
-- users 테이블
CREATE TABLE users (
-- 컬럼명 -- 타입 -- 특성
id SERIAL PRIMARY KEY, -- PK 선언(SERIAL: 자동 생성 타입)
nickname VARCHAR(50),
email VARCHAR(100)
);
-- photos 테이블
CREATE TABLE photos (
id SERIAL PRIMARY KEY, -- PK
filename VARCHAR(255),
user_id INTEGER REFERENCES users(id) -- FK: 사진 게시자의 PK로 연결
);
-- comments 테이블
CREATE TABLE comments (
id SERIAL PRIMARY KEY, -- PK
body VARCHAR(1000),
user_id INTEGER REFERENCES users(id), -- FK: 댓글 작성자
photo_id INTEGER REFERENCES photos(id) -- FK: 댓글이 달린 사진
);
```
#### 레코드 등록
```
-- users 데이터 등록
INSERT INTO
users(nickname, email)
VALUES
('cloudstudying_kr', '
[email protected]'),
('hongpark_cs', '
[email protected]'),
('haesamq', '
[email protected]')
;
-- photos 데이터 등록 for user #1
INSERT INTO
photos(filename, user_id)
VALUES
-- 1번 유저의 사진 업로드
('cat-on-road.jpg', 1),
('sunset-over-the-ocean.jpg', 1),
('andromeda-galaxy.jpg', 1),
-- 2번 유저의 사진 업로드
('white-tiger.jpg', 2),
('nero-the-black-cat.jpg', 2)
;
-- comments 데이터 등록
INSERT INTO
comments(body, user_id, photo_id)
VALUES
-- 1번 사진의 댓글들
('meow', 1, 1), -- 유저#1
('nyaong', 2, 1), -- 유저#2
('냐옹', 3, 1), -- 유저#3
-- 2번 사진의 댓글들
('sunset', 1, 2), -- 유저#1
('falling slowly', 2, 2), -- 유저#2
-- 3번 사진의 댓글들
('Andromeda galaxy', 1, 3), -- 유저#1
('mysteriouse..!', 3, 3) -- 유저#3
;
```
#### 레코드 조회
```
-- users 조회
SELECT * FROM users;
-- photos 조회
SELECT * FROM photos;
-- comments 조회
SELECT * FROM comments;
```
## 훈련
---
#### 다음 테이블을 보고 질문에 답하시오.
![홍팍-SQL-입문-일대다-관계-인스타그램-문제](http://drive.google.com/thumbnail?export=view&sz=w960&id=1SH__aa_Av3bkPKueHahNlqeFRVsK7DIT)
- 댓글을 가장 많이 작성한 유저는?
- 사진을 게시한 유저는 모두 몇명?
- 3번 댓글이 달린 사진은?
- 5번 댓글이 달린 사진의 게시자는?