들어가며
본 포스팅은 한빛 미디어(O’Reilly Media) 사의 ‘Learning SQL’을 학습하며 정리한 노트입니다
그동안 SQL을 데이터 조작어(DML)로써 사용했다면 이제는 조금 더 깊게 파보려고 합니다.
데이터를 설계하고 직접 생성해보는 과정을 통해 아이디어를 데이터로 표현하고 데이터를 자유자재로 핸들링할 수 있는 기술들을 하나씩 갈고닦고자 합니다.
시작에 앞서
MySQL 서버 설치 (feat. Mac OS)
- Mac OS에 MySQL Server 설치
- 본 도서의 실습을 위해 MySQL 서버를 설치합니다
제가 사용하고 있는 Mac은 11 버전입니다. 현재 사용하고 있는 맥의 버전에 맞는 MySQL을 설치해주었습니다.
설치 관련해서는 잘 정리된 포스팅들이 많았고 이곳을 참고했습니다.
한가지 기억에 남는 점은 Mac OS에 MySQL Server 설치 시. dmg 파일로 설치를 했다는 점입니다. .dmg 파일이 뭐지?’라고 생각했는데 윈도우의 .exe와 같은 실행형 파일이었습니다. 설치는 간단했고, 설치 후 sakila database을 받아왔습니다.
Sakila Database
MySQL 공식 문서에서는 사용자가 활용할 수 있는 데이터베이스를 제공해줍니다.
저는 본 도서에서 다루는 데이터베이스를 사용하기 위해 ‘sakila database’를 다운받아 실행했습니다.
스키마, 데이터에 대한 .sql 파일을 다운로드할 수 있었으며 터미널에서 source 명령어에 해당 파일의 경로를 인자 값으로 넣어주었습니다.
이렇게 간단히 MySQL 서버 생성과 함께 데이터 베이스를 생성하였습니다.
환경이 갖춰졌으니 이제는 여러 실험을 즐겨볼 차례입니다.
person table과 favorite_food table 생성하기
첫 번째 실습으로는 테이블 생성에 대한 주제를 다뤘습니다.
MySQL 데이터베이스에서 저장할 수 있는 자료형을 파악한 뒤, 테이블 정의를 통해 이를 사용하는 방법을 익혔습니다.
하나의 IT 서비스라고 생각하고 사용자에 대한 정보를 테이블로 설계 및 구현해보도록 하겠습니다.
설계-정제-설계-SQL문 작성하기
1단계: 설계 단계
테이블을 설계(design)하는 좋은 방법은 브레인 스토밍을 통해 어떤 종류의 정보를 포함해야 도움이 될지 알아보는 것입니다.
- 이름(name)
- 눈동자 색(eye_color)
- 생일(birth_date)
- 주소(address)
- 좋아하는 음식(favorite_foods)
우선은 책에서 제시하는 예를 통해 해당 개념을 익혔지만 이를 기반으로 다양하게 생각을 확장할 수 있다고 생각합니다.
(가령 게임 서비스라면 사용자의 성과 이름, 나이, 최근 접속 시간, 총 활동 시간, 아이템 구매 금액 등 다양한 정보들을 기록할 수 있지 않을까 생각합니다.)
이러한 생각은 잠시 멈춰두고 다시 본론으로 돌아오도록 하겠습니다.
person table을 생성하기 위해 이름, 눈동자 색, 생일, 주소, 좋아하는 음식이라는 열을 정의했습니다.
과연, 이렇게 정의하는게 맞는 걸까요?
데이터베이스 설계에 중복 또는 복합 열이 없음을 확인하는 정규화 단계가 필요합니다
2단계: 정제 단계
- name 열은 성과 이름으로 구성된 복합 객체입니다
- 여러 사람이 동일한 이름, 눈동자 색, 생년월일 등을 가질 수 있으므로 person 테이블에는 고유성을 보장하는 열이 없습니다
- address는 거리, 도시, 주/도, 국가 및 우편번호로 구성된 복합 객체입니다.
- fovoriate_foods 열은 0개 또는 1개 이상의 독립적인 항목을 포함하는 목록입니다. 특정 음식이 어떤 사람에게 귀속될 수 있는지 알 수 있도록 이 데이터에 대한 별도의 테이블을 작성하고 person 테이블에 대한 외래 키가 포함되도록 하는 게 가장 좋습니다.
3단계: 정제 후 재설계
정제를 거쳐 다시 설계하는 단계를 3단계: 정제 후 재설계 단계라고 정의해 보겠습니다.
- person_id: 테이블의 고유성을 가지는 기본키 생성
- first_name
- last_name
- eye_color: BR, BL, GR
- birth_date
- street
- city
- state
- country
- postal_code
다음 단계로는 person 테이블의 외래키가 포함된 favorite_food 테이블을 만드는 것입니다.
- person_id
- food
4단계: SQL 스키마문 생성
사람과 좋아하는 음식에 관한 정보를 담는 두 테이블의 설계가 끝났습니다.
다음 단계는 SQL 문을 생성하여 데이터베이스에 테이블을 만드는 것입니다.
-- CREATE TABLE person
CREATE TABLE person
(person_id SMALLINT UNSIGNED,
fname VARCHAR(20),
lname VARCHAR(20),
eye_color CHAR(2),
birth_date DATE,
street VARCHAR(30),
city VARCHAR(30),
state VARCHAR(20),
country VARCHAR(20),
postal_code VARCHAR(20),
CONSTRAINT pk_person PRIMARY KEY (person_id)
);
person 테이블 생성 결과는 아래와 같습니다.
CREATE TABLE favorite_food
(person_id SMALLINT UNSIGNED,
food VARCHAR(20),
CONSTRAINT pk_favorite_food PRIMARY KEY (person_id, food),
CONSTRAINT fk_fav_food_person_id FOREIGN KEY (person_id)
REFERENCES person (person_id)
);
마찬가지로 favorite_food 테이블 생성 결과는 아래와 같습니다.
이렇게 테이블을 완성했습니다.
다음 단계에서는 약간의 데이터를 추가해보도록 하겠습니다.
마치며
첫 시간은 언제나 설레는 것 같습니다.
꾸준한 학습으로 설계와 구현을 자유롭게 구사할 수 있는 엔지니어가 될 수 있도록 노력하겠습니다.
감사합니다.
Steve-Lee였습니다!
댓글