λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
μ‹œλ„/ꡭ비지원

[D+32] DBμ΄μƒν˜„μƒ, μ •κ·œν™”

by πŸ‡λ°•λ΄‰λ΄‰πŸ‡ 2022. 11. 7.

 

 

ꡭ비지원 D+32

-  DBμ΄μƒν˜„μƒ, μ •κ·œν™” -

 


 

DBμ΄μƒν˜„μƒ

μš°λ¦¬κ°€ μΆ©λΆ„ν•œ λͺ¨λΈλ§κ³Όμ •μ„ κ±°μΉœν›„μ— 데이터λ₯Ό μƒμ„±ν–ˆμ„λ•Œ κ³Όμ—° ν”„λ‘œκ·Έλž¨μ΄ 잘 λŒμ•„κ°ˆκΉŒ?

정닡은 μ•„λ‹ˆλ‹€.

λ°”λ‘œ μ •κ·œν™”κ³Όμ •μ„ κ±°μΉ˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

μš°λ¦¬λŠ” μ •κ·œν™”κ³Όμ •μ„ 본격적으둜 μ•Œμ•„λ³΄κΈ° 전에 μ •κ·œν™”λ₯Ό κ±°μΉ˜μ§€ μ•ŠμœΌλ©΄ μ–΄λ– ν•œ μ΄μƒν˜„μƒμ΄ λ°œμƒλ˜λŠ”μ§€ μ•Œμ•„λ³΄μž.

 

• DB μ΄μƒν˜„μƒ (DB Anomaly)

- λ°μ΄ν„°μ˜ μ€‘λ³΅μœΌλ‘œ 인해 λ°μ΄ν„°μ˜ μ‚½μž…, μ‚­μ œ, 갱신을 ν•  경우 λ°œμƒλ˜λŠ” λΆ€μž‘μš©μ΄λ‹€.

- DBλ₯Ό λ§Œλ“€λ•Œ μ œλŒ€λ‘œ μ •κ·œν™” 처리λ₯Ό ν•˜μ§€ μ•ŠμœΌλ©΄ λ°œμƒλ  수 μžˆλ‹€.

- μ‚½μž…μ΄μƒ : 데이터 μ‚½μž… μ‹œ μ›μΉ˜ μ•Šμ€ 데이터λ₯Ό 같이 λ„£μ–΄μ•Ό ν•˜λŠ” μ΄μƒν˜„μƒμœΌλ‘œ 일반적으둜 관계λ₯Ό 잘λͺ» 맺을 λ•Œ λ°œμƒν•œλ‹€.

- μ‚­μ œμ΄μƒ : 데이터 μ‚­μ œμ‹œ λ‹€λ₯Έ λ°μ΄ν„°κΉŒμ§€ 같이 μ‚­μ œλ˜λŠ” μ΄μƒν˜„μƒ

- 갱신이상 : 데이터 μˆ˜μ •μ‹œ μ€‘λ³΅μœΌλ‘œ 인해 λ°μ΄ν„°μ˜ λΆˆμΌμΉ˜κ°€ λ°œμƒν•˜λŠ” μ΄μƒν˜„μƒ

 


μ •κ·œν™” (Normalization)

μ •κ·œν™”λŠ” κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€ μ„€κ³„μ‹œ 쀑볡을 μ΅œμ†Œν™”ν•˜κ³ , μ΄μƒν˜„μƒμ„ 방지 및 μ„±λŠ₯ κ°œμ„ μ„ μœ„ν•œ ν”„λ‘œμ„ΈμŠ€μ΄λ‹€.

μ •κ·œν™”μ—λŠ” 6단계가 μžˆλŠ”λ° ν•˜λ‚˜μ”© 단계λ₯Ό κ±°μ³λ‚˜κ°€λ©΄ DBκ°€ 잘 λ™μž‘λ˜κ³  ERDμ—μ„œλ„ λ¬Έμ œκ°€ λ°œμƒλ˜μ§€ μ•ŠλŠ”λ‹€.

총 6단계가 μ‘΄μž¬ν•˜μ§€λ§Œ 6λ‹¨κ³„κΉŒμ§€ κ°€λŠ” κ³Όμ •μ—μ„œ 3단계 μ΄ν›„λΆ€ν„°λŠ” 얻을 수 μžˆλŠ” 이점이 ν˜„μ €νžˆ 적어지기 λ•Œλ¬Έμ— 보톡은 3λ‹¨κ³„κΉŒμ§€λ§Œ ν•œλ‹€.

 

• 제 1μ •κ·œν™”

