Understanding Database - SQL ๊ธฐ์ดˆ ์ด์ •๋ฆฌ

2023. 1. 23. 05:32ใ†Data science/Database

๋ฐ˜์‘ํ˜•

SQL vs NoSQL

SQL์€ ํ…Œ์ด๋ธ” ํ˜•์‹, NoSQL์€ ์ •ํ˜•ํ™”๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ˜•์‹. 

SQL์˜ ๊ธฐ๋ณธ ๊ฐœ๋…์ธ ํ…Œ์ด๋ธ”, ๊ด€๊ณ„์˜ ๊ฐœ๋…์„ NoSQL์—์„œ๋Š” ์ฝœ๋ ‰์…˜, ๊ทธ๋ฆฌ๊ณ  ์ฐธ์กฐ ํ˜น์€ ๋‚ด์žฅํ˜•์˜ ๊ฐœ๋… ์ •๋„๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค. 

SQL์€ ์ •ํ˜•ํ™”๋˜์–ด ์žˆ์–ด์„œ ๋จธ๋ฆฟ์†์— ์‚ฌ์‹ค ๊ตฌ๋„๋ฅผ ๊ทธ๋ฆฌ๋Š” ๊ฒƒ์ด ์ƒ๋Œ€์ ์œผ๋กœ ํŽธํ•˜๋‹ค. ๋ฐ˜๋ฉด, NoSQL์€ ๊ตฌ์กฐ๊ฐ€ ์ •ํ˜•ํ™”๋˜์–ด ์žˆ์ง€ ์•Š์•„์„œ ๋จธ๋ฆฟ์†์— ๊ตฌ์กฐ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๊ทธ๋ฆฌ๊ธฐ๊ฐ€ ์ฒ˜์Œ์— ์‰ฝ์ง€ ์•Š๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋กœ ์ธํ•œ ์žฅ์ ์€ ํ™•์žฅ์„ฑ์— ์žˆ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค. 

์˜ˆ๋ฅผ ๋“ค์–ด SQL์—์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ •ํ•ด์ง„ ํ…Œ์ด๋ธ”์˜ ํ˜•ํƒœ ์•ˆ์— ๋„ฃ์–ด์•ผ๋งŒ ํ•˜์ง€๋งŒ NoSQL์—์„œ๋Š” ๊ทธ๋Ÿฐ ๋ถ€๋ถ„์„ ์ œ์•ฝ์กฐ๊ฑด์œผ๋กœ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ํ˜น์€ ์ œ์•ฝ ์กฐ๊ฑด ์—†์ด ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์˜ ์ฝœ๋ ‰์…˜(SQL๋กœ ์น˜๋ฉด ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”)์— ๋ชฝ๋•…๊ทธ๋ฆฌ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. 

ํ•˜๋‚˜์˜ ์ปฌ๋ ‰์…˜์— ๋ชฝ๋•… ๊ทธ๋ฆฌ ์ง‘์–ด๋„ฃ์–ด์„œ ์ข‹์€ ์ ์€ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— ํ•œ ๊ตฐ๋ฐ์„œ ๋‹ค ์ฐพ์•„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ. 

๋ฌด์Šจ ๋ง์ด๋ƒ๋ฉด ๋‚˜์ค‘์— ์›ํ•˜๋Š” ๊ฑธ ์ฐพ์„ ๋•Œ SQL์˜ ๊ฒฝ์šฐ ํ…Œ์ด๋ธ” ์กฐ์ธ์ด๋ผ๋Š” ๊ฒƒ์„ ํ•ด์„œ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์— ์žˆ๋Š” ๊ฑธ ์ฐพ์•„ ์ฐพ์•„ ๊ฐ€์•ผํ•˜๋Š” ๋ฐ˜๋ฉด, NoSQL์€ ๋ณด๋ถ€์ƒ ๊ฐ€๋ฐฉ์ฒ˜๋Ÿผ ์›ํ•˜๋Š” ๊ฑฐ ๊ด€๋ จ๋œ ๊ฒŒ ํ•œ ๊ฐ€๋ฐฉ์•ˆ์— ๋‹ค ์žˆ์œผ๋‹ˆ ํ•œ๋ฒˆ์˜ ์ฟผ๋ฆฌ๋กœ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ๊ฐ•์ ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

Figure 1. ๋Œ€์ถฉ ๊ทธ๋ฆฐ SQL ๊ณผ NoSQL ํ˜•์‹์˜ ์ฐจ์ด


Data Base, ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๋ž€ ์˜๋ฏธ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋“ค์„ ๊ตฌ์กฐํ™”๋œ ๋ชจ์Œ์ด๋‹ค. (Collection) 

 

๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์˜ ์—ญ์‚ฌ 

1960-70 ๋…„๋Œ€: ํšŒ์‚ฌ๋“ค์˜ ์‚ฌ๋‚ด์˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜

- SQL, COBOL ๊ฐ™์€ ๊ฒƒ๋“ค์ด ๊ฐ ํšŒ์‚ฌ ๋งˆ๋‹ค ์‚ฌ์šฉ๋˜์—ˆ์œผ๋ฉฐ ์ •ํ˜•ํ™”๋œ ๊ธฐ์ค€ ๊ฐ™์€ ๊ฒƒ์ด ๋”ฐ๋กœ ์—†์—ˆ๋‹ค. ๊ทธ ๋‹น์‹œ ๋ฐ์ดํ„ฐ์˜ ์ €์žฅ ๋งค์ฒด๋Š” ์ปดํ“จํ„ฐ์˜ ํ…Œ์ดํ”„ ํ˜•ํƒœ์— ์ €์žฅ๋˜์—ˆ๊ธฐ์— ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ์†๋„๊ฐ€ ๋Š๋ ธ์œผ๋ฉด ์ˆœ์ฐจ์  ์ธ๋ฑ์Šค๋‚˜ ๊ฐ„๋‹จํ•œ ์ธ๋ฑ์Šค๊ฐ€ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜์—ˆ๋‹ค. 

1980-2000 ๋…„๋Œ€์— ๋“ค์–ด ์ด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๋“ค์ด ๋” ๋„“๊ฒŒ ์ƒ์šฉ๋˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. SQL ํ‘œ์ค€(1986), MS Access, ๊ด€๊ณ„ํ˜• ๋ชจ๋ธ๋“ค์˜ ๋ฐœ์ „๋˜๊ธฐ ์‹œ์ž‘ํ—€๊ณ  ์ƒ์—…์šฉ์ด๋‚˜ ๋ฏธ๋””์–ด๋ฅผ ์œ„ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋“ค์ด ์‚ฌ์šฉ๋˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. (NoSQL) 

2000๋…„๋Œ€ ์ดํ›„๋กœ ์†Œ์…œ ๋ฏธ๋””์–ด๊ฐ€ ์„ฑ์žฅํ•˜๋ฉด์„œ ์˜จ๋ผ์ธ ๋ฑ…ํ‚น, ์ด์ปค๋จธ์Šค, ๋ฌธ์ž, ์‚ฌ์ง„, ์Œ์•…, ๋น„๋””์˜ค ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์†Œ์…œ๋ฏธ๋””์–ด์— ์‚ฌ์šฉ๋˜๋Š” ์ฝ”๋ฉ˜ํŠธ, ์ข‹์•„์š”, ๊ณต์œ , ๋ฉ”์„ธ์ง€ ๋“ฑ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ŠคํŠธ๋ฆฌ๋ฐ๋˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋“ค์ด ๊ทธ ๋Œ€์ƒ์ด ๋˜์–ด ๋‹ค์–‘ํ•œ ๋ถ„์•ผ์˜ ๋ฐ์ดํ„ฐ ์ž์›์œผ๋กœ ์ด์šฉ๋˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. 

 

๋„์ฒ˜์— ๊น”๋ฆฐ ๋ชจ๋“  ์ž๋ฃŒ๋‚˜ ์ •๋ณด๋“ค ์ค‘ ์˜๋ฏธ์žˆ๋Š” ์ •๋ณด๋“ค์„ '๋ฐ์ดํ„ฐ'๋ผ๊ณ  ์นญํ•œ๋‹ค. ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ๊ด€๋ฆฌ์‹œ์Šคํ…œ(Database Management System (DBMS))์€ ์‹ค์ œ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ์œ ์ง€๊ด€๋ฆฌ ํ•˜๋Š” ์†Œํ”„ํŠธ ์›จ์–ด๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ๊ด€๋ฆฌ ์‹œ์Šคํ…œ๊ณผ ๋ฐ์ดํ„ฐ ์ž์ฒด ๊ฑฐ๊ธฐ์— ์‹ค์ œ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ†ตํ•ฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ์ด๋ผ๊ณ  ํ•œ๋‹ค. ์•„๋ž˜ Figure 2์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

