๐Ÿ’ป ์ฝ”๋”ฉ ์ผ๊ธฐ : [SQL] '์ •๊ทœํ™”์™€ ๊ด€๊ณ„' ํŽธ

ybkยท2024๋…„ 4์›” 25์ผ

sql

๋ชฉ๋ก ๋ณด๊ธฐ
1/6
post-thumbnail

๐Ÿ”” '์ •๊ทœํ™”์™€ ๊ด€๊ณ„'์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž!


๐Ÿ’Ÿ ์ •๊ทœํ™”(Normalization)

์ค‘๋ณต์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ์กฐํ™”ํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค. ์ฃผ๋กœ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ, ์ผ๋ฐ˜์ ์œผ๋กœ ์ œ1์ •๊ทœํ™”(1NF)๋ถ€ํ„ฐ ์ œ5์ •๊ทœํ™”(5NF)๊นŒ์ง€์˜ ๋‹จ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณดํ†ต ์ œ1์ •๊ทœํ™”~์ œ3์ •๊ทœํ™”๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ’Ÿ ์ œ1์ •๊ทœํ™”(1NF)

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');
  • ์™ธ๋ž˜ํ‚ค(FOREIGN KEY) ์ œ์•ฝ์‚ฌํ•ญ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ด๋ธ” ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • first_name๊ณผ last_name์€ ๊ฐ๊ฐ์˜ ๊ณ ๊ฐ์˜ ์ด๋ฆ„์„ ๋‚˜ํƒ€๋‚ด๋Š”๋ฐ, ๊ฐ๊ฐ์˜ ๊ฐ’์€ ํ•˜๋‚˜์˜ ๋‹จ์ผ ๊ฐ’(์›์ž์  ๊ฐ’)์ž…๋‹ˆ๋‹ค. phone_number ํ…Œ์ด๋ธ”์˜ phone_number ์ปฌ๋Ÿผ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ฐ ๊ณ ๊ฐ์˜ ์ „ํ™”๋ฒˆํ˜ธ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š”๋ฐ, ํ•˜๋‚˜์˜ ๊ฐ’์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ’Ÿ ์ œ2์ •๊ทœํ™”(2NF)

1) 1NF ํ…Œ์ด๋ธ”๋ฅผ ์ค€์ˆ˜ํ•ฉ๋‹ˆ๋‹ค.
2) ํ‚ค๊ฐ€ ์•„๋‹Œ ์ปฌ๋Ÿผ์ด ํ‚ค ์ปฌ๋Ÿผ ์ผ๋ถ€๋ถ„์— ์˜ํ•ด ๊ฒฐ์ •๋˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ์†์„ฑ์ด ๊ธฐ๋ณธ ํ‚ค ์ „์ฒด์— ์˜ํ•ด ๊ฒฐ์ •๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
INT PRIMARY KEY AUTO_INCREMENT ์ปฌ๋Ÿผ ์žˆ์œผ๋ฉด ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ํ•ด๋‹น ์ปฌ๋Ÿผ์€ ๋‹ค๋ฅธ ์ปฌ๋Ÿผ๋“ค๊ณผ์˜ ์—ฐ๊ด€์ด ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.


๐Ÿ’Ÿ ์ œ3์ •๊ทœํ™”

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 ์ปฌ๋Ÿผ ์‚ฌ์ด์˜ ์™ธ๋ž˜ํ‚ค ๊ด€๊ณ„๋ฅผ ํ†ตํ•ด ๋‘ ํ…Œ์ด๋ธ”์„ ์—ฐ๊ฒฐ์‹œํ‚ต๋‹ˆ๋‹ค.

๐Ÿ’Ÿ ๊ด€๊ณ„(Relationship)

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
)
  • employee_id๋Š” employee ํ…Œ์ด๋ธ”์˜ id๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์™ธ๋ž˜ํ‚ค์ด๋ฉฐ ๊ฐ๊ฐ์˜ ๊ธ‰์—ฌ๊ฐ€ ์–ด๋–ค ์ง์›์—๊ฒŒ ์†ํ•˜๋Š”์ง€ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
profile
๊ฐœ๋ฐœ์ž ์ค€๋น„์ƒ~

0๊ฐœ์˜ ๋Œ“๊ธ€