์ƒ์„ธ ์ปจํ…์ธ 

๋ณธ๋ฌธ ์ œ๋ชฉ

[๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค] DB์—์„œ FK ์„ค์ • ํ•˜์ง€ ์•Š๋Š” ์ด์œ ์™€ ๋ฌด๊ฒฐ์„ฑ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์•ˆ

CS/๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๐Ÿ’ฟ

by :ํ•ดํ”ผ๋ž˜๋น—๐Ÿพ 2024. 12. 26. 10:10

๋ณธ๋ฌธ

FK ์„ค์ •ํ•˜์ง€ ์•Š๋Š” ์ด์œ 

1. ์„ฑ๋Šฅ์ƒ์˜ ์ด์œ 

INSERT / UPDATE ์„ฑ๋Šฅ ์ €ํ•˜

FK ์ œ์•ฝ ์กฐ๊ฑด์„ ์„ค์ •ํ•˜๋ฉด
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์ฐธ์กฐ ๋ฌด๊ฒฐ์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๊ด€๋ จ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•ญ์ƒ ํ™•์ธํ•ด์•ผ ํ•˜๋ฏ€๋กœ

๋ฐ์ดํ„ฐ ์‚ฝ์ž…(insert)์ด๋‚˜ ๊ฐฑ์‹ (update) ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ๋‹ค.

 

๋”ฐ๋ผ์„œ, ๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๊ฐ€ ์ผ์–ด๋‚˜๋Š” ๊ฒฝ์šฐ FK๋กœ ์ธํ•œ ๋ฌด๊ฒฐ์„ฑ ๊ฒ€์‚ฌ ๋•Œ๋ฌธ์— ์ฒ˜๋ฆฌ ์†๋„๊ฐ€ ๋А๋ ค์งˆ ์ˆ˜ ์žˆ๋‹ค.

 

 

2. ๋ณต์žกํ•œ ์ฐธ์กฐ ๊ด€๊ณ„์™€ ์œ ์—ฐ์„ฑ ๋ถ€์กฑ

 

FK๊ฐ€ ๋งŽ์€ ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๋Š” ์„ค๊ณ„๊ฐ€ ๋ณต์žกํ•ด์ง€๊ณ , ์ด๋ฅผ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ํ™•์žฅํ•  ๋•Œ ์–ด๋ ค์›€์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ฐธ์กฐ ๋ฌด๊ฒฐ์„ฑ์„ ์œ ์ง€ํ•˜๋ ค๋ฉด ๋ถ€๋ชจ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•˜๊ธฐ ์ „์— ์ž์‹ ๋ฐ์ดํ„ฐ๋ฅผ ๋จผ์ € ์‚ญ์ œํ•ด์•ผ ํ•œ๋‹ค.

 

ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๊ฐ€ ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๊ฑฐ๋‚˜ ํ™•์žฅ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ, FK๋Š” ๋ถˆํ•„์š”ํ•œ ์ œ์•ฝ์ด ๋  ์ˆ˜ ์žˆ๋‹ค. 

 

 

FK๋กœ ์ธํ•ด ํ…Œ์ด๋ธ” ๊ฐ„ ์˜์กด์„ฑ์ด ๊ฐ•ํ•ด์ง€๋ฉฐ, ํ…Œ์ด๋ธ” ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„ ์ฆ๊ฐ€๋กœ ์ธํ•ด ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ๋‹ค.

 

3. ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ์˜ ์ œ์•ฝ

  • ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ๋ฐ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ
    ํ…Œ์ด๋ธ”์ด ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ถ„์‚ฐ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ, FK ์„ค์ •์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์—์„œ๋Š” ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•(์˜ˆ: ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ)์œผ๋กœ ๊ด€๋ฆฌํ•ด์•ผํ•œ๋‹ค.

 

