FK
FK는 한 테이블의 컬럼이 다른 테이블의 PK를 참조할 때 사용된다.
FK는 무조건 상대 테이블의 PK를 받아와야 한다.
ex1)대학교 테이블이 있다.
해당 테이블에는 학번 / 이름 / 과 / 동아리 / 전공의 내용이 있다.
이때, 축구부의 인원이 너무 많아져서 세분화시키기로 했다고 가정한다.
: 축구부 / 축구관람부로 나뉨.
그랬더니 야구부에서도 우리도 야구부가 아니라 야구관람부다 >> 동아리명 변경 필요하다 요청함
대학교 테이블의 동아리 컬럼에서 데이터 항목을 하나하나 변경하기에는 매우 비효율적이다.
이러한 경우, 별도의 동아리 테이블을 만들어준다.
이렇게 만든 테이블의 PK값(동아리 번호)을 대학교 테이블의 FK 값으로 지정하여 데이터를 관리할 수 있다.
이런 식으로 대학교 테이블의 동아리 컬럼에
동아리 테이블에서 받아온 FK 값으로 데이터를 관리하며,
만약 동아리 이름을 변경하더라도 동아리 테이블의 동아리명만 바꿔주면 된다.
이렇게 데이터 관리의 편의성을 증진시키기 위해 테이블을 분리하는 것을 정규화라고 한다!
→ 이렇게 정규화하여 사용하는 것은 변경사항이 생겼을 때 한 곳만 변경 가능하기 때문에 응집도를 높이고, 결합도를 낮추며, 유지보수 용이하다는 결론을 얻을 수 있다!
- 하나의 테이블에 데이터가 너무 많아지면 데이터 정규화를 할 필요가 있다.
- 이유는? 데이터 관리가 용이해지기 때문!
ex2) 쇼핑몰 회원 테이블을 만든다.
이 테이블을 보면 회원등급 컬럼의 실버 값이 2개로 중복임을 확인할 수 있다.
여기서 회원등급칸을 지워놓고 봤을 때, 총 구매금액만 보고도 회원의 등급을 알 수 있다.
특정 컬럼이 존재하지 않아도 그 컬럼 값을 예상할 수 있을 때 "데이터 중복"이 발생했다고 본다.
DBMS에서 가장 중요하게 생각하는 1원칙은?
- 데이터 중복은 DB내에 없어야 한다는 것!
- 바이트 수가 많아질수록 용량이 커질 수밖에 없다.
- 따라서 데이터 중복을 피해야 하는데, 중복을 피하기 위해선 "정규화"를 실행한다. == 테이블 분리
🍀 주요 내용!
Q1) 데이터 정규화란?
- 데이터 중복을 피하기 위해 테이블을 분리하는 것이다.
Q2) DB 설계할 때 가장 중요하게 생각해야 할 점은?
- 데이터 중복 발생을 예방하는 것
- 따라서 정규화를 다양하게 진행해야 하는 점
Q3) 코딩테스트 하는 경우
- 테이블 정규화
- JOIN 문법의 사용
- 가끔 서브쿼리
Q4) FK가 왜 상대 테이블의 PK여야 하나요?
- NAME과 같은 데이터로 사용하면, 같은 이름을 가진 사용자를 구분할 수 없기 때문.
- 즉, PK가 아닌 컬럼으로 설정하면 UNIQUE 하지 않아서 구분할 수 없기 때문이다. (단순 중복이 아닌 걸로는 구분 X)
ex) 010-1234-4567 >> 핸드폰 번호로 국민들을 식별한다고 가정했을 때,
유일하지만 변경될 수 없는 값이므로 해당 데이터는 PK로 사용할 수 없다.
정리!
관리의 편의성을 증진시키기 위해, 응집도를 높이고 결합도를 낮추는 테이블 분리(==정규화)를 할 수 있다.
정규화는 테이블 중복을 막을 수 있다.
테이블이 정규화되어서 분리되어 있는데 어떻게 불러오나요?
>> SQL 문법을 통해 JOIN으로 불러올 수 있다.
*FK 제약조건
1) 원본 데이터가 사라질 때, 연결 데이터도 함께 사라지는 방법
ex) 댓글 테이블이 있고, 사용자가 회원탈퇴를 진행하면?
>> 사용자가 입력했던 댓글들이 모두 삭제가 된다.
2) 원본 데이터가 사라질 때, 연결 데이터가 유지되는 방법
ex) 대학생 테이블이 있고, 학생 1이 동아리로 농구부를 가입함
>> 농구부가 사라진다고 함 >> 동아리가 사라진다고 학생이 아닌 것이 아님.
제약조건을 걸어두면 부모관계가 됨. (java에서는 상속!)
▼사용방법
CREATE TABLE A(
NUM INT PRIMARY KEY,
NAME VARCHAR(50) NOT NULL,
SCORE INT
); --대학교, 부모 테이블
CREATE TABLE B(
NUM INT PRIMARY KEY,
NAME VARCHAR(50) NOT NULL,
AAA INT NOT NULL -- FK == 상대 테이블인 A 테이블의 PK값인 NUM을 받아와야만함
); --동아리, 자식 테이블
-- FK 제약조건 추가하기
-- 1) 원본 데이터가 사라질때, 연결 데이터도 함께 사라지는 방법
ALTER TABLE B
ADD CONSTRAINT FK_AAA
FOREIGN KEY (AAA)
REFERENCES A(NUM)
ON DELETE CASCADE;
-- 2) 원본 데이터가 사라질때, 연결 데이터는 유지되는 방법
ALTER TABLE B
ADD CONSTRAINT FK_AAA
FOREIGN KEY (AAA)
REFERENCES A(NUM)
ON DELETE SET NULL; -- CASCADE
-- 회원탈퇴를 하면, 댓글 작성자가 '알수없음'으로 변경
SET NULL O >> 해당 컬럼이 NOT NULL이면 안됨
SET '값' O >>> 해당 컬럼이 NOT NULL일때 사용
위의 예제에서는..
A 테이블의 PK값인 NUM을 B 테이블의 FK로 사용하려고 한다.
FK를 사용하기 위해서는, 단순히 선언만 해주어서는 알 수 없다.
따라서 FK 제약조건을 추가해줘야 한다.
이때 ALTER를 사용하여 FK 제약조건을 추가한다.
▼코드를 한 줄씩 풀이해 보자!
-- 1) 원본 데이터가 사라질때, 연결 데이터도 함께 사라지는 방법
ALTER TABLE B -- 테이블 B 변경할건데
ADD CONSTRAINT FK_AAA --FK제약조건 추가할거야, 그 제약조건 이름이 FK_AAA
FOREIGN KEY (AAA) -- AAA가 외부키인데
REFERENCES A(NUM) -- A테이블의 PK (NUM)에 의존하고 있어
ON DELETE CASCADE; -- 삭제하면, 같이 지워줘
-- 2) 원본 데이터가 사라질때, 연결 데이터는 유지되는 방법
ALTER TABLE B -- 테이블 B 변경할건데
ADD CONSTRAINT FK_AAA --FK제약조건 추가할거야, 그 제약조건 이름이 FK_AAA
FOREIGN KEY (AAA) -- AAA가 외부키인데
REFERENCES A(NUM) -- A테이블의 PK (NUM)에 의존하고 있어
ON DELETE SET NULL; -- CASCADE, 부모 테이블의 PK 데이터가 사라지면 AAA 값을 NULL로 설정
FK 제약조건 두 가지 방식 중,
요구조건에 맞는 방식을 선택하여 사용해야 한다!
'SQL > SQL' 카테고리의 다른 글
[SQL] NOT NULL 제약조건과 FK제약조건 (0) | 2024.09.29 |
---|---|
[SQL] JOIN (0) | 2024.08.12 |
[Oracle] SQL문의 기초 (0) | 2024.08.05 |
[Oracle] 오라클 초기 설정 (0) | 2024.08.01 |
[SQLD] 모델링 / 스키마 / ERD (0) | 2024.07.25 |