Figure 2. Database System structure

 

DBMS์˜ ์ฃผ์š” ๊ธฐ๋Šฅ์€ 4๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ(๋ฐ์ดํ„ฐ ์œ ํ˜•, ๊ด€๊ณ„, ์ œ์•ฝ์กฐ๊ฑด), ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์กฐ์ž‘ํ•˜๋Š” ๊ฒƒ(๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€, ์ˆ˜์ •, ์ฝ์–ด๋‚ด๊ธฐ ๋“ฑ), ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ( ๋ฌผ๋ฆฌ์  ์ €์žฅ ์žฅ์น˜๋‚˜ ๋ถ„๋ฆฌ ๋ฐฉ๋ฒ• ๊ฐ™์€ ๊ฒƒ๋“ค) ๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๋ฅผ ๊ณต์œ ํ•œ๋Š” ๊ฒƒ์ด๋‹ค. 

 

SQL์€ Structured Query Language ์˜ ์ค€๋ง๋กœ์จ, ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ์‚ฌ์šฉ๋˜๋Š” ANSI/ISO ํ‘œ์ค€ ์–ธ์–ด์ด๋‹ค. ์–ด๋–ค ์‚ฌ๋žŒ๋“ค์€ SEQUEL์ด๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋„ ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๋ž€ ๋ง์€ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๋Š” ์ข…๋ฅ˜๋ณ„๋กœ ๋ชจ์•„์ง„ ๋ชจ์Œ(collection - table) ๋“ค์˜ ๋ชจ์Œ์ด๊ณ  ์ด๋Ÿฐ ๊ฐ ์ฝœ๋ ‰์…˜๋“ค์˜ ๊ด€๊ณ„, ๊ทธ ์•ˆ์˜ ๊ฐ’๋“ค์˜ ๊ด€๊ณ„์— ๋”ฐ๋ผ์„œ ๋””์ง€์ธ์„ ์„ค๊ณ„ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. ๋‹ค์‹œ ๋งํ•ด ํ…Œ์ด๋ธ” ์•ˆ์— ๊ฐ’๊ณผ ๋˜ ๊ฑฐ๊ธฐ์— ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์˜ ๊ฐ’๋“ค ๊ฐ„์— ํ‚ค(์™ธ๋ž˜ํ‚ค์™€ ์ฃผ์š”ํ‚ค) ๊ด€๊ณ„๋“ค๋กœ ์ธํ•ด์„œ ์„œ๋กœ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์˜ ์ •๋ณด๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ ์ƒˆ๋กœ์šด ์˜๋ฏธ์™€ ๊ฒฐ๊ณผ๋ฅผ ๋„์ถœํ•ด๋‚ด๋Š” ํ˜•ํƒœ๋กœ ๋ชจ๋ธ๋ง๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ˜•์‹์„ ์˜๋ฏธํ•œ๋‹ค. 

 

์ด๋Ÿฐ ํ…Œ์ด๋ธ”๊ฐ„์˜ ๊ด€๊ณ„์™€ ๋ฐ์ดํ„ฐ์˜ ํ˜•ํƒœ๋Š” ๊ตฌ์กฐํ™”๋œ ํ˜•ํƒœ๋กœ ์ €์žฅ๋  ์ˆ˜ ์žˆ๊ณ  ์ด๋Š” ์Šคํ‚ค๋งˆ๋ฅผ ํ†ตํ•ด ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์Šคํ‚ค๋งˆ๋Š” ์‹ค์ œ ๋ฐ์ดํ„ฐ๋Š” ์•„๋‹ˆ๊ณ  ๊ทธ๋ƒฅ ํ•ด๋‹น ํ…Œ์ด๋ธ”์˜ ๊ตฌ์กฐ์™€ ์ •์˜๋ฅผ ์„ค๋ช…ํ•ด์ฃผ๋Š” ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์Šคํ‚ค๋งˆ๋Š” ๋ฐ์ดํ„ฐ ์—ด ์ด๋ฆ„๊ณผ ๋ฐ์ดํ„ฐ ํƒ€์ž…์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. 

์—ด์ด๋ฆ„ ------->  ํ•™์ƒ ๋ฒˆํ˜ธ ์ด๋ฆ„ ๋‚˜์ด
๋ฐ์ดํ„ฐ ํƒ€์ž… --->  integer text integer

ํ…Œ์ด๋ธ”์€ ํ…Œ์ด๋ธ” ์ด๋ฆ„, ์—ด(attribute, column, field)๊ณผ ํ–‰(row, tuple), ํ—ค๋”( ์—ด ์ด๋ฆ„๋“ค ), ๋ฐ”๋”” (๋ฐ์ดํ„ฐ ๊ฐ’์ด ์žˆ๋Š” ๋ถ€๋ถ„) , ๋„๋ฉ”์ธ ( ๋ฐ์ดํ„ฐ ํƒ€์ž…์˜ ์†์„ฑ) ์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. 

 

'ํ‚ค'๋Š” PK(pramary key), candidate key, Foreign Key(FK) ๊ฐ€ ์žˆ๋‹ค.

 

ํ”„๋ผ์ด๋จธ๋ฆฌ ํ‚ค๋Š” ํ…Œ์ด๋ธ”์˜ ๊ฐ ํ–‰์„ ๋…๋ฆฝ์ ์œผ๋กœ ์ธ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๊ฐ’์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ…Œ์ด๋ธ”์— ํ•™์ƒ ๋ฒˆํ˜ธ, ์ด๋ฆ„, ๋‚˜์ด๊ฐ€ ์กด์žฌํ•  ๋•Œ ํ•™์ƒ๋ฒˆํ˜ธ๊ฐ€ ํ”„๋ผ์ด๋จธ๋ฆฌ ํ‚ค๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํ•™์ƒ์ด๋ฆ„๊ณผ ๋‚˜์ด๋Š” ์—ฌ๋Ÿฌ ํ–‰์— ์ค‘๋ณต๋œ ๊ฐ’์ด ์žˆ์„ ์ˆ˜ ์žˆ์–ด์„œ ์ด๋ฆ„๊ณผ ๋‚˜์ด๋งŒ ๋ดฃ์„ ๋• ๊ฐ ํ–‰์„ ๊ฐœ๋ณ„๋กœ ์ธ์ง€ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค. ์„ค๋ น ๊ฐ™์€ ๋‚˜์ด์— ๋™๋ช…์ด์ธ์ด๋ผ๊ณ  ํ• ์ง€๋ผ๋„ ๋ง์ด๋‹ค. ๊ทธ๋ž˜์„œ PK์˜ ๊ฒฝ์šฐ๋Š” ์ฃผ๋ฏผ๋“ฑ๋ก๋ฒˆํ˜ธ๋‚˜ ์ž๋™์ฐจ ๋“ฑ๋ก ๋ฒˆํ˜ธ์™€ ๊ฐ™์ด ๊ฐ ํ–‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐœ๋ณ„๋กœ ์ธ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ์—ด์‡ ์™€ ๊ฐ™์€ ๊ฒƒ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ์ ˆ๋Œ€๋กœ ๋นˆ๊ฐ’์ด(Null)์ด ๋  ์ˆ˜ ์—†๊ณ  ์œ ๋‹ˆํฌํ•œ ๊ฐ’์ด์–ด์•ผ ํ•˜๋ฉฐ ๋˜๋„๋ก ๊ฐ„๋‹จํ•  ์ˆ˜๋ก ์ข‹๋‹ค. ๊ฐ„ํ˜น ์ด๋ฆ„+๋‚˜์ด์™€ ๊ฐ™์ด ๋‘๊ฐœ๋ฅผ ๋ฌถ์–ด์„œ ์“ธ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๋˜๋„๋ก์ด๋ฉด ๊ฐ„๋‹จํ•˜๊ฒŒ ๋‹จ๋…์œผ๋กœ ์Šค์ด๋Š” ๊ฒƒ์ด ๋น ๋ฅด๊ณ  ์ข‹๋‹ค. ๋˜ ๋˜๋„๋ก์ด๋ฉด ํ•œ๋ฒˆ ์„ค์ • ํ›„ ์ˆ˜์ •ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋‚˜์ค‘์— ํ…Œ์ด๋ธ” ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์„ค์ •ํ•  ๋•Œ ์ด PK๋ฅผ ๊ฐ€์ง€๊ณ  ์—ฐ๊ฒฐํ•˜๋Š” ์ž‘์—…์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ด€๊ณ„๋ฅผ ๋‹ค ๋งŒ๋“ค์–ด๋‘” ์ƒํƒœ์—์„œ ๋˜ PK๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ๋‹ค๋ฅธ ์—ฐ๊ฒฐ๋œ ๊ฒƒ๋“ค๋„ ๋ชจ๋‘ ์†๋ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ์˜จ๋‹ค...

 

