
- One-To-Many: 일대다 관계, Has Many 관계 (ex. 학교 - 학생들)
- Many-To-One: 다대일 관계, Has One 관계 (ex. 직원들 - 회사)
- One-To-One: 일대일 관계 (ex. CEO - 회사)
- Many-To-Many: 다대다 관계, (ex. 과제들 - 학생들)
PK : 테이블에서 하나의 행을 인식할 수 있게 하는 unique 한 속성 값
PK 규칙
1. 대부분 id 라고 불린다.
2. PK의 값은 보통 정수나 UUID 값을 가진다.
3. 절대 변하지 않는다
4. 같은 테이블에서 다른 열이 이 값을 가질 수 없다(한 행에서 중복 금지)
FK : 관계가 있는 다른 테이블의 PK 값을 가지고 있는 속성 값
🎯FK는 항상 많은 쪽의 테이블에 넣어야한다!
FK 규칙
1. 한 테이블에 여러 열이 FK를 가질 수 있다
2. 이름은 달라질 수 있고, 각 회사의 관례에 따라 다르다
3. PK와 정확히 같아야 한다.
4. 관계가 바뀌면 바뀔 수 있다.
일대다 관계 테이블(유저 - 사진들)
CREATE TABLE users (
id SERIAL PRIMARY KEY, // 주 키 표시
username VARCHAR(50)
);
CREATE TABLE photos (
id SERIAL PRIMARY KEY,
url VARCHAR(200),
user_id INTEGER REFERENCES users(id) // FK, REFERENCES로 참조하는 컬럼 입력
);
FK INSERT 제약사항
photos 테이블의 FK인 user_id에 존재하지 않는 user id의 값을 준다면?
-> Error!
그러면 FK에 어느 유저도 매핑되지 않는 값을 주려면?🤔
-> NULL 값을 줘야한다
DELETE 제약
만약 photos의 user_id의 값이 참조하고 있는 user를 DELETE 하면?
-> Error!
그럼 이 제약을 Handling 하는 방법에는 어떤 것이 있을까?🤔
1. ON DELETE CASCADE : User를 삭제하면 참조하는 FK를 들고있는 컬럼들도 함께 삭제
2. ON DELETE SET NULL : User를 삭제하면 참조하는 FK를 들고있는 컬럼들은 NULL로 설정됨
3. ON DELETE SET DEFAULT: User를 삭제하면 참조하는 FK를 들고있는 컬럼들은 설정한 Default 값으로 설정됨
CREATE TABLE photos (
id SERIAL PRIMARY KEY,
url VARCHAR(200),
user_id INTEGER REFERENCES users(id) ON DELETE CASCADE
);
CREATE TABLE photos (
id SERIAL PRIMARY KEY,
url VARCHAR(200),
user_id INTEGER REFERENCES users(id) ON DELETE SET NULL
);