- λ°˜λ³΅λ˜λŠ” 속성을 μ œκ±°ν•˜μ—¬ λͺ¨λ“  속성이 μ›μž 도메인(μ›μžμ„±, Atomic columns)을 κ°€μ§ˆ 수 μžˆλ„λ‘ ν•˜λŠ” μ •κ·œν™”

Atomic Columns : 컬럼이 ν•˜λ‚˜μ˜ κ°’ / ν•˜λ‚˜μ˜ 의미λ₯Ό κ°€μ Έμ•Ό ν•œλ‹€.

- κΈ°μ‘΄ m:n의 관계λ₯Ό λ§€ν•‘ν…Œμ΄λΈ”μ„ ν†΅ν•΄μ„œ 1:n으둜 λ³€κ²½μ‹œμΌœ μ€€λ‹€.

 

ν•΄λ‹Ή ν…Œμ΄λΈ”μ—μ„œ tagμ»¬λŸΌμ„ 보면 λ‘œμš°λ°μ΄ν„°μ—λŒ€ν•œ 값이 ν•˜λ‚˜κ°€ μ•„λ‹ˆλΌ μ—¬λŸ¬κ°œμ˜ tag값을 가지고 μžˆλŠ” 것을 확인할 수 μžˆλ‹€.

μ΄λŠ” μ›μžμ„±μ— μœ„λ°°λ˜λŠ” κ²ƒμœΌλ‘œ tag의 값을 ν•˜λ‚˜λ‘œ 지정해주어야 ν•œλ‹€.

 

문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ¨Όμ € tagμ»¬λŸΌμ„ κΈ°μ‘΄ ν…Œμ΄λΈ”κ³Ό λΆ„λ¦¬μ‹œμΌœμ€€ λ‹€μŒ λ”°λ‘œ tagν…Œμ΄λΈ”μ„ μž‘μ„±ν•΄μ€€λ‹€.

이후에 κΈ°μ‘΄ ν…Œμ΄λΈ”μ˜ idκ³Ό tag의 idλ₯Ό μ—°κ²°μ‹œμΌœμ€„ 수 μžˆλŠ” λ§€ν•‘ν…Œμ΄λΈ”μ„ λ§Œλ“€μ–΄μ£Όλ©΄ μ»¬λŸΌμ•ˆμ— μ›μžμ„±μ— μœ„λ°°λ˜λŠ” λ¬Έμ œλŠ” ν•΄κ²°λ˜λŠ” 것이닀.

 

• 제 2μ •κ·œν™”

- 제 1μ •κ·œν˜•μ„ λ§Œμ‘±ν•˜λŠ” ν…Œμ΄λΈ”μ—μ„œ λΆ€λΆ„ 쒅속속을 μ œκ±°ν•˜μ—¬ μ™„μ „ ν•¨μˆ˜ 쒅속성을 λ§Œμ‘±ν•˜λŠ” μ •κ·œν˜• (λΆ€λΆ„ν•¨μˆ˜μ’…μ†μ„ 제거)

- 이쀑킀(=쀑볡킀)λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ„ 경우 제 2μ •κ·œν™”λŠ” ν•˜μ§€ μ•ŠλŠ”λ‹€.

- 쀑볡킀 : ν‚€κ°€ μ•„λ‹Œ 것을 μƒλŒ€λ‘œ 2개 이상 μ‘°ν•©ν•΄ ν‚€λ₯Ό λ§Œλ“ κ²ƒ

- ν•¨μˆ˜μ μ’…μ† : Xκ°€ λ…λ¦½λ³€μˆ˜, Yκ°€ μ’…μ†λ³€μˆ˜λΌκ³  ν• λ•Œ YλŠ” X에 μ’…μ†λ˜λŠ” κ²ƒμœΌλ‘œ, λͺ¨λ“  데이터가 킀에 μ’…μ†λ˜λŠ” 것을 μ˜λ―Έν•œλ‹€.

 

ν•΄λ‹Ή ν…Œμ΄λΈ”μ—μ„œ titleκ³Ό typeλ₯Ό μ΄μ€‘ν‚€λ‘œ μ§€μ •ν–ˆμ„λ•Œ, ν…Œμ΄λΈ”μ—μ„œ λ§Œμ•½ titleκ³Ό type값이 λ³€ν• λ•Œ priceμ»¬λŸΌμ€ 두 킀에 λŒ€ν•΄ μ’…μ†λ˜μ–΄ λ³€λ™λ˜μ§€λ§Œ, desc, created, author_id, author_name같은 κ²½μš°λŠ” titleν‚€μ—λ§Œ μ’…μ†λ˜μ–΄ μžˆλŠ” 것을 확인할 수 μžˆλ‹€.

