
κ²μν νλ‘μ νΈμμ νμκ³Ό κ²μκΈμ λλμ΄ μ€κ³νλ©° PKμ FKλ₯Ό μ§μ μ¬μ©ν΄λ΄€μ΄μ. μ€μ΅ μ€μλ 'μ μ΄λ° μ μ½ μ‘°κ±΄μ΄ κΌ νμνμ§?'λΌλ κ³ λ―Όλ νμ§λ§, λ°μ΄ν°λ₯Ό μ°κ²°νκ±°λ μ€λ₯λ₯Ό λ§λ λ° μμ΄ μ λ§ μ€μν μν μ νλ€λ κ±Έ νμ€ν λλ μ μμμ΄μ. κ°λ μ 리μ ν¨κ» μ€μ΅ κ²½νλ ν¨κ» λ΄μλ΄€μ΅λλ€!!
κΈ°λ³Έ ν€(Primary Key)λ ν
μ΄λΈμμ κ° ν(row)μ κ³ μ νκ² μλ³ν μ μλλ‘ λ³΄μ₯νλ μ΄(컬λΌ)μ΄μμ.
NULL κ°μ΄ λ€μ΄κ° μ μκ³ , μ€λ³΅λ νμ©λμ§ μμμ. ν ν
μ΄λΈμ λ°λμ νλλ§ μ‘΄μ¬ν μ μμ£ .
CREATE TABLE Member (
id INT PRIMARY KEY,
name VARCHAR(50),
email VARCHAR(100)
);
π§ λΉμ νμλ©΄, κΈ°λ³Έ ν€λ 'μ£Όλ―Όλ±λ‘λ²νΈ'μμ.
κ°κ°μ μ¬λμ΄ νλμ©λ§ κ°μ§κ³ μμ΄μΌ νκ³ , μ λ μ€λ³΅λλ©΄ μ λμ£ !
PKκ° μμ΄μΌ κ° λ°μ΄ν°λ₯Ό ꡬλΆν μ μκ³ , ν
μ΄λΈμμ μ νν μνλ λ°μ΄ν°λ₯Ό μ°Ύμ μ μμ΄μ.
λν μλμΌλ‘ μΈλ±μ€κ° μμ±λκΈ° λλ¬Έμ κ²μ μλμλ μ΄μ μ΄ μμ΄μ.
μΈλ ν€(Foreign Key)λ λ€λ₯Έ ν
μ΄λΈμ κΈ°λ³Έ ν€λ₯Ό μ°Έμ‘°νλ μ΄μ΄μμ.
λ ν
μ΄λΈ κ°μ κ΄κ³λ₯Ό λ§Ίμ΄μ£Όλ μ°κ²° κ³ λ¦¬ μν μ νμ£ .
CREATE TABLE Post (
id INT PRIMARY KEY,
title VARCHAR(100),
content TEXT,
member_id INT,
FOREIGN KEY (member_id) REFERENCES Member(id)
);
πͺ’ λΉμ νμλ©΄, μΈλ ν€λ 'λ€λ₯Έ ν μ΄λΈμ μ‘΄μ¬μ μ°κ²°λλ λ€λ¦¬'μμ.
κ²μκΈ ν μ΄λΈμμ member_idκ° Member ν μ΄λΈμ idλ₯Ό κ°λ¦¬ν€λ μμ΄μ£ .
μ΄λ κ² FKλ₯Ό μ§μ νλ©΄, μ‘΄μ¬νμ§ μλ νμ IDλ‘λ κ²μκΈμ λ±λ‘ν μ μκ² λμ΄
λ°μ΄ν°μ μ ν©μ±(무결μ±)κ³Ό λ
Όλ¦¬μ μ°κ²°μ΄ 보μ₯λ©λλ€.
λ°μ΄ν°μ μ ν©μ±(무결μ±) 보μ₯
β PKλ μ€λ³΅λ κ° μμ΄ κ°κ°μ λ°μ΄ν°λ₯Ό μ νν ꡬλΆνκ² ν΄μ€μ.
β FKλ μ‘΄μ¬νμ§ μλ λ°μ΄ν°λ₯Ό μ°Έμ‘°νμ§ λͺ»νκ² λ§μμ€μ.
ν
μ΄λΈ κ°μ κ΄κ³ μ μ
β νμκ³Ό κ²μκΈμ²λΌ, 1:N κ΄κ³λ₯Ό λͺ
νν ννν μ μμ΄μ.
ORM(JPA)κ³Όμ μ°κ³μ±
β Java κ°μ κ°μ²΄μ§ν₯ μΈμ΄μμ μ°κ΄ κ΄κ³λ₯Ό λ§ΊμΌλ €λ©΄ DBμλ FKκ° μ€μ λμ΄ μμ΄μΌ ν΄μ.
π PK/FK μμ΄ λ°μ΄ν°λ₯Ό μ μ₯νλ©΄ κ΅¬μ‘°κ° ννΈλ¬μ§κ³ ,
λμ€μ μμ , μμ , κ²μμμ ν° μ€λ₯κ° λ°μν μ μμ΄μ.
-- νμ ν
μ΄λΈ μμ±
-- κ° νμμ κ³ μ ν id(PK)λ₯Ό κ°μ§λ©°, nameμ λ°λμ μ
λ ₯λκ³ (emailλ μ€λ³΅ λΆκ°)
CREATE TABLE Member (
id INT PRIMARY KEY, -- κΈ°λ³Έ ν€: μ€λ³΅ λΆκ° + NULL λΆκ°
name VARCHAR(50) NOT NULL, -- μ΄λ¦μ λ°λμ μ
λ ₯λμ΄μΌ ν¨
email VARCHAR(100) UNIQUE NOT NULL -- μ΄λ©μΌμ μ€λ³΅λλ©΄ μ λ¨
);
-- κ²μκΈ ν
μ΄λΈ μμ±
-- κ²μκΈλ§λ€ κ³ μ ν idλ₯Ό κ°κ³ , λκ° μΌλμ§λ₯Ό member_id(FK)λ₯Ό ν΅ν΄ μ°κ²°
CREATE TABLE Post (
id INT PRIMARY KEY, -- κ²μκΈ κ³ μ μλ³μ
title VARCHAR(100) NOT NULL, -- μ λͺ© νμ
content TEXT, -- λ΄μ©μ μ΅μ
member_id INT NOT NULL, -- μμ±μ μ 보 (Memberμ id μ°Έμ‘°)
FOREIGN KEY (member_id) REFERENCES Member(id) -- FK μ€μ : μ‘΄μ¬νλ νμλ§ κ°λ₯
);
-- κ²μκΈ λ±λ‘ μμ (μ μ)
-- λ¨Όμ νμ μ 보λ₯Ό μ
λ ₯νκ³ , ν΄λΉ νμμ id(1)λ‘ κ²μκΈμ λ±λ‘
INSERT INTO Member (id, name, email) VALUES (1, 'νκΈΈλ', 'hong@example.com');
INSERT INTO Post (id, title, content, member_id) VALUES (1, 'μλ
νμΈμ', '첫 κΈμ΄μμ', 1);
-- κ²μκΈ λ±λ‘ μμ (μ€ν¨)
-- μλ νμ λ²νΈ(99)λ‘ κ²μκΈμ λ±λ‘νλ©΄ μΈλ ν€ μ μ½ μ‘°κ±΄ μλ°μΌλ‘ μ€λ₯ λ°μ
INSERT INTO Post (id, title, content, member_id) VALUES (2, 'μλ¬ λ°μ', 'μ΄κ±΄ μ€ν¨ν κ±°μμ', 99);
β μ‘΄μ¬νμ§ μλ νμ IDλ₯Ό μ°Έμ‘°νλ €κ³ νλ©΄ μ€λ₯κ° λ°μν΄μ. FKκ° λ§μμ£Όλ λλΆμ΄μ£ !
π μ΄λ κ² PKμ FKκ° ν¨κ» μμ΄μΌ λ°μ΄ν° κ°μ μ°κ²° κ΄κ³λ₯Ό μ νν μ μ§ν μ μμ΅λλ€.
foreign key constraint μλ¬κ° λ°μν΄μ.ON DELETE CASCADE μ΅μ
μ κ³ λ €ν μ μμ΄μ.β οΈ ν μ΄λΈ κ° μ°κ΄κ΄κ³λ₯Ό λ§Ίμμλ‘ κ΅¬μ‘°κ° λ³΅μ‘ν΄μ§κΈ° λλ¬Έμ, μ€κ³ μ΄κΈ°μ λͺ νν κ΄κ³ μ μκ° μ€μν©λλ€!
| νλͺ© | μ€λͺ |
|---|---|
| PK | κ° νμ κ³ μ νκ² μλ³νλ μ΄. μ€λ³΅ λΆκ°, NULL λΆκ° |
| FK | λ€λ₯Έ ν μ΄λΈμ PKλ₯Ό μ°Έμ‘°. λ°μ΄ν° κ° κ΄κ³ μ°κ²° |
| νμμ± | λ¬΄κ²°μ± λ³΄μ₯, κ΄κ³ν ꡬ쑰 νν, ORM λ§€νμ νμ |
| μ£Όμμ | FK μ°Έμ‘° λμμ λ°λμ μ‘΄μ¬ν΄μΌ νλ©°, PKλ ν μ΄λΈλΉ νλλ§ μ€μ κ°λ₯ |
π§© μ 리νμλ©΄, PKλ βλκ΅°μ§ μλ³β, FKλ βλꡬμ μ°κ²°βμ΄μμ!
μ²μμ FK μμ΄λ λ°μ΄ν°λ§ λ£μΌλ©΄ λλ κ±° μλκ° μΆμλλ°, λ§μ μλ νμ λ²νΈλ‘ κΈμ μ°κ² λλ μν©μ 보λκΉ, 'μ, μ΄κ±Έ μ μ°λ©΄ μ΄λ° λ¬Έμ κ° μκΈ°λꡬλ!' νκ³ λ°λ‘ μ€κ°ν μ μμμ΄μ.
μ§μ μ€μ΅νλ©΄μ μ€λ₯λ λλ³΄κ³ , μ μ΄λ° μ μ½ μ‘°κ±΄μ΄ νμνμ§ κ³ λ―Όλ ν΄λ³΄λκΉ
PKμ FKκ° λ¨μν κ·μΉμ΄ μλλΌ λ°μ΄ν° νλ¦μ μ§μΌμ£Όλ μ€μν μ₯μΉλΌλ κ±Έ μκ² λμ΄μ.