# PK와 FK
## 미션
---
인스타그램을 참고하여, 사용자-사진-댓글 DB를 만드시오.

## 개념
---
#### 데이터간 관계를 만드려면
PK와 FK를 연결해야 한다. 여기서 PK(primary key)는 기본키 또는 대표키, FK(foreign key)는 외래키 또는 외부키로 불린다.

#### 기본키(PK)는
일종의 주민등록번호다. 보통 "id"로 명명된다.

주민등록 번호는 누구와도 겹치지 않는다. 이러한 성질을 유니크(unique)라 한다.

PK는 다음과 같이 선언할 수 있다.

Postgres가 아닌 다른 DBMS는 문법이 약간 다르다. 잘 모를땐? 구글링이 답이다.
- "Primary Key Generation for {DBMS}"
#### 외래키(FK)는
PK를 가리킴으로써 데이터간 관계를 연결한다.

FK는 다음과 같이 선언한다.

자세한 설명은 유튜브 영상을 통해 확인하자.

## 실습
---
#### 테이블 생성
```
-- 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;
```
## 훈련
---
#### 다음 테이블을 보고 질문에 답하시오.

- 댓글을 가장 많이 작성한 유저는?
- 사진을 게시한 유저는 모두 몇명?
- 3번 댓글이 달린 사진은?
- 5번 댓글이 달린 사진의 게시자는?