일대일로 연결된 것
ex) 하나의 나라는 하나의 수도를 갖고, 하나의 수도는 하나의 수도를 가짐
📌 범위가 더 작거나 사용빈도가 더 적은 쪽에 FK를 줌!
다대다 관계는 두 데이터 연결이 다수와 다수로 이어지는 것
ex) 여러 고객은 다양한 상품을 주문할 수 있고, 다양한 상품도 다양한 고객에게 주문될 수 있음
📌 이러한 다대다 관계는 실제 구현시 중간 테이블을 놓고 여기에 FK를 둬서 양측을 연결
ex) 인스타그램으로 보면 좋아요가 중간 테이블 되고 그 양측으로 사용자와 사진이 됨
일대일 테이블이니 UNIQUE 넣어서 해당 컬럼에 중복 값이 저장되지 않도록 제한
-- settings 테이블 생성
CREATE TABLE settings(
id SERIAL PRIMARY KEY, -- PK
private BOOLEAN,
adding_photos VARCHAR(15),
user_id INTEGER UNIQUE REFERENCES users(id)-- FK: 개인 설정 유저(1:1)
);
INSERT INTO
settings(private, adding_photos, user_id)
VALUES
(FALSE, 'MANUAL', 1), -- 유저#1
(FALSE, 'AUTO', 2), -- 유저#1
(TRUE, 'AUTO', 3) -- 유저#1
;
🔫 여기서 user_id에 값이 있는 값을 넣을 시 에러가 난다!!
-- likes 테이블 생성(사용자와 사진을 다대다 연결)
CREATE TABLE likes (
id SERIAL PRIMARY KEY, -- PK
user_id INTEGER REFERENCES users(id), -- FK: 좋아요를 누른 사람(1:N 연결)
photo_id INTEGER REFERENCES photos(id) -- FK: 좋아요된 사진(1:N 연결)
);
-- likes 레코드 생성
INSERT INTO
likes(user_id, photo_id)
VALUES
-- 사진#1에 달린 좋아요
(1, 1), -- 유저#1
(2, 1), -- 유저#2
-- 사진#2에 달린 좋아요
(1, 2), -- 유저#1
(2, 2), -- 유저#2
(3, 2), -- 유저#3
-- 사진#3에 달린 좋아요
(1, 3), -- 유저#1
(3, 3) -- 유저#3
;