ํ›„๋ณดํ‚ค(Candidate key)๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ์“ฐ์ด๋ฉฐ ํ–‰์„ ์ธ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ์—ญํ• ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ํ›„๋ณด๊ตฐ์„ ์˜๋ฏธํ•œ๋‹ค. ์ฃผ๋ฏผ๋ฒˆํ˜ธ์ฒ˜๋Ÿผ ํ•˜๋‚˜๋ฅผ ์“ธ์ˆ˜๋„ ์žˆ๋„ ์ฃผ๋ฏผ๋ฒˆํ˜ธ + ์ด๋ฆ„ ๊ณผ ๊ฐ™์€ ์กฐํ•ฉ์œผ๋กœ ์“ธ ์ˆ˜๋„ ์žˆ๋‹ค. ํ…Œ์ด๋ธ”์— ์—ฌ๋Ÿฌ๊ฐœ์˜ ํ›„๋ณด๊ตฐ์ด ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ด ์ค‘ ๊ฐ„๋‹จํ•˜๊ณ  ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ๊ฒƒ์„ PK๋กœ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. 

 

์™ธ๋ž˜(FK)ํ‚ค๋Š” ๋‘๊ฐœ์˜ ํ…Œ์ด๋ธ”์„ ์—ฐ๊ฒฐํ•ด์ค„ ๋•Œ ์“ด๋‹ค. Parent ํ…Œ์ด๋ธ”๊ณผ child ํ…Œ์ด๋ธ”์ด๋ผ๊ณ  ์นญํ•œ๋‹ค. (๊ด€๊ณ„๊ฐ€ ์žˆ๋Š” ๋‘๊ฐœ์˜ ํ…Œ์ด๋ธ”) Parent ํ…Œ์ด๋ธ”์— ์™ธ๋ž˜ํ‚ค๋ฅผ ํ•˜๋‚˜ ์ง€์ •ํ•˜๊ณ  ๊ทธ ์™ธ๋ž˜ํ‚ค๋ฅผ Child ํ…Œ์ด๋ธ”์˜ PK์™€ ์—ฐ๊ฒฐํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, FK๋Š” ์—ฐ๊ฒฐ๋œ ํ…Œ์ด๋ธ”์—์„œ๋Š” PK๋กœ ์“ฐ์ธ๋‹ค. ์•„๋ž˜ ๊ทธ๋ฆผ์—์„œ์™€ ๊ฐ™์ด ํ”„๋กœ์ ํŠธ ํ…Œ์ด๋ธ”์˜ PK๋Š” project_id ๊ทธ๋ฆฌ๊ณ  FK๋Š” school_id ์ผ ๋•Œ, ์ด FK ๋ฅผ ํ™œ์šฉํ•˜์—ฌ school ํ…Œ์ด๋ธ”๊ณผ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๊ณ  ๊ทธ๋กœ ์ธํ•ด ๊ฐ ํ”„๋กœ์ ํŠธ๊ฐ€ ์–ด๋Š ํ•™๊ต์˜ ๊ฒƒ์ธ ์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ด ๋‘ ๊ฐœ์˜ ์ •๋ณด๋ฅผ ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”์— ๋‹ค ๋‹ด์ง€ ์•Š๊ณ  ๋‘ ๊ฐœ์˜ ํ…Œ์ด๋ธ”๋กœ ๋‚˜๋ˆ ์„œ ์ €์žฅํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด์„œ๋Š” ์ถ”ํ›„์— ์„ค๋ช…๋œ๋‹ค. (Normalization) 

Figure 3. PK and FK

ํ‚ค๋ฅผ ์„ค์ •ํ•˜์˜€๋‹ค๋ฉด ๊ทธ์— ๋”ฐ๋ฅธ ์ œ์•ฝ ์กฐ๊ฑด๋“ค๋„ ์„ค์ •ํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค. ๋จผ์ € PK์˜ ๊ฒฝ์šฐ ์•ž์„œ ์ด๋ฏธ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด NOT NULL(๋นˆ ๊ฐ’์„ ํฌํ•จํ•  ์ˆ˜ ์—†๋‹ค), UNIQUE(์ค‘๋ณต๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค) ๋“ฑ๊ณผ ๊ฐ™์€ ์ œ์•ฝ ์กฐ๊ฑด์ด ์žˆ์„ ์ˆ˜ ์žˆ๊ณ  FK์˜ ๊ฒฝ์šฐ์—” Child ํ…Œ์ด๋ธ”์˜ PK์— ์—†๋Š” ๊ฐ’์€ ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค. (๋‘ ํ…Œ์ด๋ธ”์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Child ํ…Œ์ด๋ธ”์— ์—†๋Š” ๊ฐ’์ด FK์— ์žˆ์„ ๊ฒฝ์šฐ ์ฐธ์กฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.) 

 

E.F. Codd ๋ผ๋Š” ์‚ฌ๋žŒ์ด ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๋ฅผ ๋„์ž…ํ•œ ์‚ฌ๋žŒ์ด๋‹ค. ๊ด€๊ณ„ํ˜•๋ฐ์ดํ„ฐ์˜ ๋ชฉ์ ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ์ค‘๋ณต๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ค„์ž„์œผ๋กœ ์ธํ•ด ๋ฐ์ดํ„ฐ ์ €์žฅ๋น„์šฉ์„ ํšจ๊ณผ์ ์œผ๋กœ ์ค„์ด๋Š” ๊ฒƒ์— ์žˆ๋‹ค. 

 

RDBMS ๋Š” ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์„ ์˜๋ฏธํ•œ๋‹ค. ๋ฐ์ดํ„ฐ์˜ ๊ฐ’๋“ค์€ ์›์ž์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•˜๋ฉฐ(๋”์ด์ƒ ๋ถ„ํ•ด x), ์—ด๊ณผ ํ–‰์˜ ์ˆœ์„œ๋Š” ์˜๋ฏธ๊ฐ€ ์—†์œผ๋ฉฐ, ๋ฐ์ดํ„ฐ์˜ ์ €์žฅ์€ ์ˆ˜์ง์œผ๋กœ ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๊ณ  (ํ–‰์„ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ), ๋ฌด๊ฒฐ์„ฑ ์ œํ•œ ์กฐ๊ฑด๋“ค์€ ๋ฐ์ดํ„ฐ ๋“ค๊ฐ„์— ์žˆ์–ด ๋ฐ์ดํ„ฐ๋ฅผ ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ์ €์žฅ ๋ฐ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค. 

 

์ด๋Ÿฐ RDBMS์˜ ํ•œ๊ณ„๋กœ๋Š” ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์˜ ํ™•์žฅํ•˜๋ ค๋ฉด ์—ฌ๋Ÿฌ ๊ทœ๋ชจ์˜ ํ™•์žฅ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค๋ฃจ๊ธฐ ์–ด๋ ค์šด ๊ฐ€๊ฒฉ์ด ๋น„์‹ผ ์„œ๋ฒ„์—์„œ ํ™•์žฅ์ด ์ง„ํ–‰๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๊ฐ€ ํ…Œ์ด๋ธ”์— ๋งž์ง€ ์•Š๋Š ๊ฒฝ์šฐ ๋ณต์žกํ•œ ๊ตฌ์กฐ๋กœ ํ…Œ์ด๋ธ”์„ ๋Š˜์ด๋˜์ง€ ๋‹ค์‹œ ๋‚˜๋ˆ„๋˜์ง€ ๋“ฑ๋“ฑ์˜ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ชจ๋ธ๋ง ์žฌ์„ค๊ณ„๊ฐ€ ํ•„์š”ํ•˜๋‹ค. 

 

๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  RDBMS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋กœ๋Š” ACID compliance ๋ฅผ ์ด์œ ๋กœ ๋“ค ์ˆ˜ ์žˆ๋‹ค. Atomicity, Consistency, Isolation, Durabiility์„ ์ค€์ˆ˜ํ•˜๋ฉด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ์กฐํ™”ํ•˜๊ณ  ์ผ๊ด€์„ฑ์žˆ๊ฒŒ ์œ ์ง€ํ•ด์ฃผ๋Š” ์žฅ์  ๋•Œ๋ฌธ์ด๋‹ค. 

 

SQL

Structured Query Langauge, Manipulating relational databases, International standard since 1986(ANSI, ISO)
SQL is language, and MySQL is DBMS. Web interfaces( e.g., phpMyAdmin) 

 

