chocoding™

좌충우돌 엉망진창 코딩 성장 블로그

myrecord | 데이터베이스 설계 – 데이터 모델링

데이터 모델링

MySQL에 실제로 데이터베이스를 생성하기 전 데이터 모델링이라는 과정을 거쳐 생성할 데이터베이스의 구조를 설계하게 되는데 이를 스키마 (Schema;뼈대) 설계 라고도 한다. 이 데이터 모델링은 총 3가지 단계를 거친다. 간단한 데이터베이스라서 1,2단계는 생략 하고 3단계 물리적 모델링을 바로 해도 될 것 같긴 하지만 그래도 정리를 하는 차원에서 단계를 밟아 보기로 한다.

  1. 개념적 데이터 모델링 – 현실 세계에 있는 개체(Entity)들의 속성(Attribute)은 어떤 것들이 있는지 고민 해보는 단계
  2. 논리적 데이터 모델링 – 데이터베이스에 저장되는 데이터는 원칙적으로 공백과 중복이 있어서는 안된다는 것을 바탕으로 속성들을 분류하는 단계. 이를 데이터베이스 정규화라고 부른다.
  3. 물리적 데이터 모델링 – 실제로 MySQL에 데이터베이스와 테이블을 생성하고 주키(PK;Primary Key)와 외부키(FK;Foreign Key)를 연결하는 단계

역시 모델링 단계니 뭐니 하고 적어 놓으면 뭔가 어렵다. 그래서 내 방식대로 이해 해보기로 했다.
난 음반의 정보를 데이터베이스에 저장하고 싶은 게 목적이다. 그렇다면…

  1. 음반에는 어떤 내용이 담겨져 있나? 를 먼저 알아야 한다
  2. 음반 정보(속성)를 테이블로 잘 정리해서 데이터베이스에 입력할 준비 단계를 거쳐야 한다. 모든 관계형 데이터베이스의 기본은 테이블이기 때문에…
  3. MySQL에 어떻게 입력될 것인지를 고민 해본다. (자료형, 길이 등)

조금 더 이해하기 쉬운 단어로 써 놓으니 데이터베이스가 조금 더 친숙 해지는 느낌이 든다. ^^;

음반에는 어떤 내용이 담겨져 있나? – 개념적 데이터 모델링

우선, 음반에는 어떤 내용이 담겨져 있나를 살펴 본다. 샘플은 윤상의 두 번째 앨범 중 part I을 택했다.
앞면을 보면 특이하게 그냥 가수의 사인과 오른쪽 맨 위에 음반 레이블 (지구레코드)만 찍혀 있고
뒷면을 보면 수록곡 리스트와 음반 레이블, 발매년도 등이 나와 있다.
위 자켓을 보고 음반이라는 개체(Entity)1가 가지고 있는 속성(Attribute)을 정리 해보면 아래와 같다.

음반 (가수, 음반명, 음반 레이블, 발매일자, 노래1, 노래2, 노래3, ...)
가수음반명음반 레이블발매일자노래
윤상2집 Part.1지구레코드1992-10-151. 그래도 안녕 (3:52), 2. 가려진 시간 사이로 (3:56), 3. 너에게 (4:10)

음반 정보를 테이블로 정리 하고 정규화 하기 – 논리적 데이터 모델링

이제 정규화를 해야 하는데 정규화의 핵심은 아래와 같다. 자세한 정규화에 대한 설명은 데이터베이스 정규화 설명을 참조.

  1. 하나의 컬럼에는 하나의 데이터를 가져야 한다
  2. 중복 데이터 제거
  3. 이행 종속 (Transitive Defendency) 제거

1. 하나의 컬럼에는 하나의 데이터 (1차 정규화)

위 표에서 보면, 노래 컬럼에 여러개의 노래 데이터가 있다. 이것을 하나의 데이터만 들어가도록 분리를 해주면 아래와 같다.노래가 반복이 되고 있다. 이를 분리하여 테이블을 따로 만들어 주면 아래와 같다.

가수음반명음반레이블발매일자노래
윤상2집 Part.1지구레코드1992-10-151. 그래도 안녕 (3:52)
윤상2집 Part.1지구레코드1992-10-152. 가려진 시간 사이로 (3:56)
윤상2집 Part.1지구레코드1992-10-153. 너에게 (4:10)

2. 중복 데이터 제거 (2차 정규화)

위 테이블에서는 노래가 분리되어 유일 데이터가 되는 바람에 가수와 음반이 중복된다는 것이다. 그러면 가수와 음반을 분리 한다.
음반 레이블도 음반명이 늘어날 때 같은 회사라면 중복이 될 수 있어서 분리.

가수명데뷔년도
윤상1990-01-01
트랙번호노래 제목재생시간
1그래도 안녕3:52
2가려진 시간 사이로3:56
3너에게4:10
음반명발매일자
2집 Part.11992-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, 자동증가.

  1. 일반적으로 프로그래밍에서 개체라고 하면 Object라는 단어를 쓰는데 데이터베이스에서는 Entity라는 단어를 쓴다. 다 같은 객체 또는 개체 이지만 Object는 현실 세계에 존재하는 모든 것이라는 뜻이 강한 반면 Entity는 속성의 집합이라는 뜻이 더 강한 것 같다. ↩︎