회원번호(PK) | 이름 | 프로그램 |
---|---|---|
10 | 강호동 | 씨름 |
11 | 윤성빈 | 수영 |
12 | 설기관 | 헬스 |
회원번호(PK) | 이름 | 프로그램 |
---|---|---|
10 | 강호동 | 스쿼시 초급 |
11 | 윤성빈 | 헬스 |
12 | 유재석 | 헬스, 골프초급 |
이렇게 회원 테이블을 구성한다면 ...?
골브 조회시 추가적인 sql 필요
WHERE 프로그램 = '골프초급' (X)
WHERE 프로그램 = '골프초급' LIKE '%골프초급%' (O)
이후 골프초급의 이름명이 변경 될때에도 수정이 어려워짐. 또한 성능문제 역시 발생.
개선한 테이블은
회원번호(PK) | 이름 | 프로그램 |
---|---|---|
10 | 강호동 | 스쿼시 초급 |
11 | 윤성빈 | 헬스 |
12 | 유재석 | 헬스 |
12 | 유재석 | 골프초급 |
하나의 칸에 하나의 데이터만을 만족하는 테이블 = 제 1 정규형 테이블
이후 추가적인 기능이 필요해 아래와 같이 가격 및 납부기능도 추가하였다.
회원번호(PK) | 이름 | 프로그램 | 가격 | 납부여부 |
---|---|---|---|---|
10 | 강호동 | 스쿼시 초급 | 5000 | 0 |
11 | 윤성빈 | 헬스 | 6000 -> 8000 | 1 |
12 | 유재석 | 헬스 | 6000 -> 8000 | 1 |
12 | 유재석 | 골프초급 | 8000 | 0 |
EX) 6000 -> 8000원 가격 변경이 필요
만약 헬스 수강생 인원이 만명일때, 만개의 행이 수정이 필요하게됨
프로그램 - 가격 테이블을 따로 만들어 가격주제를 분리
회원번호(PK) | 이름 | 프로그램 | 납부여부 |
---|---|---|---|
10 | 강호동 | 스쿼시 초급 | 0 |
11 | 윤성빈 | 헬스 | 1 |
12 | 유재석 | 헬스 | 1 |
12 | 유재석 | 골프초급 | 0 |
프로그램 | 가격 |
---|---|
스쿼시 초급 | 5000 |
헬스 | 6000 -> 8000 |
골프 초급 | 8000 |
다만 조회시 JOIN을 통해 테이블끼리 연결을 해야함
EX) 윤성빈의 프로그램 가격을 조회 =>
SELECT * FROM 회원등록테이블 A JOIN 프로그램-가격테이블 B ON A.프로그램 = B.프로그램
회원번호(PK) | 이름 | 프로그램 | 납부여부 | 강사 | 대학 |
---|---|---|---|---|---|
10 | 강호동 | 스쿼시 초급 | 0 | 도덕희 | 해양대 |
11 | 윤성빈 | 헬스 | 1 | 윤정인 | 부경대 |
12 | 유재석 | 헬스 | 1 | 윤정인 | 부경대 |
12 | 유재석 | 골프초급 | 0 | 박지인 | 서울대 |
13 | 엄지식 | 골프중급 | 0 | 조민국 | 서울대 |
-> 해당 대학 컬럼은 강사 컬럼에 종속적임
제 3정규화 : 일반컬럼에만 종속된 컬럼은 다른 테이블로 빼기
회원번호(PK) | 이름 | 프로그램 | 납부여부 | 강사 |
---|---|---|---|---|
10 | 강호동 | 스쿼시 초급 | 0 | 도덕희 |
11 | 윤성빈 | 헬스 | 1 | 윤정인 |
12 | 유재석 | 헬스 | 1 | 윤정인 |
12 | 유재석 | 골프초급 | 0 | 박지인 |
13 | 엄지식 | 골프중급 | 0 | 조민국 |
강사 | 대학 |
---|---|
도덕희 | 해양대 |
윤정인 | 부경대 |
박지인 | 서울대 |
조민국 | 서울대 |
4~ 5 정규화까지 있기 때문에 이후 내용도 작성필요