SQL์€ ๋‹ค์–‘ํ•˜๊ฒŒ ํ™œ์šฉ๋˜๋Š” ๋ฐ LAMP๋Š” ํ•˜๋‚˜์˜ ์˜ˆ์‹œ๋กœ ์ˆ˜์—…์—์„œ ๋‹ค๋ค„์ง„ ๊ฒƒ์ด๋‹ค. ์—ฌ๋Ÿฌ๊ฐœ์˜ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ํ•˜๋‚˜์˜ ์„ธํŠธ๋กœ ๋ฌถ์–ด์„œ ์ด๋ ‡๊ฒŒ ๋ถ€๋ฅด๊ธฐ๋„ ํ•˜๋Š” ๋ฐ ๊ทธ ์ค‘ ํ•˜๋‚˜์ธ LAMP๋Š” Linux + Apache + MySQL + PHP ์˜ ๊ฒฐํ•ฉ์ด๋‹ค. ์ด๊ฒƒ์„ ์Œ“์•„์„œ ์“ด๋‹ค๊ณ  ํ•˜์—ฌ LAMP Stack ์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. 

 

SQL์—์„œ๋Š” text ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์„ค์ •ํ•  ๋•Œ ๋‹ค๋ฅธ ์–ธ์–ด(String)์—์„œ์™€ ๋‹ค๋ฅด๊ฒŒ VARCHAR ์ด๋ผ๋Š” ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ณ  ์—ฌ๊ธฐ์— ๊ฐœ์ˆ˜๊นŒ์ง€ ์ง€์ •ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด VARHCAR(20)์™€ ๊ฐ™์ด ์“ฐ์ธ๋‹ค. ์ด๋ ‡๊ฒŒ ๊ทธ ํฌ๊ธฐ๋ฅผ ์ œํ•œํ•จ์œผ๋กœ์จ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋‚ญ๋น„๋˜๋Š” ๊ฒƒ์„ ๋ง‰์•„์ค€๋‹ค. 

 

์Šคํ‚ค๋งˆ๋ผ๋Š” ๊ฒƒ์— ๋Œ€ํ•ด์„œ ์•ž์— ์–ธ๊ธ‰ํ–ˆ์—ˆ๋Š” ๋ฐ ์ด๋ฅผ ์ฟผ๋ฆฌ๋กœ ๋‚˜ํƒ€๋‚ผ ๋•Œ๋Š” ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•  ๋•Œ ์“ฐ์ธ๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค. ํ…Œ์ด๋ธ” ์ƒ์„ฑ ์‹œ ์Šคํ‚ค๋งˆ ๋””์ž์ธ์—์„œ ์„ค์ •ํ•œ ๋ฐ์ดํ„ฐ ์ด๋ฆ„, ํƒ€์ž…, ์ œ์•ฝ์กฐ๊ฑด๋“ค์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ…Œ์ด๋ธ”์€ ์ƒ์„ฑ๋˜๊ณ  ์ˆ˜์ •๋  ์ˆ˜ ์žˆ์ง€๋งŒ ํ•œ ๋ฒˆ ์‚ญ์ œ(drop)ํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์‹œ ์‚ด๋ ค๋‚ผ ์ˆ˜๋Š” ์—†๋‹ค. 

Figure 4. SQL query -- create table example

Figure 4๋Š” ๋‚ด๊ฐ€ ์ง  ์ฟผ๋ฆฌ ์ค‘์— ํ•˜๋‚˜์ธ๋ฐ, ID๋Š” ์ž๋™์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋„๋ก ์„ค์ •, PK, FK ์„ค์ •๊ณผ ์ œ์•ฝ์กฐ๊ฑด, ํ…Œ์ด๋ธ” ๊ด€๊ณ„๋„ ๋ชจ๋‘ ์„ค์ •๋˜์–ด ์žˆ๋‹ค. 

 

์ฟผ๋ฆฌ๋ฅผ ์งค ๋•Œ reserved words(์‹œ์Šคํ…œ์— ์ €์žฅ๋œ ํ‚ค์›Œ๋“œ๋“ค - CREATE TABLE , IF, PRIMARY KEY ๋“ฑ๊ณผ ๊ฐ™์ด ์ดˆ๋ก์ƒ‰์œผ๋กœ ํ‘œ์‹œ๋œ ๊ฒƒ Figure 4) ๋“ค์€ ๋˜๋„๋ก ๋Œ€๋ฌธ์ž๋กœ ์“ฐ๋Š” ๊ฒƒ๋ฅผ ์ถ”์ฒœํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ…Œ์ด๋ธ” ์ด๋ฆ„์€ ๋Œ€๋ฌธ์ž, ์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ณ„ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๊ณ  ์—ด์ด๋ฆ„ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ๋Œ€์†Œ๋ฌธ์ž ์ƒ๊ด€์—†์ด ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋‹ค์‹œ ๋งํ•ด ํ…Œ์ด๋ธ” ์ด๋ฆ„์€ ๋Œ€์†Œ๋ฌธ์ž๊ฐ€ ํ‹€๋ฆฌ๋ฉด ์ธ์ง€๋ฅผ ๋ชปํ•œ๋‹ค๋Š” ๋ง์ด๊ณ  ์—ด์ด๋ฆ„์€ ๋Œ€์†Œ๋ฌธ์ž๊ฐ€ ํ‹€๋ ค๋„ ์ธ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ง์ด๋‹ค. 

 

ํ…Œ์ด๋ธ” ์•ˆ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋Œ€ํ‘œ์ ์ธ ์ฟผ๋ฆฌ๋“ค์€ insert, delete, update ๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•ด๋‚ด๋Š” (์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์•„์„œ ์ถœ๋ ฅํ•ด๋‚ด๋Š”) ์ฟผ๋ฆฌ๋Š” select๊ฐ€ ์“ฐ์ธ๋‹ค. 

์ด ๋•Œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ๋ฐ DISTICT, ORDER BY, GROUP BY , WHERE ์ ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ์กฐ๊ฑด์— ๋งž๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๋ ค๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ์œ„์— ์˜ˆ์‹œ์—์„œ๋Š” 3๊ฐœ์˜ ํ…Œ์ด๋ธ”์„ ์กฐ์ธํ•˜์—ฌ์„œ ์‚ฌ์šฉํ•˜์˜€๊ณ  ๊ฐ ํ…Œ์ด๋ธ”์€ ์ „์ฒด ์ด๋ฆ„์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  a, p, ๊ทธ๋ฆฌ๊ณ  ใ…ฃ์„ ์ƒ์šฉํ•จ์œผ๋กœ์จ ์ „์ฒด ์ฟผ๋ฆฌ๋ฅผ ๋” ๋‹จ์ˆœํ™” ํ•˜์˜€๋‹ค. 

 

DBMS๋Š” ํ…Œ์ด๋ธ”๊ด€๊ณ„์— ์žˆ์–ด์„œ ํ˜ผ๋ž€์ด ์˜ฌ ์ˆ˜ ์žˆ๋Š” ์œ ํšจํ•˜์ง€ ์•Š์€ ์ž‘์—…์„ ๋ง‰์•„๋‚ธ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด PK๋‚˜ FK๋ฅผ ์ œ๊ฑฐํ•˜๋ ค ํ•œ๋‹ค๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๋ ค ํ•˜๊ฑฐ๋‚˜ ์ค‘๋ณต๋œ PK๋ฅผ ์ž…๋ ฅํ•˜๊ฑฐ๋‚˜ ํ˜น์€ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”๊ณผ ๊ด€๊ณ„๊ฐ€ ํ˜•์„ฑ๋œ ํ…Œ์ด๋ธ”์„ ์ œ๊ฑฐํ•˜๋ ค๊ณ  ํ•˜๋Š” ์ž‘์—…๋“ค์€ ์ €์ง€๋œ๋‹ค. 

 

NULL ๊ฐ’์— ๋Œ€ํ•ด์„œ ์–ธ๊ธ‰์„ ํ•˜์ž๋ฉด ์•ž์„œ์„œ ๋น„์–ด์žˆ๋Š” ๊ฐ’์ด๋ผ๊ณ  ๋งํ•œ ์ ์ด ์žˆ๋‹ค. NULL์€ ๊ฐ’์ด๋ผ๊ธฐ ๋ณด๋‹ค๋Š” '์ƒํƒœ'๋กœ ํ•ด์„๋  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด ์•Œ์ˆ˜ ์—†๋Š” ์ƒํƒœ, ์ด์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ์ƒํƒœ, ๋ณด๋ฅ˜๋œ ์ƒํƒœ, ํ•ด๋‹น๋˜์ง€์•Š๋Š” ์ƒํƒœ ๋“ฑ์„ NULL์ด๋ผ๊ณ  ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ•™์ƒ๊ณผ ํ•™๊ต ์ •๋ณด๊ฐ€ ๋‹ด๊ธด ํ…Œ์ด๋ธ”์ด ์žˆ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ ํ•™์ƒ์˜ ์ฃผ๋ฏผ๋ฒˆํ˜ธ๋Š” NULL์ด ๋  ์ˆ˜ ์—†์ง€๋งŒ ํ•™๊ต ์ด๋ฆ„์€ NULL์ด ๋  ์ˆ˜ ์žˆ๋‹ค.( ํ•™๊ต ๋‹ค๋‹ˆ์ง€ ์•Š๋Š” ํ•™์ƒ์ด๊ฑฐ๋‚˜ ์•„์ง ์–ด๋ ค์„œ ํ•™๊ต ๋ฏธ์ทจํ•™ ์•„๋™์ผ ๊ฒฝ์šฐ) NULL ์ด ๊ฐ€๋Šฅํ•  ๊ฒฝ์šฐ๋Š” IS NULL, ๊ฐ€๋Šฅํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ NOT NULL์„ ์‚ฌ์šฉํ•œ๋‹ค. 

 

