자 지난 시간까지 제1,2 정규형을 알아보았습니다.
오늘은 하… 기훈이형!!!
말고 3정규형을 알아보겠습니다.
제3정규형(3rd Normal Form)
제 2정규형을 만족하는 테이블에서 primary key 또는 composite primary key 컬럼에 종속되는 것이 아닌 하찮은(무도 박명수) 잔챙이 컬럼에 종속된 컬럼을 다른 테이블로 뺀다면 그것이 제3정규형입니다.
[체육센터 테이블]
프로그램 | 가격 | 강사 | 출신대학 |
스쿼시 | 5000 | 팜하니 | 서울대 |
축구 | 4000 | 손흥민 | 서울대 |
헬스 | 7000 | 덱스 | 연세대 |
헬창과정 | 8000 | 덱스 | 고려대 |
탁구 | 3000 | 팜하니 | 연세대 |
⬆️ 대충 제2정규화를 만든 테이블입니다.
이 테이블은 2정규형을 만족하기 때문에 partial dependency는 없습니다.
하지만 ‘출신대학’이라는 컬럼을 봅시다.
‘프로그램’이라는 primary eky와는 전혀 상관이 없고 오로지 ‘강사’와 관련이 있습니다.(이걸 ’강사’컬럼에 종속되었다고 합니다.)
이 경우 ‘출신대학’ 컬럼을 따로 빼 테이블을 만든다면 제 3정규형을 만족하는 테이블입니다.
[체육센터 테이블]
프로그램 | 가격 | 강사 |
스쿼시 | 5000 | 팜하니 |
축구 | 4000 | 손흥민 |
헬스 | 7000 | 덱스 |
헬창과정 | 8000 | 덱스 |
탁구 | 3000 | 팜하니 |
[강사정보 테이블]
강사 | 출신대학 |
팜하니 | 서울대 |
손흥민 | 연세대 |
덱스 | 고려대 |
⬆️ 강사 정보 테이블을 따로 빼놓았습니다.
이러면 이제 손흥민이 갑자기 서울대로 편입을 한다?해도 한 테이블안에서만 수정하면 됩니다.
그래서 결국 제 3정규형까지 마친다면 수정 작업이 간-편 해집니다.
제 3정규형 심화버전🤯
여러분은 좀 치는 사람이기때문에 정확한 정의를 알려드리자면 제 2정규형에서 transitive dependency도 제거해버린다면 그게 제 3정규형입니다.
transitive dependency는
- composite primary key 또는 primary key 역할을 하는 칼럼이 있고
- 거기에 직접 종속된 컬럼 A가 있고
- 또 거기에 직접 종속된 하찮은 컬럼B가 있다면
‘컬럼B가 primary key 컬럼에 transitive dependency가 있다’라고 표현합니다.
그래서 그 컬럼B를 바깥 다른 테이블로 따로 빼주라는 소립니다.
그러면 제 3정규형이 완성 됩니다.
3정규형까지만 알아도 현업에서는 지장이 거의 없기때문에 나머지 4, 5, 6정규형은 정처기 때 뵙도록 하겠습니다.(어차피 정처기딸라면 다 알아야함)
primary key, foreign key 항상 넣으면 좋음
정규화를 하며 테이블을 쪼갤 때가 많습니다. 그때 주의점은
- 테이블마다 항상 primary key 역할을 주입해주는 것이 좋습니다.(id컬럼 이런 것들 말입니다.)
- 다른 테이블에 있는 컬럼 내용을 가져다쓸때도 pk를 사용하는 것이 좋습니다.
[체육센터 테이블]
프로그램 | 가격 | 강사 |
스쿼시 | 5000 | 팜하니 |
축구 | 4000 | 손흥민 |
헬스 | 7000 | 덱스 |
헬창과정 | 8000 | 덱스 |
탁구 | 3000 | 팜하니 |
[강사정보 테이블]
강사 | 출신대학 |
팜하니 | 서울대 |
손흥민 | 연세대 |
덱스 | 고려대 |
⬆️ 예를 들어 아까 제 3정규화할때 테이블을 따로 쪼갰다고 칩시다.
사람은 고쳐쓰는 게 아니지만 테이블은 고쳐쓴다고 이 테이블을 쓸만하게 고쳐써본다면
[체육센터 테이블]
id | 프로그램 | 가격 | 강사 |
1 | 스쿼시 | 5000 | 팜하니 |
2 | 축구 | 4000 | 손흥민 |
3 | 헬스 | 7000 | 덱스 |
4 | 헬창과정 | 8000 | 덱스 |
5 | 탁구 | 3000 | 팜하니 |
[강사정보 테이블]
id | 강사 | 출신대학 |
1 | 팜하니 | 서울대 |
2 | 손흥민 | 연세대 |
3 | 덱스 | 고려대 |
챠 - 란🐣
1. 테이블마다 primary key 역할이 있는 컬럼을 하나 만드는 것이 좋습니다.
??? : 님아 이미 composite primary key가 있는데여?
A : 그것도 써도 되지만 나중에 쿼리짤때 select로 원하는 행만 찾을때 간편합니다.
[체육센터 테이블]
id | 프로그램 | 가격 | 강사 | 강사id |
1 | 스쿼시 | 5000 | 팜하니 | 1 |
2 | 축구 | 4000 | 손흥민 | 2 |
3 | 헬스 | 7000 | 덱스 | 3 |
4 | 헬창과정 | 8000 | 덱스 | 3 |
5 | 탁구 | 3000 | 팜하니 | 1 |
[강사정보 테이블]
id | 강사 | 출신대학 |
1 | 팜하니 | 서울대 |
2 | 손흥민 | 연세대 |
3 | 덱스 | 고려대 |
2. 다른 테이블에 있는 내용을 카카시 할때도 primary key를 사용하는 것이 좋습니다.
지금 체육센터 테이블에는 기존 강사 이름으로 들어가있자나여 근데 그것보다는 강사 id(pk)를 두는 것이 좋습니다. 왜냐하믄 나중에 동명이인이 생겨도 명확히 구분할 수 있잖습니까!?!?
Foreign key 등록하는 법
실제 컬럼에다가 ‘열어분@@@@@ 이컬럼은 foreign key에여!!!!!’라고 등록할 수 있습니다.
그럼 장점이 몇개 있어서 하는 법 한번 보시겠습니다.
일단 두 테이블 만들겠습니다.
CREATE TABLE program (
id INT PRIMARY KEY,
프로그램 VARCHAR(100),
가격 INT,
강사id INT
);
CREATE TABLE teacher (
id INT PRIMARY KEY,
강사 VARCHAR(100),
출신대학 VARCHAR(100)
);
DBeaver 에서 foreign key 등록할라면
- 테이블마다 foreign keys 메뉴가 있습니다.
거기서 원하는 테이블에다가 ‘새로운 foregin key 만들기’ 클릭클릭
2. reference table 메뉴에서 현재 테이블에서 어떤 다른 테이블의 primary key를 참조할건지 선택하면 됩니다.
column 메뉴에는 foreign key 제약 달아줄 program 테이블의 컬럼을 선택하고 ref column은 참조를 당하는 teacher 테이블의 컬럼을 선택하고 저장하면 끝입니다. 쉽죠잉?
3. program 테이블 보면 먼가 변해있습니다.foreign key 컬럼에 화살표가 생기는데 눌러보면 연결된 다른 테이블과 행을 보여줍니다. 그래서 강사
그래서 이 화살표를 누르면 연결된 다른 테이블과 행을 보여줍니다. 그래서 강사1이 누기야! 이러면 클릭하면 바로 볼 수 있는 것이죠.
foreign key 를 등록해두면 저런게 편리해진다는 것이죠.
다른 장점도 있는데 만약 데이터를 삭제하려고 한다면 에러가 나며 삭제를 막아줍니다. 왜냐면 ‘다른 테이블에서 foreign key로 사용중인 데이터이기 때문에 함부로 삭제하지 마라’는 뜻입니다. 이런 실수를 방지할라고 foreign key를 만드는 것임요.
하지만 삭제 하나하나 할때마다 귀찮아지고 나중에 다른 테이블 구조 변경도 귀찮아져서 fk 를 아예 안하는 곳들도 있습니다. 입맛대로.
쿼리로 foreign key 등록하려면
CREATE TABLE 테이블명 (
id INT PRIMARY KEY,
프로그램 VARCHAR(100),
강사id INT REFERENCES 다른테이블(다른테이블컬럼)
)
컬럼 만들 때 앞에 REFERENCES 다른테이블(다른테이블컬럼명) 잘 입력해주면 됩니다…
CREATE TABLE 테이블명 (
id INT,
프로그램 VARCHAR(100),
강사id INT,
CONSTRAINT 제약조건작명 PRIMARY KEY (id),
CONSTRAINT 제약조건작명2 FOREIGN KEY (강사id) REFERENCES 다른테이블(다른테이블컬럼),
)
아니면 가장 하단에 CONSTRAINT 문법 써도 됩니다…
만약에 이미 생성했는데 fk 부여하고 싶다? 그러면
ALTER TABLE 테이블명 ADD
CONSTRAINT 제약조건작명 FOREIGN KEY (강사id) REFERENCES teacher(id)
ALTER TABLE 테이블명 ADD 입력하고 뒤에 CONSTRAINT 문법 쓰면 됩니ㄷ ㅏ.
'DI(Digital Innovation) > DataBase & SQL 뽀개기' 카테고리의 다른 글
JOIN 하는게 쉬워보이면 그 분은 이미 전문가 (1) | 2024.03.07 |
---|---|
국나뇽이 말아주는 엔티티관계도(ERD) (3) | 2024.03.07 |
2NF 완벽 이해 MASTER (0) | 2024.02.23 |
DB 1, 2 정규형 (1) | 2024.02.23 |
컬럼에 안전하게 제약 (Constraints) 주기 (0) | 2024.02.21 |