4. ํ…Œ์ŠคํŠธ์™€ ๋ฐ์ดํ„ฐ ์ด๊ด€

  • ๋ฐ์ดํ„ฐ ์ด๊ด€(Migration)
    ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ๋กœ์šด ์Šคํ‚ค๋งˆ๋กœ ์ด๋™ํ•˜๊ฑฐ๋‚˜ ๋Œ€๋Ÿ‰์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ดˆ๊ธฐํ™”ํ•  ๋•Œ FK ์ œ์•ฝ ์กฐ๊ฑด์ด ์žˆ์œผ๋ฉด ๋ณต์žก๋„๊ฐ€ ์ฆ๊ฐ€ํ•œ๋‹ค.
  • ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ
    ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๊ฑฐ๋‚˜ ์กฐ์ž‘ํ•  ๋•Œ FK๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉด ์ž์œ ๋กญ๊ฒŒ ๋ฐ์ดํ„ฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์–ด๋ ต๋‹ค.

 

5. ์‹ค์ œ ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ

  • ๋ฌด๊ฒฐ์„ฑ์ด ํฌ๊ฒŒ ์ค‘์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ:
    ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์ด ์ƒ๋Œ€์ ์œผ๋กœ ๋œ ์ค‘์š”ํ•œ ์ƒํ™ฉ(์˜ˆ: ๋กœ๊ทธ ๋ฐ์ดํ„ฐ, ์บ์‹ฑ ๋ฐ์ดํ„ฐ ๋“ฑ)์—์„œ๋Š” FK๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ผ ์ˆ˜ ์žˆ๋‹ค.

 

 


์ฐธ์กฐ ๋ฌด๊ฒฐ์„ฑ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์•ˆ

1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ์—์„œ ๋ฐ์ดํ„ฐ ์‚ฝ์ž…/๊ฐฑ์‹ /์‚ญ์ œ ์‹œ ์ฐธ์กฐ ๋ฌด๊ฒฐ์„ฑ์„ ํ™•์ธํ•˜๋Š” ๋กœ์ง์„ ์ž‘์„ฑํ•œ๋‹ค. 

์˜ˆ๋ฅผ ๋“ค์–ด, ์ž์‹ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๊ธฐ ์ „์— ๋ถ€๋ชจ ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

 

2. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ์„ค์ •ํ•˜์—ฌ ์ฐธ์กฐ ๋ฐ์ดํ„ฐ์˜ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•œ๋‹ค.

๋ถ€๋ชจ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ญ์ œ๋˜๊ธฐ ์ „์— ๊ด€๋ จ ์ž์‹ ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค. 

 

CREATE OR REPLACE TRIGGER check_parent_exists
BEFORE INSERT ON child_table
FOR EACH ROW
BEGIN
  IF NOT EXISTS (
    SELECT 1
    FROM parent_table
    WHERE id = :NEW.parent_id
  ) THEN
    RAISE_APPLICATION_ERROR(-20001, 'Parent does not exist.');
  END IF;
END;

 

3. ๋ฐฐ์น˜ ์ž‘์—…์„ ํ†ตํ•œ ๋ฌด๊ฒฐ์„ฑ ์œ ์ง€ 

SELECT child_table.id
FROM child_table
LEFT JOIN parent_table
ON child_table.parent_id = parent_table.id
WHERE parent_table.id IS NULL;

 

4. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ORM ์‚ฌ์šฉ

@Entity
public class Child {
    @ManyToOne
    @JoinColumn(name = "parent_id", nullable = false)
    private Parent parent;
}

 

5. ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜ : ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋‚˜ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ํ™˜๊ฒฝ

 

6. ์ œ์•ฝ ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ…Œ์ด๋ธ” ์„ค๊ณ„

๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์„ ์•”์‹œ์ ์œผ๋กœ ์„ค๊ณ„ >>
๋ถ€๋ชจ/์ž์‹ ํ…Œ์ด๋ธ”์—์„œ ์ œ์•ฝ ์กฐ๊ฑด ์—†์ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋˜, ๋ฐ์ดํ„ฐ ๋ชจ๋ธ ์„ค๊ณ„๋ฅผ ํ†ตํ•ด ๋ฌด๊ฒฐ์„ฑ์„ ์•”์‹œ์ ์œผ๋กœ ์œ ์ง€ํ•œ๋‹ค.

728x90

๊ด€๋ จ๊ธ€ ๋”๋ณด๊ธฐ