티스토리 뷰
제 1,2 정규형 정리 (1NF, 2NF) [partial dependency, composite primary key]
svdjcuwg4638 2023. 5. 11. 20:20제1정규형 (1st normal form)
[수강등록현황 table]
회원번호 | 회원이름 | 프로그램 |
101 | 강호동 | 스쿼시초급 |
102 | 손흥민 | 헬스 |
103 | 김민수 | 헬스 |
위 테이블에서 프로그램에 데이터를 추가할려면 어떻게 해야할까?
[수강등록현황 table]
회원번호 | 회원이름 | 프로그램 |
101 | 강호동 | 스쿼시초급 |
102 | 손흥민 | 헬스 |
103 | 김민수 | 헬스, 골프초급 |
위처럼 처리해도 되지만 프로그램이 많다는 가정하에 보기도 어려울 뿐더러 효율성에서도 굉장히 떨어지게된다.
[수강등록현황 table]
회원번호 | 회원이름 | 프로그램 |
101 | 강호동 | 스쿼시초급 |
102 | 손흥민 | 헬스 |
103 | 김민수 | 헬스 |
103 | 김민수 | 골프초급 |
위처럼 하나의 컬럼에는 하나의 데이터만 들어가게 하는것을 1 정규화라고 칭하고 효율성이 제일 좋다
제2정규형 (2nd normal form)
[수강등록현황 table]
회원번호 | 회원이름 | 프로그램 | 가격 | 납부여부 |
101 | 강호동 | 스쿼시초급 | 5000 | 0 |
102 | 손흥민 | 헬스 | 6000 | 1 |
103 | 김민수 | 헬스 | 6000 | 1 |
103 | 김민수 | 골프초급 | 8000 | 0 |
위와 같은 테이블에서 헬스의 가격이 7천원으로 수정이 되었다 그럼 데이터가 1만개라고치면 1만개중 다찾아서 수정을 해줘야한다 그래서 제2 정규화인 테이블을 분리시켜주는 작업을하자 여기서 테이블을 나누는 기준은 이 테이블과 관련이 없는 컬럼을 밖으로 빼낸다거나 가격은 프로그램에 관한 데이터이기때문에 가격을 제거해도 되겠다라고 생각한다.
(프로그램만 검색하면 가격은 따라오면 되겠다고 구상을하는것이다.)
[수강등록현황 table]
회원번호 | 회원이름 | 프로그램 | 가격 | 납부여부 |
101 | 강호동 | 스쿼시초급 | 5000 | 0 |
102 | 손흥민 | 헬스 | 6000 | 1 |
103 | 김민수 | 헬스 | 6000 | 1 |
103 | 김민수 | 골프초급 | 8000 | 0 |
[프로그램 table]
프로그램 | 가격 |
스쿼시초급 | 5000 |
헬스 | 6000 |
골프초급 | 8000 |
그래서 위와같이 가격컬럼이사라지고 프로그램 table을 생성하여 프로그램 이름과 가격만 있는 테이블을 생성하게된다.
장점으론 헬스가격 조정지 프로그램 테이블에있는 헬스의 가격만 수정하면 모든 값이 바뀌게 될것이다
단점으론 join문을 이용하여 다른테이블을 참조해야하기때문에 쿼리문이 복잡해진다.
partial dependency
partial dependency란?
데이터베이스 설계에서 정규화는 중복을 제거하고 데이터의 무결성을 보장하기 위해 사용되는 프로세스입니다. 정규화 과정에서 다양한 종류의 종속성이 발생하는데, 그 중 하나가 부분 종속성(Partial Dependency)입니다.
composite primary key라는게 있는데 primary key는 행을 서로 구분할 수 있는 유니크한 데이터를 담고 있는 컬럼이다 근데 가끔은 하나의 컬럼만으로 primary key를 정할 수 없는 경우가 있습니다.
[수강등록현황 table]
회원번호 | 회원이름 | 프로그램 | 가격 | 납부여부 |
101 | 강호동 | 스쿼시초급 | 5000 | 0 |
102 | 손흥민 | 헬스 | 6000 | 1 |
103 | 김민수 | 헬스 | 6000 | 1 |
103 | 김민수 | 골프초급 | 8000 | 0 |
▲ 위의 테이블에선 (회원번호 + 프로그램) 이렇게 조합해야 primary key 역할을 수행할 수 있습니다.
'회원번호' 만으로 primary key 역할은 불가능합니다.
'프로그램' 만으로 primary key 역할은 불가능합니다.
근데 두개 합치면 primary key 역할 가능
두개 컬럼을 합친 primary key를 composite primary key 라고 합니다.
2. composite primary key 중에 하나의 컬럼에만 종속되어 있는 다른 컬럼을
partial dependency가 있다고 표현합니다.
[수강등록현황 table]
회원번호 | 회원이름 | 프로그램 | 가격 | 납부여부 |
101 | 강호동 | 스쿼시초급 | 5000 | 0 |
102 | 손흥민 | 헬스 | 6000 | 1 |
103 | 김민수 | 헬스 | 6000 | 1 |
103 | 김민수 | 골프초급 | 8000 | 0 |
▲ 예를 들어 위의 테이블에서 보면 '가격' 컬럼은 '프로그램'에 따라서 결정될 뿐 '회원번호'과는 상관이 없습니다.
그 경우 가격 컬럼은 partial dependency가 있다고 표현합니다.
3. partial dependency가 있는 컬럼을 다른 테이블로 빼면 제2정규형 테이블 완성입니다.
그래서 위의 예시의 '가격' 컬럼을 다른 테이블로 빼는 것입니다.
[수강등록현황 table]
회원번호 | 회원이름 | 프로그램 | 가격 | 준비물 |
101 | 강호동 | 스쿼시초급 | 5000 | 라켓 |
102 | 손흥민 | 헬스 | 6000 | 없음 |
103 | 김민수 | 헬스 | 6000 | 없음 |
103 | 김민수 | 골프초급 | 8000 | 골프채 |
Q1. 위 테이블에서 '준비물' 컬럼은 partial dependency가 있을까요 없을까요?
있습니다.
composite primary key 중 하나인 회원번호에 종속 X
composite primary key 중 하나인 프로그램에 종속 O
그래서 제2정규형 만들려면 다른 테이블로 빼야합니다.
[수강등록현황 table]
회원번호 | 회원이름 | 프로그램 | 가격 | 돈납부여부 |
101 | 강호동 | 스쿼시초급 | 5000 | 0 |
102 | 손흥민 | 헬스 | 6000 | 1 |
103 | 김민수 | 헬스 | 6000 | 1 |
103 | 김민수 | 골프초급 | 8000 | 0 |
Q2. 위 테이블에서 '돈납부여부' 컬럼은 partial dependency가 있을까요 없을까요?
없습니다.
composite primary key 중 하나인 회원번호에 종속 X
composite primary key 중 하나인 프로그램에 종속 X
하지만 (회원번호 + 프로그램)에 종속 O 입니다.
그래서 제2정규형 만들려고 다른 테이블로 뺄 필요는 없을듯요
(팁) 종속관계 판단이 어렵다면 하나의 컬럼을 다른 값으로 바꿔보십시오.
그 경우 다른 컬럼도 변경되어야한다면 그 관계를 종속관계라고 합니다.
정리
내가 db데이터를 이용하여 102번의 프로그램 금액을 찾고싶을때를 상상해보면 회원번호와 프로그램만 있으면 프로그램과 가격만 있는 테이블을 참조하여 조회가 가능할거 같으니 다른 테이블로 뺀다 생각하려한다.
'DB' 카테고리의 다른 글
NoSQL과 관계형 데이터베이스에 대해 (0) | 2023.05.18 |
---|---|
제 3 정규형(3NF) Foreign Key (0) | 2023.05.12 |
GROUP BY (ROLLUP, GROUPING SETS, HAVING, CUBE) ORACLE (2) | 2023.04.20 |