์ฟผ๋ฆฌ๋ฅผ ์งœ๋‹ค ๋ณด๋ฉด ๋…ผ๋ฆฌ์ ์ธ ๊ด€๊ณ„์— ๋Œ€ํ•ด์„œ ์ •์˜ํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค. ( and , or, but ) AND๋ฅผ ์‚ฌ์šฉใ…‡ํ•˜๋Š”๊ฒฝ์šฐ FALSE๊ฐ€ ๊ฐ€์žฅ ์Ž„๋‹ค. ๋‹ค์‹œ ๋งํ•ด์„œ ํ•˜๋‚˜ ์ด์ƒ์ด FALSE์ด๋ฉด FALSE ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งŒ์•ฝ OR๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒฝ์šฐ TRUE๊ฐ€ ์ œ์ผ ๊ฐ•ํ•˜๋‹ค. ํ•˜๋‚˜๋ผ๋„ TRUE๋ฉด ๋ชจ๋‘ TRUE๊ฐ€ ๋œ๋‹ค. 

Figure 5. Three Valued Logic

ํ…Œ์ด๋ธ” ์กฐ์ธ์€ ํ…Œ์ด๋ธ” ๊ฐ„ ๊ด€๊ณ„๋ฅผ ํ˜•์„ฑํ•˜์—ฌ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์˜ ๋‚ด์šฉ์„ ์ž์œ ์ž์žฌ๋กœ ๊ฐ€์ ธ๋‹ค ์“ธ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•ด์ค€๋‹ค. ์กฐ์ธ์— ์ข…๋ฅ˜๋กœ๋Š” ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค. ๋‘ ๊ทธ๋ฃน์˜ ๊ต์ง‘ํ•ฉ ํ˜•ํƒœ๋ฅผ ์ƒ๊ฐํ•˜๋ฉฐ ์ดํ•ดํ•˜๋ฉด ์‰ฝ๋‹ค.

Inner join result will include only the colored part.

Inner ์กฐ์ธ์€ ๋ง ๊ทธ๋Œ€๋กœ ์•ˆ์ชฝ์˜ ๋ฐ์ดํ„ฐ(๊ณตํ†ต๋œ ๋ถ€๋ถ„๋งŒ) ์ถœ๋ ฅํ•ด์ค€๋‹ค. Outer๋Š” ๋ฐ”๊นฅ ์ชฝ (ํ•ด๋‹น๋˜๋Š” ๋ฐฉํ–ฅ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ)๋ฅผ ์ถœ๋ ฅํ•ด์ฃผ๊ณ  Full outer๋Š” ์–‘์ชฝ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ์ถœ๋ ฅ, Cross ๋Š” ํ•˜๋‚˜์”ฉ ๋‹ค ์—ฐ๊ฒฐ์ง€์–ด์„œ (์‹ ๋ฐœ ๋ˆ ๋ฌถ ๋“ฏ) ๋‹ค ์ถœ๋ ฅํ•ด์ฃผ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. 

๋‹ค์Œ ์ด๋ฏธ์ง€๋Š” ํƒ€ ์‚ฌ์ดํŠธ์— ์ž˜ ์„ค๋ช…๋œ ๋‚ด์šฉ๊ณผ ๊ทธ๋ฆผ์ด ์žˆ์–ด์„œ ์ฒจ๋ถ€ํ•œ๋‹ค.  

https://cloud.google.com/blog/topics/developers-practitioners/bigquery-explained-working-joins-nested-repeated-data?hl=en 

 

๊ด€๊ณ„๋Œ€์ˆ˜

๊ด€๊ณ„๋ผ์ˆ˜๋Š” ์ฟผ๋ฆฌ ์ž‘์—…์„ ํ˜•์‹ํ™”ํ•˜๊ณ  ๊ด€๊ณ„์— ์‚ฌ์šฉํ•˜๊ณ  ๋˜ ํšจ๊ณผ์ ์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค.  

 

๋‹จํ•ญ์—ฐ์‚ฐ

SELECT  σ<cond> (r)  σ salary>10000 (Employee)  σ salary>1000 (  σ age>30 (Employee) ) 
 σ salary>1000 ^ age >30 (Employee)
PROJECT ∏ <A1, A2,...> (r)  ∏ ID, Salary (Employee) ∏ id ( σ salary>10000 (Employee) )
Assignment ←  test ← σ age<30 (Employee) test(number, name, pay)     ID, the_name, salary (Employee)
Rename ρ ρ test (Employee) ρ test(name, number, payment,...) (Employee)
: change table name from Employee to test, and its fields name as well. 

์ดํ•ญ์—ฐ์‚ฐ

Union [ โ‹ƒ ] ์–‘์ชฝ ํ…Œ์ด๋ธ”์—์„œ ์ „๋ถ€ ์ถœ๋ ฅ ( ์—ด ๊ฐœ์ˆ˜, ์œ„์น˜, ๋ฐ์ดํ„ฐ ์œ ํ˜• ๋“ฑ์ด ๋ชจ๋‘ ๊ฐ™์•„์•ผ ํ•œ๋‹ค) 
Intersect [โ‹‚] ๊ต์ง‘ํ•œ ๋ถ€๋ถ€๋งŒ ์ถœ๋ ฅ( ์ค‘๋ณต ์ œ๊ฑฐ )
Minus[ - ] R1 - R2: R1์—์„œ R2์— ํ•ด๋‹น๋˜๋Š” ๋ถ€๋ถ„ ์ œ์™ธ
Cross-product(Cartesian product) [ X ]  R1์— ์žˆ๋Š” ๊ฐ ํ–‰์„ R2์˜ ๊ฐ ํ–‰๊ณผ ํ•˜๋‚˜์”ฉ ์ง์ง“๊ธฐ 
Conditional join [ R1โ‹ˆ age <30 R2 ] ์กฐ๊ฑด์ด ๋งž๋Š” ๋ถ€๋ถ„๊ด€ ํ•ฉ์นœ๋‹ค. (Cross๋ž‘ ๊ฐ™์€ ๋ฐ ์กฐ๊ฑด์ด ์žˆ๋Š” ๊ฒƒ ๋ฟ) 
Equi Join [R1 โ‹ˆ age R2 ] R1์ด๋ž‘ R2์˜ ๊ฐ ํ–‰์˜ ๊ฐ’์ด ๊ฐ™์€ ๊ฒƒ๋งŒ ์ถœ๋ ฅ(์—ฌ๊ธฐ์„œ๋Š” ๋‘ ํ…Œ์ด๋ธ”์— ๋‚˜์ด ๊ฐ’ ๊ฐ™์€ ๊ฒƒ๋งŒ ๋งค์นญํ•ด์„œ ์ถœ๋ ฅ )

 

ER Diagram (Entity Relationship Diagram) 

ER diaram์„ ๊ทธ๋ฆฌ๋Š” ์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. 1) ๋ถ„์„ ์š”๊ตฌ์‚ฌํ•ญ์ด ๋ฌด์—‡์ธ๊ฐ€? ๋ฅผ ํŒŒ์•…ํ•œ๋‹ค. 2) ๋…ผ๋ฆฌ์  ๋””์ž์ธ์„ ์„ค๊ณ„ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์–ด๋–ค ํ…Œ์ด๋ธ”๋“ค์ด ํ•„์š”ํ•˜๊ณ  ์–ด๋–ค ๊ด€๊ณ„๋กœ ์ฐธ์กฐ๋ฅผ ํ• ์ง€ ๋“ฑ์„ ๊ณ ๋ คํ•ด์—ฌ ๋…ผ๋ฆฌ์  ๋””์ž์ธ ์„ค๊ณ„๊ฐ€ ํ•„์š”ํ•˜๋‹ค. 3) ์ •๊ทœํ™”: ๋…ผ๋ฆฌ์ ์œผ๋กœ ์„ค๊ณ„๋œ ๋””์ž์ธ์— ๋Œ€ํ•ด ๋ช…ํ™•ํžˆ ํ•˜๋ฉฐ ์ฒด๊ณ„ํ™”๋œ ๋‹จ์ˆœํ™”๊ฐ€ ํ•„์š”ํ•˜๋‹ค. 4) ์„ค๊ณ„๋œ ๋””์ž์ธ์„ ๊ณ ๋ คํ•˜์—ฌ DBMS์—์„œ ๋ฌผ๋ฆฌ์  ๋””์ž์ธ์„ ๊ตฌํ˜„ํ•œ๋‹ค. 

 