μ΄λŠ” μ™„μ „ν•¨μˆ˜ 쒅속이 μ•„λ‹Œ λΆ€λΆ„μ’…μ†ν•¨μˆ˜μ΄λ―€λ‘œ μ™„μ „ν•¨μˆ˜ μ’…μ†μœΌλ‘œ λ³€κ²½ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€.

 

λ¨Όμ € priceλŠ” titleκ³Ό type에 μ™„μ „ μ’…μ†λ˜κΈ° λ•Œλ¬Έμ— κ·ΈλŒ€λ‘œ μœ μ§€ν•˜λ©°, titleμ—λ§Œ μ’…μ†λ˜λŠ” λ‚˜λ¨Έμ§€ μ»¬λŸΌμ€ titleκ³Ό ν•¨κ»˜ λ”°λ‘œ λΆ„λ¦¬ν•œλ‹€.

μ΄κ³Όμ •μ—μ„œ λ°œμƒλ˜λŠ” 쀑볡값이 제거되고 λ‚˜λ©΄ μ΅œμ’…μ μœΌλ‘œ 두 ν…Œμ΄λΈ”λ‘œ λΆ„λ¦¬λ˜λŠ” 것을 확인할 수 있으며, 각 두 ν…Œμ΄λΈ”μ΄ 각 킀에 μ™„μ „ μ’…μ†λ˜λŠ” 것을 확인할 수 μžˆλ‹€.

 

• 제 3μ •κ·œν™”

- μ΄ν–‰ν•¨μˆ˜ 쒅속성을 제거(No transitive dependencies)ν•˜λŠ” μ •κ·œν™”

- μ΄ν–‰ν•¨μˆ˜ 쒅속성 : X, Y, Zκ°€ μžˆμ„ λ•Œ X→Y, Y→Z일 경우 X→Zκ°€ 성립될 λ•Œ μ΄ν–‰ν•¨μˆ˜ 쒅속이라고 ν•œλ‹€.

 

ν•΄λ‹Ήν…Œμ΄λΈ”μ€ title이 킀이닀.

title을 μ œμ™Έν•œ λ‚˜λ¨Έμ§€ μ»¬λŸΌμ„ μ‚΄νŽ΄λ³΄λ©΄ desc, created, author_idλŠ” title에 μ’…μ†μ μ΄μ§€λ§Œ author_name은 title이 μ•„λ‹Œ author_id에 쒅속적이닀.

즉 이 ν…Œμ΄λΈ”μ€ 쒅속적인 ν…Œμ΄λΈ”μ΄ μ•„λ‹Œ 이행적인 κ΄€κ³„λ‘œ μ€‘λ³΅μ΄λΌλŠ” λ¬Έμ œκ°€ λ°œμƒλœλ‹€.

 

문제λ₯Ό ν•΄κ²°ν•΄ μ£ΌκΈ° μœ„ν•΄μ„œλŠ” 이행적관계λ₯Ό μœ λ°œν•˜λŠ” author_id와 author_name을 λ‹€λ₯Έ ν…Œμ΄λΈ”λ‘œ λ‚˜λˆ„λ©΄ 두 ν…Œμ΄λΈ”μ€ 각자 이행적관계가 μ•„λ‹Œ 쒅속적관계인 ν…Œμ΄λΈ”μ΄ 된 것을 확인할 수 μžˆλ‹€.

 

• μš”μ•½

μ •κ·œν™”λ₯Ό 진행할 λ•Œ μ£Όμ˜ν•΄μ•Όν•  것은 μ •κ·œν™”λ₯Ό ν• μˆ˜λ‘ table의 κ°œμˆ˜κ°€ μ¦κ°€ν•œλ‹€.

κ·Έλ ‡κ²Œ 되면 join을 κ³Όλ‹€μ‚¬μš©ν•  수 μžˆμ–΄ 이λ₯Ό 막기 μœ„ν•΄ 였히렀 table의 개수λ₯Ό 쀄이기 μœ„ν•΄ μ •κ·œν™”λ₯Ό 덜 진행할 μˆ˜λ„ μžˆλ‹€.

즉, 무쑰건 λ§Žμ€ μ •κ·œν™”κ°€ μ’‹λ‹€κ³  단정지을 수 없을 λΏλ”λŸ¬ λΉ„μ¦ˆλ‹ˆμŠ€μ— λ§žμΆ°μ„œ μ •κ·œν™”λ₯Ό μ§„ν–‰ν•˜λŠ”κ²ƒμ΄ κ°€μž₯ λ°”λžŒμ§ν•˜κΈ° λ•Œλ¬Έμ— 잘 κΈ°μ–΅ν•΄μ•Όν•œλ‹€.

 

 

λ°˜μ‘ν˜•

λŒ“κΈ€