[SQL] ์™ธ๋ž˜ํ‚ค(Foreign Key)

[์›๋ณธ ๋งํฌ]

์™ธ๋ž˜ํ‚ค๋Š” ํ…Œ์ด๋ธ”์—์„œ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์˜ ๊ฐ’์„ ์ฐธ์กฐํ•  ๋•Œ, ์ด๋ฅผ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

์“ฐ์ง€ ์•Š์•„๋„ ์ฐธ์กฐ๋ฅผ ํ•˜๋Š” ๊ฒƒ ์ž์ฒด์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์ง€๋งŒ, ์ •ํ•ฉ์„ฑ์„ ๊ฐ•์กฐํ•  ์ˆ˜ ์žˆ๊ณ , ์ฐธ์กฐ๋Œ€์ƒ๊ฐ’์ด ๋ฐ”๋€Œ๋Š” ๊ฒƒ์— ๋Œ€ํ•ด์„œ ๋ฌด์–ธ๊ฐ€ ํ™•์‹คํ•œ ๋ณด์žฅ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

์„ฑ๋Šฅ ๋•Œ๋ฌธ์— ์ด๊ฑธ ์จ์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ์‚ฌ๋žŒ๋“ค๋งˆ๋‹ค ์ข€ ์˜๊ฒฌ์ด ๊ฐˆ๋ฆฌ๋Š” ๋ถ€๋ถ„์ด ์žˆ๋Š”๋ฐ, ์ผ๋‹จ ๊ทธ๋Ÿฐ๊ฑด ์ฐจ์น˜ํ•˜๊ณ  ๊ธฐ๋Šฅ์ ์ธ ๋ถ€๋ถ„๋ถ€ํ„ฐ ๋‹ค๋ค„๋ณด๊ฒ ๋‹ค.

๊ฒŒ์‹œํŒ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž์™€ ํฌ์ŠคํŠธ์— ๋Œ€ํ•œ ํ…Œ์ด๋ธ”์„ ์„ค๊ณ„ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ฒ ๋‹ค.
์™ธ๋ž˜ํ‚ค๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ  ์ง ๋‹ค๋ฉด ๋Œ€์ถฉ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ตฌ์กฐ๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.

-- ์‚ฌ์šฉ์ž ํ…Œ์ด๋ธ”
create table tb_user
(
    id serial, 
    name text,
    primary key(id)
);

-- ์‚ฌ์šฉ์ž๊ฐ€ ์ž‘์„ฑํ•œ ํฌ์ŠคํŠธ ํ…Œ์ด๋ธ”
create table tb_post
(
    id serial,
    title text,
    content text,
    writer_id int,
    primary key(id)
);

์—ฌ๊ธฐ์„œ tb_post์˜ writer_id ์ปฌ๋Ÿผ์ด ๋ฐ”๋กœ tb_user์˜ id๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์‚ฌ์‹ค์ƒ์˜ ์™ธ๋ž˜ํ‚ค ์ปฌ๋Ÿผ์ด๋‹ค.
๋”ฐ๋กœ ์™ธ๋ž˜ํ‚ค ์„ค์ •์„ ํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋ƒฅ ๊ทธ๋•Œ๊ทธ๋•Œ ์กฐ์ธํ•ด์„œ ์จ๋„ ์‚ฌ์šฉ์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค.

ํ•˜์ง€๋งŒ ์ค‘๊ฐ„์— ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” tb_user์˜ ๊ฐ’์ด ๊ฐ‘์ž๊ธฐ ์‚ญ์ œ๋˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝ๋ผ๋„ ์ง๊ด€์ ์œผ๋กœ ํŒŒ์•…ํ•˜๊ณ  ๋Œ€์‘ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.
tb_user์˜ ๊ฐ’์„ ์‚ญ์ œํ• ๋•Œ๋งˆ๋‹ค ์ง์ ‘ ์ด๊ฑธ ์ฐธ์กฐํ•˜๋Š” tb_post ๋“ฑ์˜ ํ…Œ์ด๋ธ”์—์„œ writer_id ๊ฐ’์„ ์–ด๋–ป๊ฒŒ ํ• ์ง€ ์ˆ˜๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์ค˜์•ผ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
๊ฒŒ๋‹ค๊ฐ€ ์ฐธ์กฐํ‚ค๊ฐ’์œผ๋กœ ์กด์žฌํ•˜์ง€๋„ ์•Š๋Š” ์ด์ƒํ•œ ํ‚ค๊ฐ’์„ ๋„ฃ๋Š” ๊ฒƒ๋„ ๋ง‰์„ ์ˆ˜๊ฐ€ ์—†๋‹ค.

์™ธ๋ž˜ํ‚ค ๊ธฐ๋Šฅ์€ ์ด์— ๋Œ€ํ•œ ํŽธ์˜๋ฅผ ์ œ๊ณตํ•ด์ค€๋‹ค.
์™ธ๋ž˜ํ‚ค์˜ ์„ ์–ธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ๋‹ค.
**foreign key(ํ˜„์žฌ ํ…Œ์ด๋ธ” ์ปฌ๋Ÿผ) references tb_user(์ฐธ์กฐํ•  ํ…Œ์ด๋ธ” ์ปฌ๋Ÿผ)**์ด๋‹ค.

-- ์‚ฌ์šฉ์ž ํ…Œ์ด๋ธ”
create table tb_user
(
    id serial, 
    name text,
    primary key(id)
);

-- ์‚ฌ์šฉ์ž๊ฐ€ ์ž‘์„ฑํ•œ ํฌ์ŠคํŠธ ํ…Œ์ด๋ธ”
create table tb_post
(
    id serial,
    title text,
    content text,
    writer_id int,
    primary key(id),
    foreign key(writer_id) references tb_user(id)
);