ER diagram์˜ ๊ตฌ์„ฑ์š”์†Œ๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. Entity ๋Š” ํ…Œ์ด๋ธ”์ด๋ฆ„์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋˜๊ฒ ๋‹ค. Attribute๋Š” ๊ทธ ์•ˆ์˜ ๊ตฌ์„ฑ ์š”์†Œ๋“ค์ด๋‹ค. ๊ฐ ํ–‰์ด ํ•˜๋‚˜์˜  attribute๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค. Relationship์€ ๊ด€๊ณ„์ด๊ณ  instance๋Š” ํ…Œ์ด๋ธ”์— ์žˆ๋Š” Attribute์˜ ์ข…๋ฅ˜๋ผ๊ณ  ๋ณด๋ฉด ๋˜๊ฒ ๋‹ค. ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋™์‚ฌ๋ฅผ ์จ์„œ ๋ณดํ†ต ํ‘œํ˜„ํ•˜๊ธฐ๋„ ํ•˜๋Š” ๋ฐ Entity(ํ…Œ์ด๋ธ” ์ด๋ฆ„)์ด ์ฃผ์–ด๋กœ ์“ฐ์ธ๋‹ค. ์•„๋ž˜ ๊ทธ๋ฆผ์—์„œ "์บ๋ฆญํ„ฐ๋Š” ์‹œํ‹ฐ์— ์‚ฐ๋‹ค"๋ผ๋Š” ๊ด€๊ณ„๊ฐ€ ์ •์˜ ๊ฐ€๋Šฅํ•˜๋‹ค. 

PK, FK ๋‚˜ ๊ทธ ๋ฐ–์— ์ œ์•ฝ๋“ค์€ ์ฟผ๋ฆฌ๊ณผ์ •์—์„œ ์„ค์ •๋˜๊ธฐ๋Š” ํ•˜์ง€๋งŒ ๋ณดํ†ต์€ ๋ชจ๋ธ ์„ค๊ณ„ ๋‹จ๊ณ„์—์„œ๋ถ€ํ„ฐ ๊ณ ๋ ค๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ž˜์•ผ ๊ทธ์— ๋งž๊ฒŒ ๋””์ž์ธ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

 

์นด๋””๋„๋ฆฌํ‹ฐ ์ œ์•ฝ (ํ•œ๊ตญ์–ด๋กœ๋Š” ๋ญ๋ผ๊ณ  ํ‘œํ˜„ํ•ด์•ผ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์„ ์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค) 

์นด๋””๋„๋ฆฌํ‹ฐ๋Š” ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์ธ์Šคํ„ด์Šค์˜ ์—”ํ‹ฐํ‹ฐ ์ข…๋ฅ˜๋“ค์ด ๊ด€๊ณ„์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์ง€๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ๋‹ค์‹œ ๋งํ•ด์„œ  ์—”ํ‹ฐํ‹ฐ์—๋Š” ๋‹ค์–‘ํ•œ ์ธ์Šคํ„ด์Šค๋“ค์ด ์žˆ๋Š” ๋ฐ ์ด ์ธ์Šคํ„ด์Šค๊ฐ€ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”๊ณผ ๋ช‡๊ฐœ๋‚˜ ์—ฐ๊ด€์ด ์žˆ๋Š๋ƒ๋Š” ๊ฒƒ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์บ๋ฆญํ„ฐ์™€ ๋„์‹œ์˜ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž. 

์บ๋ฆญํ„ฐ ์—”ํ‹ฐํ‹ฐ์—๋Š” ์บ๋ฆญํ„ฐ ์ˆ˜๋งŒํผ์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์žˆ๋‹ค. ๋ฐฐํŠธ๋งจ, ์Šˆํผ๋งจ, ์ŠคํŒŒ์ด๋”๋งจ์ด ์žˆ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ 3๊ฐœ์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์กด์žฌํ•œ๋‹ค. ๋ฐ˜๋Œ€๋กœ ์ „์„ธ๊ณ„์—๋Š” ์˜ค์ง ๋Ÿฐ๋˜, ๋งจ์ฒด์Šคํ„ฐ, ์šธ์‚ฐ 3๊ฐœ์˜ ๋„์‹œ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ ์ด ๋‘˜์˜ ๊ด€๊ณ„๋ฅผ ์ •์˜ํ•ด๋ณด์ž. 

์—”ํ‹ฐํ‹ฐ ์บ๋ฆญํ„ฐ์˜ ๊ฐ ๊ฐ์˜ ์ธ์Šคํ„ด์Šค (3๊ฐœ)๋Š” ํ•˜๋‚˜์˜ ๋„์‹œ์—๋งŒ ์‚ด ์ˆ˜ ์žˆ๋‹ค. ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ๊ณณ์— ์‚ด ์ˆ˜๋Š” ์—†์œผ๋‹ˆ, ๊ทธ๋ ‡๋‹ค๋ฉด ์บ๋ฆญํ„ฐ๋Š” ์ ์–ด๋„ ํ•˜๋‚˜์˜ ๋„์‹œ์— ์‚ด๊ณ  ์žˆ์–ด์•ผ ํ•˜๊ณ  ์ตœ๋Œ€๋กœ ์‚ด ์ˆ˜ ์žˆ๋Š” ๋„์‹œ๋„ ํ•˜๋‚˜ ๋ฟ์ด๋‹ค. (๋ฐ”๋กœ one and only one ๊ด€๊ณ„) ๋‹ค์Œ์€ ๋„์‹œ์˜ ์ž…์žฅ์—์„œ ๋ณด๋ฉด ๊ฐ ๋„์‹œ์—๋Š” ํ•œ ๋ช…๋„ ์•ˆ ์‚ด๊ณ  ์žˆ์„ ์ˆ˜๋„ ์žˆ๊ณ  ํ˜น์€ 3๋ช… ๋ชจ๋‘ ํ•œ ๋„์‹œ์— ์‚ด ์ˆ˜ ์žˆ์„ ์ˆ˜๋„ ์žˆ๋‹ค. (๋ฐ”๋กœ zeo or Many) ์ด๋ ‡๊ฒŒ ๋‘ ์—”ํ‹ฐํ‹ฐ์˜ ๊ด€๊ณ„๊ฐ€ ์ •์˜๋  ์ˆ˜ ์žˆ๋‹ค.

Crow's foot Diagram: ๊นŒ๋งˆ๊ท€ ๋ฐœ ๋ชจ์–‘ ๊ฐ™๋‹ค๊ณ  ํ•ด์„œ ๋ถ™์—ฌ์ง„ ์ด๋ฆ„
๊ด€๊ณ„๋“ค์„ ์ •๋ฆฌํ•œ ๋‚ด์šฉ

