데이터 모델링
MySQL에 실제로 데이터베이스를 생성하기 전 데이터 모델링이라는 과정을 거쳐 생성할 데이터베이스의 구조를 설계하게 되는데 이를 스키마 (Schema;뼈대) 설계 라고도 한다. 이 데이터 모델링은 총 3가지 단계를 거친다. 간단한 데이터베이스라서 1,2단계는 생략 하고 3단계 물리적 모델링을 바로 해도 될 것 같긴 하지만 그래도 정리를 하는 차원에서 단계를 밟아 보기로 한다.
- 개념적 데이터 모델링 – 현실 세계에 있는 개체(Entity)들의 속성(Attribute)은 어떤 것들이 있는지 고민 해보는 단계
- 논리적 데이터 모델링 – 데이터베이스에 저장되는 데이터는 원칙적으로 공백과 중복이 있어서는 안된다는 것을 바탕으로 속성들을 분류하는 단계. 이를 데이터베이스 정규화라고 부른다.
- 물리적 데이터 모델링 – 실제로 MySQL에 데이터베이스와 테이블을 생성하고 주키(PK;Primary Key)와 외부키(FK;Foreign Key)를 연결하는 단계
역시 모델링 단계니 뭐니 하고 적어 놓으면 뭔가 어렵다. 그래서 내 방식대로 이해 해보기로 했다.
난 음반의 정보를 데이터베이스에 저장하고 싶은 게 목적이다. 그렇다면…
- 음반에는 어떤 내용이 담겨져 있나? 를 먼저 알아야 한다
- 음반 정보(속성)를 테이블로 잘 정리해서 데이터베이스에 입력할 준비 단계를 거쳐야 한다. 모든 관계형 데이터베이스의 기본은 테이블이기 때문에…
- MySQL에 어떻게 입력될 것인지를 고민 해본다. (자료형, 길이 등)
조금 더 이해하기 쉬운 단어로 써 놓으니 데이터베이스가 조금 더 친숙 해지는 느낌이 든다. ^^;
음반에는 어떤 내용이 담겨져 있나? – 개념적 데이터 모델링
우선, 음반에는 어떤 내용이 담겨져 있나를 살펴 본다. 샘플은 윤상의 두 번째 앨범 중 part I을 택했다.
앞면을 보면 특이하게 그냥 가수의 사인과 오른쪽 맨 위에 음반 레이블 (지구레코드)만 찍혀 있고
뒷면을 보면 수록곡 리스트와 음반 레이블, 발매년도 등이 나와 있다.
위 자켓을 보고 음반이라는 개체(Entity)1가 가지고 있는 속성(Attribute)을 정리 해보면 아래와 같다.
음반 (가수, 음반명, 음반 레이블, 발매일자, 노래1, 노래2, 노래3, ...)
가수 | 음반명 | 음반 레이블 | 발매일자 | 노래 |
---|---|---|---|---|
윤상 | 2집 Part.1 | 지구레코드 | 1992-10-15 | 1. 그래도 안녕 (3:52), 2. 가려진 시간 사이로 (3:56), 3. 너에게 (4:10) |
음반 정보를 테이블로 정리 하고 정규화 하기 – 논리적 데이터 모델링
이제 정규화를 해야 하는데 정규화의 핵심은 아래와 같다. 자세한 정규화에 대한 설명은 데이터베이스 정규화 설명을 참조.
- 하나의 컬럼에는 하나의 데이터를 가져야 한다
- 중복 데이터 제거
- 이행 종속 (Transitive Defendency) 제거
1. 하나의 컬럼에는 하나의 데이터 (1차 정규화)
위 표에서 보면, 노래 컬럼에 여러개의 노래 데이터가 있다. 이것을 하나의 데이터만 들어가도록 분리를 해주면 아래와 같다.노래가 반복이 되고 있다. 이를 분리하여 테이블을 따로 만들어 주면 아래와 같다.
가수 | 음반명 | 음반레이블 | 발매일자 | 노래 |
---|---|---|---|---|
윤상 | 2집 Part.1 | 지구레코드 | 1992-10-15 | 1. 그래도 안녕 (3:52) |
윤상 | 2집 Part.1 | 지구레코드 | 1992-10-15 | 2. 가려진 시간 사이로 (3:56) |
윤상 | 2집 Part.1 | 지구레코드 | 1992-10-15 | 3. 너에게 (4:10) |
2. 중복 데이터 제거 (2차 정규화)
위 테이블에서는 노래가 분리되어 유일 데이터가 되는 바람에 가수와 음반이 중복된다는 것이다. 그러면 가수와 음반을 분리 한다.
음반 레이블도 음반명이 늘어날 때 같은 회사라면 중복이 될 수 있어서 분리.
가수명 | 데뷔년도 |
---|---|
윤상 | 1990-01-01 |
트랙번호 | 노래 제목 | 재생시간 |
---|---|---|
1 | 그래도 안녕 | 3:52 |
2 | 가려진 시간 사이로 | 3:56 |
3 | 너에게 | 4:10 |
음반명 | 발매일자 |
---|---|
2집 Part.1 | 1992-10-15 |
음반레이블 | 대표자 |
---|---|
지구레코드 | 홍길동 |
3. 이행 종속 분리 (3차 정규화)
위 테이블로 봤을 때는 이행 종속이 보이지 않는다.
MySQL에 어떻게 입력할 것인가? – 물리적 설계 단계
이제 각 개체가 가지는 속성의 자료형과 길이를 고민해 볼 차례다.
가수 (singer)
- 가수명 : name, varchar(20)
- 데뷔년도 : debut, date
- 가수ID : id, int, Primary Key, 동명의 가수가 있을 수 있으므로 가수id를 주키로 사용. 자동증가.
음반 (record)
- 음반명 : name, varchar(30)
- 발매일자 : releaseDate, date
- 음반ID : id, int, PK, 동명의 음반명이 있을 수 있으므로 음반id를 주키로 사용. 자동증가.
노래 (song)
- 트랙번호 : track, tinyint
- 노래 제목 : name, varchar(50)
- 재생 시간 : runTime, tinyint, 재생시간을 초단위로 입력을 하고 출력할 때는 다시 분,초 형식으로 바꿔서 출력
- 노래ID : id, int, PK, 동명의 노래 제목이 있을 수 있으므로 노래id를 주키로 사용. 자동증가.
음반레이블 (recordLabel)
- 회사명 : name, varchar(20)
- 대표 : ceo, varchar(20)
- 레이블ID : id, int, PK, 자동증가.
- 일반적으로 프로그래밍에서 개체라고 하면 Object라는 단어를 쓰는데 데이터베이스에서는 Entity라는 단어를 쓴다. 다 같은 객체 또는 개체 이지만 Object는 현실 세계에 존재하는 모든 것이라는 뜻이 강한 반면 Entity는 속성의 집합이라는 뜻이 더 강한 것 같다. ↩︎