๊ทธ๋Ÿผ ์ผ๋‹จ ์ฐธ์กฐ๊ด€๊ณ„๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ๋„ ์ง๊ด€์ ์ด๊ณ , ์•„๋ž˜์™€ ๊ฐ™์€ ์ด์ƒํ•œ ์ฐธ์กฐ๊ฐ’ ์‚ฝ์ž…๋„ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค.




ON DELETE ์†์„ฑ

์ด๊ฑด ์™ธ๋ž˜ํ‚ค๋กœ ์‚ญ์ œ์— ๋Œ€ํ•œ ์ œ์•ฝ์ด๋‚˜ ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ๊ฑธ์–ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

์˜ˆ์‹œ ํ…Œ์ด๋ธ”์˜ ๊ฒฝ์šฐ๋ฅผ ๋“ค๋ฉด, tb_user ๊ฐ’์„ deleteํ• ๋•Œ, ํ•ด๋‹น ๊ฐ’์„ ์ฐธ์กฐํ•˜๋Š” tb_post๊ฐ€ ์žˆ์„ ๋•Œ ์–ด๋–ป๊ฒŒ ๋ฐ˜์‘ํ• ์ง€๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

Cascade, Set null, Set default, Restrict, No Action์˜ ๋‹ค์„ฏ๊ฐ€์ง€ ์˜ต์…˜์„ ์ œ๊ณตํ•˜๊ณ , ๊ธฐ๋ณธ๊ฐ’์€ No Action์ด๋‹ค.

cascade๋Š” tb_user๊ฐ€ ์‚ญ์ œ๋˜๋ฉด ์ฐธ์กฐํ•˜๋Š” tb_post๋„ ์ „๋ถ€ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ด๊ณ ,
set null์€ writer_id๋ฅผ null๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ,
set detault๋Š” writer_id๋ฅผ ๋””ํดํŠธ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ,
restrict๋Š” ๊ทธ๋‚ญ tb_user์˜ ์‚ญ์ œ๋ฅผ ๋ง‰๋Š” ๊ฒƒ์ด๋‹ค.

restrict์˜ ๊ฒฝ์šฐ์—๋งŒ ํ•œ๋ฒˆ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณด๊ฒ ๋‹ค.
์šฐ์„  on delete๋ฅผ ์ ์šฉํ•ด์ค€๋‹ค.

๋งŒ์•ฝ ์ด๋ ‡๊ฒŒ ๊ฐ’์ด ์žˆ๊ณ 

์ฐธ์กฐ๋˜๊ณ  ์žˆ๋Š” tb_user 1์„ ์‚ญ์ œํ•˜๋ ค๊ณ  ํ•œ๋‹ค๋ฉด

์›์ฒœ ์ฐจ๋‹จํ•ด๋ฒ„๋ฆฐ๋‹ค.




ON UPDATE ์†์„ฑ

์ด๊ฒƒ๋„ ON DELETE์™€ ๋งฅ๋ฝ์ด ๊ฐ™๊ณ , ์ œ๊ณต๋˜๋Š” ์†์„ฑ๋„ Cascade, Set null, Set default, Restrict, No Action ๋‹ค์„ฏ๊ฐœ๋กœ ๋™์ผํ•˜๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ No Action์ด๋‹ค.

์ด๊ฑด ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ์ปฌ๋Ÿผ๊ฐ’์ด ๋ฐ”๋€” ๊ฒฝ์šฐ์—. ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ์ด ๊ฒฝ์šฐ์—” tb_user์˜ id๊ฐ’์ด ๋ฐ”๋€” ๊ฒฝ์šฐ์— tb_post์˜ writer_id๊ฐ’์„ ์–ด๋–ป๊ฒŒ ํ• ์ง€๋ฅผ ์ง€์ •ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

cascade๋Š” ๊ทธ๋ƒฅ ๋ฐ”๊พผ ๊ฐ’์œผ๋กœ tb_post์—์„œ๋„ ๋‹ค์‹œ ๋˜‘๊ฐ™์ด ๋ฐ”๊ฟ”์ฃผ๊ณ ,
set null์€ writer_id๋ฅผ null๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ,
set detault๋Š” writer_id๋ฅผ ๋””ํดํŠธ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ,
restrict๋Š” ๊ทธ๋‚ญ ๋ณ€๊ฒฝ์„ ๋ง‰๋Š” ๊ฒƒ์ด๋‹ค.

์ด๋ฒˆ์—” cascade๋กœ ํ•œ๋ฒˆ ๋Œ๋ ค๋ณด๊ฒ ๋‹ค.

๋ฐ์ดํ„ฐ๋Š” ์ด์ „๊ณผ ๋™์ผํ•˜๊ฒŒ ๋“ค์–ด์žˆ๋‹ค.

๋งŒ์•ฝ 1์˜ ๊ฐ’์„ 11111๋กœ ๋ฐ”๊พผ๋‹ค๋ฉด

์ฐธ์กฐํ•˜๊ณ  ์žˆ๋˜ tb_post์—์„œ๋„ ๋ฐ”๋€” ๊ฒƒ์ด๋‹ค.

๋Œ€์ถฉ ๊ทธ๋•Œ๊ทธ๋•Œ ์ž˜ ์“ฐ๋ฉด ๋œ๋‹ค.


์ฐธ์กฐ
https://bamdule.tistory.com/45
https://stackoverflow.com/questions/39388912/does-adding-a-foreign-key-to-an-indexed-column-boost-performance
https://www.postgresql.org/docs/9.4/performance-tips.html