๊ทธ๋ ‡๋‹ค๋ฉด, ๋งŒ์•ฝ ? ๋‹ค๋Œ€๋‹ค์˜ ๊ด€๊ณ„๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ? ๋‹ค๋Œ€๋‹ค์˜ ๊ด€๊ณ„๋Š” ์›์ž์„ฑ์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค๋Š” (๊ฐ’์€ ๋ฐ˜๋“œ์‹œ ํ•˜๋‚˜์˜ ๊ฐ’์œผ๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ์•ผ ํ•œ๋‹ค)๋ฅผ ์œ„๋ฐ˜ํ•˜๋Š” ์ƒํ™ฉ์„ ์ดˆ๋ž˜ํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋Ÿด ๋•Œ ํ•ด๊ฒฐ์ฑ…์€ ์ค‘๊ฐ„ ๋‹ค๋ฆฌ๋ฅผ ๋†“์•„์„œ ํ•ด๊ฒฐํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค. ์ด ์ค‘๊ฐ„ ๋‹ค๋ฆฌ ์—ญํ• ์„ ํ•˜๋Š” ํ…Œ์ด๋ธ”์„ "๋ธŒ๋ฆฌ์ง• ์—”ํ‹ฐํ‹ฐ(joining(bridging /intersection/junction) entity)"์ด๋ผ๊ณ  ํ•œ๋‹ค.

 ์•„๋ž˜ ํ…Œ์ด๋ธ”์„ ๋ณด๋ฉด ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค.  ์˜ค๋” ํ…Œ์ด๋ธ”์˜ ํ”„๋กœ๋•ํŠธ๋Š” FK ์ด๊ณ  ์ด๋Š” Product ํ…Œ์ด๋ธ”์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐ˜๋Œ€๋กœ Product์˜ ์˜ค๋”๋Š” FK๋กœ, ์˜ค๋”์˜ PK๋ฅผ ์ฐธ์กฐํ•˜๋„๋ก ๋˜์–ด์žˆ๋‹ค. ๋ฌธ์ œ๋Š” FK๋“ค์ด ๋ชจ๋‘ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๊ฐ’์„ ๋ณด์œ ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค. ์›์ž์„ฑ์— ์œ„๋ฐ˜๋˜๋Š” ์‚ฌํ•ญ์ด๋‹ค. ์ด๋Ÿด ๋•Œ ์šฐ๋ฆฌ๋Š” OrderedProduct๋ผ๋Š” ์ค‘๊ฐ„ ๋ธŒ๋ฆฌ์ง€ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋„์ž…ํ•œ๋‹ค. ์ด ๋ธŒ๋ฆฌ์ง€ ํ…Œ์ด๋ธ”์€ ๋‘ ๊ฐœ์˜ compound key ๋ฅผ PK๋กœ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค. (์ด๋Ÿฐ ์ด์œ ๋กœ ํ…Œ์ด๋ธ”์ด ๋Š˜์–ด๋‚œ๋‹ค!)  ์ด๋กœ ์ธํ•œ ์ด๋“์€ ์›์ž์„ฑ์„ ์œ„๋ฐฐํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค๋Š” ์ ๊ณผ ๋ถˆํ•„์š”ํ•œ NULL ๊ฐ’์„ ํ™€๋”ฉํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค๋Š” ์ ์ด๋‹ค. 

 ์ด๋ ‡๊ฒŒ ๊ด€๊ณ„๋ฅผ ๋”ฐ์ง€๋‹ค ๋ณด๋ฉด ๊ฐ„ํ˜น weak entity๋ผ๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ ‘ํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋Š” ์–ด๋–ค ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์™„์ „ํžˆ ๋‹ค๋ฅธ ํŠน์ • ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์—†์ด๋Š” ์กด์žฌํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์ผ ๋•Œ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ˜ธํ…”๋ฐฉ์ด๋ผ๋Š” ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜์ž, ํ˜ธํ…”๋ฐฉ์ด๋ผ๋Š” ์—”ํ‹ฐํ‹ฐ๋Š” ํ˜ธํ…”์ด๋ผ๋Š” ์—”ํ‹ฐํ‹ฐ ์—†์ด ๋‹จ๋…์œผ๋กœ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€? ๋Œ€๋‹ต์€ NO. ๊ทธ๋ ‡๋‹ค๋ฉด ํ˜ธํ…”๋ฐฉ์€ weak entity ๊ฐ€ ๋œ๋‹ค. ์ด๋Ÿฐ ์—”ํ‹ฐํ‹ฐ๋Š” PKํ‚ค๊ฐ€ ๋ณ„๋„๋กœ ์—†๊ณ  ๋ถ€๋ถ„ ํ‚ค๋ผ๋Š” ๊ฒƒ์„ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค. ๋ถ€๋ถ„ ํ‚ค๋กœ๋Š” ๊ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ธ์ง€ํ•  ์ˆ˜ ์—†์ง€๋งŒ ํ˜ธํ…”์ด๋ผ๋Š” ์—”ํ‹ฐํ‹ฐ์˜ PK์™€ ํ˜ธํ…”๋ฐฉ ์—”ํ‹ฐํ‹ฐ์˜ ๋ฃธ๋„˜๋ฒ„๊ฐ€ composite key๋กœ์จ ํ•˜๋‚˜์˜ ์ธ์ง€์ž๋กœ ์—ญํ• ํ•˜๊ฒŒ ๋œ๋‹ค. 

 strong entity์˜ ๊ฒฝ์šฐ, PK, FK ๋“ฑ์ด ์žˆ์œผ๋ฉฐ, default ๊ฐ’ ๊ฐ™์€ ๊ฒƒ๋“ค๋„ ์„ค์ •๋˜๋Š” ์ผ๋ฐ˜์ ์ธ entity๋“ค์ด ๋ชจ๋‘ ์—ฌ๊ธฐ ํ•ด๋‹น๋œ๋‹ค. 

Stored Procedure, Trigger and View

์ฟผ๋ฆฌ๋ฅผ ๋งŒ๋“ค๋ฉด์„œ ์กฐ๊ธˆ ์–ด๋ ค์› ๋˜ ๊ฒƒ์ด ๋ชจ๋“  ์ž‘์—…์„ ์ž๋™์œผ๋กœ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ•˜๋‚˜์˜ ์ž…๋ ฅ์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๋ชจ๋“  ์กฐ๊ฑด๋“ค์„ ๊ฒ€ํ† ํ•˜์—ฌ ๊ด€๋ จ ๋ฐ์ดํ„ฐ ๋“ค์ด ๋ชจ๋‘ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋ฉฐ ์—…๋ฐ์ดํŠธ ๋˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ํ•˜๋‚˜์˜ ์ฑŒ๋ฆฐ์ง€์˜€๋‹ค. ๊ทธ ๊ฐ€์žฅ ํฐ ์—ญํ• ์„ ํ•ด์ค€ ๊ฒƒ์ด ๋ฐ”๋กœ Stored Procedure๊ณผ Trigger ์ด๋‹ค. 

 

Stored Procedure๋Š” ๋ง ๊ทธ๋Œ€๋กœ ๋‹ค์–‘ํ•œ ๊ณผ์ •์„ ํ•˜๋‚˜์˜ ์ฟผ๋ฆฌ์— ์ €์žฅํ•ด๋‘์—ˆ๋‹ค๊ฐ€ ํ˜ธ์ถœ์ด ๋˜๋ฉด ํ•ด๋‹น ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. Call ๋ฅผ ์ด์šฉํ•ด์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์•ˆ์— ๋‹ค์–‘ํ•œ ์ฟผ๋ฆฌ๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์กฐ๊ฑด ๋ฌธ IF - ELSE ๋ผ๋˜์ง€ CASE - WHEN - ๊ฐ™์€ ๊ฒƒ๋“ค์„ ์“ธ ์ˆ˜ ์žˆ๊ณ  ๋‹ค๋ฅธ Stored procedure๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ๋˜ ํ•˜๋‚˜์˜ ํŠน๋ณ„ํ•œ ์ ์€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค. ๊ทธ๋ž˜์„œ ๋ฉ”์„ธ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๊ฑฐ๋‚˜ ํ˜น์€ ์ฐพ์•„๋‚ธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. 

Trigger์˜ ๊ฒฝ์šฐ๋Š” ๋‹จ์–ด ๊ทธ๋Œ€๋กœ ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ํŠธ๋ฆฌ๊ฑฐ์ฒ˜๋Ÿผ ์ด์–ด์„œ ์ž‘๋™๋˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ•™์ƒ ํ…Œ์ด๋ธ”์— ํ•™์ƒ ์ž…ํ•™๊ธˆ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ–ˆ์„ ๋•Œ (insert๋ฅผ ์จ์„œ ์ž…๋ ฅ ๊ฐ€๋Šฅ), ํ•™๊ต์˜ ์ด ์ž…ํ•™๊ธˆ์ด ์—…๋ฐ์ดํŠธ ๋˜๋„๋ก ํ•˜๊ณ  ์‹ถ๋‹ค(update)๋Š” ์ƒํ™ฉ์ด ์žˆ๋‹ค๊ณ  ํ•˜์ž. 

๊ทธ๋Ÿฌ๋ฉด CREATE TRIGGER triggername AFTER INSERT ON ํ•™์ƒํ…Œ์ด๋ธ” ~~~ ๊ณผ ๊ฐ™์ด ์‹œ์ž‘ํ• ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์‹œ์—์„œ ํŠธ๋ฆฌ๊ฑฐ๋Š” bankbalance์— ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€์„ ๋•Œ ๋งŒ์•ฝ ์ƒˆ๋กœ์šด ๊ธˆ์•ก์ด ์ž…๋ ฅ๋˜๋ฉด ๊ฐ’์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์„ค์ •ํ•˜์˜€๋‹ค. 

