์ค๋ณต์ ์ต์ํํ๊ณ ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ ์ ์งํ๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฅผ ๊ตฌ์กฐํํ๋ ๊ณผ์ ์ ๋๋ค. ์ฃผ๋ก ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฌ์ฉ๋๋ฉฐ, ์ผ๋ฐ์ ์ผ๋ก ์ 1์ ๊ทํ(1NF)๋ถํฐ ์ 5์ ๊ทํ(5NF)๊น์ง์ ๋จ๊ณ๊ฐ ์์ต๋๋ค. ๋ณดํต ์ 1์ ๊ทํ~์ 3์ ๊ทํ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
1) ๊ฐ ํ์ ์ ์ผํ๊ฒ ๊ตฌ๋ถํ๋ ์ปฌ๋ผ์ด ์กด์ฌํฉ๋๋ค.(Primary Key(PK))
2) ๋ชจ๋ ๋ฐ์ดํฐ๋ ์์์ ์ผ๋ก ์ ์ฅ๋ฉ๋๋ค.
ํ๋ณดํค(Candidate Key)๋ PRIMARY KEY๊ฐ ๋ ๊ฐ๋ฅ์ฑ์ด ์๋ ํค๋ผ๊ณ ํฉ๋๋ค.
1. ์ ์ผ์ฑ(Unique): ํ๋ณดํค๋ก ์ ํ๋ ์ด์ ๊ฐ์ ๋ชจ๋ ํ์์ ์ ์ผํด์ผ ํฉ๋๋ค.
2. ์ต์์ฑ(Minimal): ํ๋ณดํค๋ก ์ ํ๋ ์ด์ ์งํฉ ์ค์์ ๋ ์ด์ ์ ๊ฑฐํ ์ ์๋ ์ต์ํ์ ์ด๋ก ๊ตฌ์ฑ๋์ด์ผ ํฉ๋๋ค.
๐ฆ PRIMARY KEY์ ํน์ฑ
1. ์ ์ผ์ฑ(Unique): PRIMARY KEY๋ก ์ ํ๋ ์ด์ ๊ฐ์ ๋ชจ๋ ํ์์ ์ ์ผํด์ผ ํฉ๋๋ค.
2. NOT NULL ์ ์ฝ์กฐ๊ฑด: PRIMARY KEY๋ก ์ ํ๋ ์ด์ NULL ๊ฐ์ ํ์ฉํ์ง ์์์ผ ํฉ๋๋ค.
3. ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ด ๋ฎ์(Low Mutability): PRIMARY KEY๋ก ์ ํ๋ ์ด์ ๊ฐ์ ๋ณ๊ฒฝ๋์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ ์ฝ๋๋ฅผ ์ผ๊ด์ฑ ์๊ฒ ์ ์งํ๊ธฐ ์ํจ์
๋๋ค.
๊ฐ์ฅ ์ด์์ ์ธ PRIMARY KEY๋ ์๋ฏธ ์๋(column name)์ธ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์๋ฏธ ์๋ ์ ๋ณด๊ฐ ์๋ ๊ฐ๋จํ ๊ฐ์ผ๋ก ๋ ์ฝ๋๋ฅผ ๊ณ ์ ํ๊ฒ ์๋ณํ ์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋๋ถ๋ถ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ
์ ์๋์ผ๋ก ์ฆ๊ฐํ๋ ์ ์ ๊ฐ(AUTO_INCREMENT)์ ์ฌ์ฉํ์ฌ PRIMARY KEY๋ฅผ ์์ฑํฉ๋๋ค.
CREATE TABLE customer(
id INT PRIMARY KEY AUTO_INCREMENT,
first_name VARCHAR(3),
last_name VARCHAR(3)
);
CREATE TABLE phone_number(
id INT PRIMARY KEY AUTO_INCREMENT,
customer_id INT,
phone_number VARCHAR(10),
FOREIGN KEY (customer_id) REFERENCES customer(id) # ์ธ๋ํค ์ ์ฝ์ฌํญ(FOREIGN KEY)
);
INSERT INTO customer (first_name, last_name) VALUES ('son','hm'),('lee','ki');
INSERT INTO phone_number VALUES (1,'1234'),(3,'7890'); #3๋ฒ์ด ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ ์๋ฌ
INSERT INTO phone_number (customer_id, phone_number) VALUES (1,'1234');
INSERT INTO phone_number (customer_id, phone_number) VALUES (1,'4321');
INSERT INTO phone_number (customer_id, phone_number) VALUES (2,'4321');
1) 1NF ํ
์ด๋ธ๋ฅผ ์ค์ํฉ๋๋ค.
2) ํค๊ฐ ์๋ ์ปฌ๋ผ์ด ํค ์ปฌ๋ผ ์ผ๋ถ๋ถ์ ์ํด ๊ฒฐ์ ๋์ง ์์์ผ ํฉ๋๋ค. ํ
์ด๋ธ์ ๋ชจ๋ ์์ฑ์ด ๊ธฐ๋ณธ ํค ์ ์ฒด์ ์ํด ๊ฒฐ์ ๋์ด์ผ ํฉ๋๋ค.
INT PRIMARY KEY AUTO_INCREMENT ์ปฌ๋ผ ์์ผ๋ฉด ํด๊ฒฐ๋ฉ๋๋ค. ๊ทธ ์ด์ ๋ ํด๋น ์ปฌ๋ผ์ ๋ค๋ฅธ ์ปฌ๋ผ๋ค๊ณผ์ ์ฐ๊ด์ด ์๊ธฐ ๋๋ฌธ์
๋๋ค.
1) 2NF ํ
์ด๋ธ์ ์ค์ํฉ๋๋ค.
2) ํค๊ฐ ์๋ ์ปฌ๋ผ๋ผ๋ฆฌ ์ข
์๋๋ฉด ์๋ฉ๋๋ค.(์ดํ์ ์ข
์)
CREATE TABLE customer(
id INT PRIMARY KEY AUTO_INCREMENT,
first_name VARCHAR(3),
last_name VARCHAR(3),
level INT,
FOREIGN KEY (level) REFERENCES customer_benefit(level)
);
CREATE TABLE customer_benefit(
level INT PRIMARY KEY,
benefit VARCHAR(100)
);
INSERT INTO customer (first_name, last_name, level)
VALUES ('son','hm',1),('lee','ki',1),
('kik','hs',2),('lee','jh',2), ('cap','ste',3);
INSERT INTO customer_benefit (level, benefit)
VALUES (1,'๋ฌด๋ฃ๋ฐฐ์ก'),(2,'ํ ์ธ'),(3,'๋ผ์ด์ง');
customer ํ
์ด๋ธ์ id, first_name, last_name, level, benefit ์ปฌ๋ผ์ ๊ฐ์ง๊ณ ์๋ค๋ฉด benefit์ level๊ณผ ์ฐ๊ด๋์ด ์์ด ์ปฌ๋ผ๋ผ๋ฆฌ ์ข
์๋์ด ์์ต๋๋ค. ๊ทธ๋์ ๋ฐ๋ก customer_benefit ํ
์ด๋ธ์ ๋ง๋ญ๋๋ค. customer_benefit ํ
์ด๋ธ์ level ์ปฌ๋ผ ์ฌ์ด์ ์ธ๋ํค ๊ด๊ณ๋ฅผ ํตํด ๋ ํ
์ด๋ธ์ ์ฐ๊ฒฐ์ํต๋๋ค.1. N:N ๊ด๊ณ
๋ค๋๋ค ๊ด๊ณ : ํ ์ํฐํฐ๊ฐ ๋ค๋ฅธ ์ํฐํฐ์ ์ฌ๋ฌ ๋ ์ฌ๋ฌ์ ๊ด๊ณ๋ฅผ ๊ฐ์ง ๋ ์ฌ์ฉํฉ๋๋ค. CREATE TABLE board(
id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(20),
content VARCHAR(20)
);
CREATE TABLE member(
id INT PRIMARY KEY AUTO_INCREMENT,
email VARCHAR(20),
info VARCHAR(20)
);
# ๋ค๋๋ค ๊ด๊ณ์ ํ
์ด๋ธ์ ์ค๊ฐํ
์ด๋ธ ์์ฑ
CREATE TABLE board_like(
board_id INT REFERENCES board(id),
member_id INT REFERENCES member(id),
PRIMARY KEY (board_id, member_id)
);
board ํ
์ด๋ธ๊ณผ member ํ
์ด๋ธ์ ๊ธฐ๋ณธ ํค๋ฅผ ์ฐธ์กฐํฉ๋๋ค.
2. 1:N ๊ด๊ณ
์ผ๋๋ค ๊ด๊ณ : ํ ์ํฐํฐ๊ฐ ๋ค๋ฅธ ์ํฐํฐ์ ์ฌ๋ฌ ๋ ํ๋์ ๊ด๊ณ๋ฅผ ๊ฐ์ง ๋ ์ฌ์ฉ๋ฉ๋๋ค. CREATE TABLE employee(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(10),
address VARCHAR(10),
salary INT
);
CREATE TABLE employee_salary(
employee_id INT PRIMARY KEY REFERENCES employee(id),
salary INT
)