๋‹ค์Œ์œผ๋กœ VIEW ๋Š” ๊ฐ€์ƒ ํ…Œ์ด๋ธ”๊ณผ ๊ฐ™๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฟผ๋ฆฌ๋กœ ๋ฏธ๋ฆฌ ์ •์˜๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ํ…Œ์ด๋ธ”์ด๋ฉฐ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•  ๋•Œ ์–ธ์ œ๋“  ํ…Œ์ด๋ธ”์„ ๋ถ€๋ฅด๋“ฏ ๋ถ€๋ฅผ ์ˆ˜ ์žˆ๋‹ค. ํ…Œ์ด๋ธ”์˜ ๊ฒฝ์šฐ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ๋งค๋ฒˆ ์ฟผ๋ฆฌ๋ฅผ ๋‹ค ์จ์„œ ๋ถˆ๋Ÿฌ์•ผ ํ•˜๋Š” ํ•œ ํŽธ, ๋ทฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ž์ฃผ ํ˜ธ์ถœํ•ด์•ผํ•˜๋Š” ๊ฒฐ๊ณผ๋“ค์„ ํ•œ๋ฒˆ์˜ select ์ฟผ๋ฆฌ๋กœ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ์–ด ํšจ์œจ์ ์ด๋‹ค. 

CREATE VIEW visitor_log AS
	SELECT name, date, hotel, city
    FROM Hotel_Visitor_History
    WHERE city='SEOUL'; 

SELECT * FROM visitor_log;

๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์ •๊ทœํ™” 

์Šคํ‚ค๋งˆ์˜ ์ฒด๊ณ„์  ๋ถ„์„์€ 1)์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๊ณ  2)๋ฐ์ดํ„ฐ ์ˆ˜์ • ๋ฌธ์ œ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  3)๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ๋ฅผ ๋‹จ์ˆœํ™” ํ•˜๊ณ  4)๊ฐ€๋Šฅํ•œ ํšจ์œจ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋ฐ์„œ ์˜จ๋‹ค. ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ ์œผ๋กœ ๋งŒ์•ฝ ํŠน์ • ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ NULL๊ฐ’์ด๋ผ๋„ ๋„ฃ์–ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ์ƒ๊ธด๋‹ค๋Š” ๊ฒƒ์ด๊ณ  ์ด๊ฒƒ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋‚ญ๋น„ํ•˜์—ฌ ๋น„ํšจ์œจ์ ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋˜ ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธ(์ˆ˜์ •) ํ•˜๋Š” ๊ฒฝ์šฐ, ๊ด€๋ จ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์—๋„ ์žˆ๋Š” ๊ฒฝ์šฐ ์—ฌ๋Ÿฌ๋ฒˆ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•ด์•ผ ํ•˜๊ณ  ๋งŒ์•ฝ ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ๊ฐ™์ด ์—…๋ฐ์ดํŠธํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์ „์ฒด ํ…Œ์ด๋ธ”์„ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ํ…Œ์ด๋ธ”์˜ ๊ตฌ์„ฑ๊ณผ ์‹ฌํ•˜๋ฉด ๊ด€๊ณ„๋„๋ฅผ ๋‹ค์‹œ ์„ค๊ณ„ํ•ด์•ผํ•˜๋Š” ์ƒํ™ฉ์ด ์˜ฌ ์ˆ˜ ์žˆ๋‹ค. ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ ํ•˜๋‚˜์˜ ํ•ญ๋ชฉ๋งŒ ์‚ญ์ œ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ•ด๋‹น ๋‚ด์šฉ์ด ํฌํ•จ๋œ ์ „์ฒด ํ–‰์ด ์‚ญ์ œ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ž์นซ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ญ์ œ๋˜๋Š” ๊ฒฝ์šฐ๋„ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. 

์ด๋Ÿฌํ•œ ์—ฌ๋Ÿฌ ๋ฌธ์ œ๋“ค์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ๋ฐฉ์–ดํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ •๊ทœํ™”๋Š” ์ „ํ†ต์  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„์—์„œ ๊ต‰์žฅํžˆ ์ค‘์š”ํ•œ ๊ณผ์ •์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. 

 

์ผ๋ฐ˜์ ์œผ๋กœ 1์ฐจ - 3.5์ฐจ ์ •๊ทœํ™”๋ฅผ ๊ฑฐ์น˜๋ฉด ๋Œ€๋ถ€๋ถ„์˜ ํ…Œ์ด๋ธ”๋“ค์€ ์ชผ๊ฐœ์งˆ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€๋กœ ์ชผ๊ฐœ์–ด์ง„ ๊ฒƒ์œผ๋กœ ๋ณด์ง€๋งŒ 3์ฐจ ์ดํ›„์˜ ์ •๊ทœํ™”๋“ค๋„ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ๋“ค์ด ์žˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ๋Š” 6์ฐจ๊นŒ์ง€๋งŒ ์–ธ๊ธ‰ํ•  ๊ฒƒ์ด๋‹ค. ์ •๊ทœํ™”๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐ๋œ๋‹ค๋ฉด ์Šคํ‚ค๋งˆ์˜ ์ฒด๊ณ„์  ๋ถ„์„ ์š”๊ฑด 4๊ฐ€์ง€๋ฅผ ๋ชจ๋‘ ์ถฉ์กฑํ•˜๋Š” ์ง€ ํ™•์ธํ•ด ๋ด„์œผ๋กœ์จ ์„ค๊ณ„๋ฅผ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค.

 

Stage Condition
1st Normal form - 1NF  ๊ฐ ํ–‰์ด ์ „๋ถ€ PK๋กœ ๋…๋ฆฝ์ ์ด๊ณ  ์œ ๋‹ˆํฌํ•˜๊ฒŒ ๋ถ„๋ฅ˜๋  ์ˆ˜ ์žˆ๋‹ค.(๊ฐ ์—ด์— ์ค‘๋ณต์ด ์—†๋‹ค)
๊ฐ ์—ด์ด ๋ชจ๋‘ ์›์ž์„ฑ์„ ๊ฐ€์ง„๋‹ค.(ํ•˜๋‚˜์˜ ์…€์€ ๋‹จ, ํ•˜๋‚˜์˜ ๊ฐ’๋งŒ ๋ณด์œ )
์ค‘๋ณต๋˜๋Š” ํ–‰์ด ์—†๋‹ค. 
2nd Normal form - 2NF 1์ฐจ ์ •๊ทœํ™”๋ฅผ ๋งŒ์กฑํ•  ๋•Œ, 
Composite key(2๊ฐœ ์ด์ƒ์ด ์„ธํŠธ) ๊ฐ€ PK ์ผ๋•Œ ๋ชจ๋“  ์—ด๋“ค์ด PK ์„ธํŠธ์— ์˜์กดํ•˜๋Š” ๊ฒฝ์šฐ Full dependency๋ผ๊ณ  ํ•˜๊ณ  ํ•˜๋‚˜์˜ ํ‚ค์—๋งŒ ์˜์กดํ•˜๋Š” ๊ฒฝ์šฐ Partial dependecy ๋ผ๊ณ  ํ•œ๋‹ค. Partial dependency ๋ชจ๋‘ ์ œ๊ฑฐ! 
๋งŒ์•ฝ ํ•„์š”ํ•˜๋ฉด ๋ธŒ๋ฆฌ์ง€ ํ…Œ์ด๋ธ”์„ ๋„์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค. 
3rd Normal form - 3NF 1์ฐจ, 2์ฐจ ์ •๊ทœํ™” ๋ชจ๋‘ ๋งŒ์กฑ ์‹œ, 
๊ฐ ์—ด์€ ๋ชจ๋‘ PK์— ๋”ฐ๋ผ์„œ๋งŒ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค. (๋งŒ์•ฝ ๋‹ค๋ฅธ ๊ฐ’์—๋„ ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๋‹ค๋ฉด ์ชผ๊ฐœ์•ผ ํ•œ๋‹ค!!)
Beyond 3rd Normal form
(Boyce-Codd Normal form, 3.5NF)
๋งŒ์•ฝ 3์ฐจ๊นŒ์ง€ ๋งŒ์กฑํ•œ๋‹ค๋ฉด, 
ํ…Œ์ด๋ธ”์€ ๋‹จ ํ•œ๊ฐœ์˜ ํ›„๋ณดํ‚ค๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. 
4NF BCNF(3.5 ์ •๊ทœํ™”)๊นŒ์ง€ ๋งŒ์กฑ์‹œ, 
์—ด์€ ํ•˜๋‚˜ ์ด์ƒ์˜ ์ค‘๋ณต๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค. 
5NF 4 ์ •๊ทœํ™” ๊นŒ์ง€ ๋งŒ์กฑ์‹œ, 
๋ฐ์ดํ„ฐ ์†์‹ค ์—†์ด ๋”์ด์ƒ ํ…Œ์ด๋ธ” ์ชผ๊ฐค ์ˆ˜ ์—†๋Š” ์ƒํƒœ์ด๋‹ค
6NF 5 ์ •๊ทœํ™”๊นŒ์ง€ ๋งŒ์กฑ์‹œ,
๊ฐ ํ…Œ์ด๋ธ”์—๋Š” ํ•˜๋‚˜์˜ ์—ด๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. 
๋ฐ˜์‘ํ˜•