SQL Server 2017 ๊ทธ๋ž˜ํ”„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์†Œ๊ฐœ

์ฝ”์Šค ์‹œ์ž‘ ์ „ "MS SQL ์„œ๋ฒ„ ๊ฐœ๋ฐœ์ž" ์šฐ๋ฆฌ๋Š” ๋‹น์‹ ์„ ์œ„ํ•ด ๋˜ ๋‹ค๋ฅธ ์œ ์šฉํ•œ ๋ฒˆ์—ญ์„ ์ค€๋น„ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜ํ”„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ „๋ฌธ๊ฐ€์—๊ฒŒ ์ค‘์š”ํ•œ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. ์ €๋Š” ์ด ๋ถ„์•ผ์˜ ํ˜์‹ ๊ณผ ์‹ ๊ธฐ์ˆ ์„ ๋”ฐ๋ฅด๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ๊ด€๊ณ„ํ˜• ๋ฐ NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์ž‘์—…ํ•œ ํ›„ ๊ทธ๋ž˜ํ”„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์—ญํ• ์ด ์ ์  ๋” ์ปค์ง€๊ณ  ์žˆ์Œ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ณต์žกํ•œ ๊ณ„์ธต์  ๋ฐ์ดํ„ฐ๋กœ ์ž‘์—…ํ•  ๋•Œ ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฟ๋งŒ ์•„๋‹ˆ๋ผ NoSQL๋„ ๋น„ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค. ์ข…์ข… ๋งํฌ ์ˆ˜์ค€์˜ ์ˆ˜์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํฌ๊ธฐ๊ฐ€ ์ฆ๊ฐ€ํ•˜๋ฉด ์„ฑ๋Šฅ์ด ์ €ํ•˜๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ด€๊ณ„๊ฐ€ ๋” ๋ณต์žกํ•ด์ง์— ๋”ฐ๋ผ JOIN์˜ ์ˆ˜๋„ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๋ฌผ๋ก  ๊ด€๊ณ„ํ˜• ๋ชจ๋ธ์—๋Š” ๊ณ„์ธต ์ž‘์—…์„ ์œ„ํ•œ ์†”๋ฃจ์…˜(์˜ˆ: ์žฌ๊ท€ CTE ์‚ฌ์šฉ)์ด ์žˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋™์‹œ์— SQL Server ๊ทธ๋ž˜ํ”„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์—ฌ๋Ÿฌ ์ˆ˜์ค€์˜ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๊ณผ ์ฟผ๋ฆฌ๊ฐ€ ๋ชจ๋‘ ๋‹จ์ˆœํ™”๋˜์–ด ํšจ์œจ์„ฑ์ด ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ์˜ ์–‘์„ ํฌ๊ฒŒ ์ค„์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜ํ”„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๋ณต์žกํ•œ ์‹œ์Šคํ…œ์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ํ‘œํ˜„ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ์ด ๊ธฐ์ˆ ์€ ์†Œ์…œ ๋„คํŠธ์›Œํฌ, ์‚ฌ๊ธฐ ๋ฐฉ์ง€ ์‹œ์Šคํ…œ, IT ๋„คํŠธ์›Œํฌ ๋ถ„์„, ์†Œ์…œ ์ถ”์ฒœ, ์ œํ’ˆ ๋ฐ ์ฝ˜ํ…์ธ  ์ถ”์ฒœ๊ณผ ๊ฐ™์€ ๋ถ„์•ผ์—์„œ ์ด๋ฏธ IT ์—…๊ณ„์—์„œ ์ƒ๋‹นํžˆ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

SQL Server์˜ ๊ทธ๋ž˜ํ”„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ธฐ๋Šฅ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ณ ๋„๋กœ ์ƒํ˜ธ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๊ณ  ์ž˜ ์ •์˜๋œ ๊ด€๊ณ„๊ฐ€ ์žˆ๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜ํ”„ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ

๊ทธ๋ž˜ํ”„๋Š” ์ •์ (๋…ธ๋“œ, ๋…ธ๋“œ)๊ณผ ์—์ง€(๊ด€๊ณ„, ์—์ง€)์˜ ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค. ์ •์ ์€ ์—”ํ„ฐํ‹ฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๊ณ  ๊ฐ€์žฅ์ž๋ฆฌ๋Š” ์†์„ฑ์— ์ •๋ณด๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ๋Š” ๋งํฌ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

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

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

์˜ค๋Š˜๋‚ ์˜ ์„ธ๊ณ„์—์„œ ๋ชจ๋ธ๋ง ๊ด€๊ณ„์—๋Š” ์ ์  ๋” ์ •๊ตํ•œ ๊ธฐ์ˆ ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ด€๊ณ„๋ฅผ ๋ชจ๋ธ๋งํ•˜๊ธฐ ์œ„ํ•ด SQL Server 2017์€ ๊ทธ๋ž˜ํ”„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜ํ”„์˜ ๊ผญ์ง“์ ๊ณผ ๊ฐ€์žฅ์ž๋ฆฌ๋Š” NODE ๋ฐ EDGE๋ผ๋Š” ์ƒˆ๋กœ์šด ์œ ํ˜•์˜ ํ…Œ์ด๋ธ”๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜ํ”„ ์ฟผ๋ฆฌ๋Š” MATCH()๋ผ๋Š” ์ƒˆ๋กœ์šด T-SQL ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ SQL Server 2017์— ๋‚ด์žฅ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋ณ€ํ™˜ํ•  ํ•„์š” ์—†์ด ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜ํ”„ ๋ชจ๋ธ์˜ ์ด์ 

์˜ค๋Š˜๋‚  ๊ธฐ์—…๊ณผ ์‚ฌ์šฉ์ž๋Š” ๊ณ ์„ฑ๋Šฅ๊ณผ ์•ˆ์ •์„ฑ์„ ๊ธฐ๋Œ€ํ•˜๋ฉด์„œ ์ ์  ๋” ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ์˜ ๊ทธ๋ž˜ํ”„ ํ‘œํ˜„์€ ๋ณต์žกํ•œ ๊ด€๊ณ„๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํŽธ๋ฆฌํ•œ ์ˆ˜๋‹จ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์ฃผ์–ด์ง„ ์ปจํ…์ŠคํŠธ ๋‚ด์—์„œ ๊ฒฐ๊ณผ๋ฅผ ์–ป๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

์•ž์œผ๋กœ ๋งŽ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๊ทธ๋ž˜ํ”„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ด์ ์„ ๋ˆ„๋ฆด ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง: ๊ด€๊ณ„ํ˜•์—์„œ ๊ทธ๋ž˜ํ”„ ๋ชจ๋ธ๋ง์œผ๋กœ

SQL Server 2017 ๊ทธ๋ž˜ํ”„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์†Œ๊ฐœ
์˜ˆ

์ง์› ๊ณ„์ธต์ด ์žˆ๋Š” ์กฐ์ง ๊ตฌ์กฐ์˜ ์˜ˆ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ง์›์€ ๊ด€๋ฆฌ์ž์—๊ฒŒ ๋ณด๊ณ ํ•˜๊ณ  ๊ด€๋ฆฌ์ž๋Š” ์„ ์ž„ ๊ด€๋ฆฌ์ž์—๊ฒŒ ๋ณด๊ณ ํ•˜๋Š” ์‹์ž…๋‹ˆ๋‹ค. ํŠน์ • ํšŒ์‚ฌ์— ๋”ฐ๋ผ ์ด ๊ณ„์ธต ๊ตฌ์กฐ์—๋Š” ์—ฌ๋Ÿฌ ์ˆ˜์ค€์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ˆ˜์ค€์˜ ์ˆ˜๊ฐ€ ์ฆ๊ฐ€ํ•จ์— ๋”ฐ๋ผ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ด€๊ณ„๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์ด ์ ์  ๋” ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค. ์ง์›์˜ ๊ณ„์ธต, ๋งˆ์ผ€ํŒ… ๋˜๋Š” ์†Œ์…œ ๋ฏธ๋””์–ด ์—ฐ๊ฒฐ์˜ ๊ณ„์ธต์„ ์ƒ์ƒํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. SQL ๊ทธ๋ž˜ํ”„๊ฐ€ ๋‹ค์–‘ํ•œ ์ˆ˜์ค€์˜ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด ์˜ˆ์—์„œ๋Š” ๊ฐ„๋‹จํ•œ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์„ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ง์› ํ…Œ์ด๋ธ” ๋งŒ๋“ค๊ธฐ EMP ์‹ ๋ถ„์ฆ์œผ๋กœ ์— ํ”„๋…ธ ๋ฐ ์—ด M.G.R.์ง์›์˜ ์ฑ…์ž„์ž(๊ด€๋ฆฌ์ž) ID๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” A. ๊ณ„์ธต ๊ตฌ์กฐ์— ๋Œ€ํ•œ ๋ชจ๋“  ์ •๋ณด๋Š” ์ด ํ…Œ์ด๋ธ”์— ์ €์žฅ๋˜๋ฉฐ ์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฟผ๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์— ํ”„๋…ธ ะธ M.G.R..

SQL Server 2017 ๊ทธ๋ž˜ํ”„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์†Œ๊ฐœ
๋‹ค์Œ ๋‹ค์ด์–ด๊ทธ๋žจ์€ ๋˜ํ•œ ๋” ์นœ์ˆ™ํ•œ ํ˜•์‹์œผ๋กœ XNUMX๋‹จ๊ณ„ ์ค‘์ฒฉ์ด ์žˆ๋Š” ๋™์ผํ•œ ์กฐ์ง๋„ ๋ชจ๋ธ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ง์›์€ ํ…Œ์ด๋ธ”์—์„œ ๊ทธ๋ž˜ํ”„์˜ ์ •์ ์ž…๋‹ˆ๋‹ค. EMP. ์—”ํ„ฐํ‹ฐ "์ง์›"์€ "์ œ์ถœ"(ReportsTo) ๊ด€๊ณ„์— ์˜ํ•ด ์ž์ฒด์ ์œผ๋กœ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜ํ”„ ์šฉ์–ด๋กœ ๋งํฌ๋Š” ์ง์›๋“ค์˜ ๋…ธ๋“œ(NODE)๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์—์ง€(EDGE)์ž…๋‹ˆ๋‹ค.

SQL Server 2017 ๊ทธ๋ž˜ํ”„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์†Œ๊ฐœ

์ผ๋ฐ˜ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค์–ด ๋ด…์‹œ๋‹ค EMP ์œ„์˜ ๋‹ค์ด์–ด๊ทธ๋žจ์— ๋”ฐ๋ผ ๊ฑฐ๊ธฐ์— ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.

CREATE TABLE EMP
(EMPNO INT NOT NULL,
ENAME VARCHAR(20),
JOB VARCHAR(10),
MGR INT,
JOINDATE DATETIME,
SALARY DECIMAL(7, 2),
COMMISIION DECIMAL(7, 2),
DNO INT)
 
INSERT INTO EMP VALUES
(7369, 'SMITH', 'CLERK', 7902, '02-MAR-1970', 8000, NULL, 2),
(7499, 'ALLEN', 'SALESMAN', 7698, '20-MAR-1971', 1600, 3000, 3),
(7521, 'WARD', 'SALESMAN', 7698, '07-FEB-1983', 1250, 5000, 3),
(7566, 'JONES', 'MANAGER', 7839, '02-JUN-1961', 2975, 50000, 2),
(7654, 'MARTIN', 'SALESMAN', 7698, '28-FEB-1971', 1250, 14000, 3),
(7698, 'BLAKE', 'MANAGER', 7839, '01-JAN-1988', 2850, 12000, 3),
(7782, 'CLARK', 'MANAGER', 7839, '09-APR-1971', 2450, 13000, 1),
(7788, 'SCOTT', 'ANALYST', 7566, '09-DEC-1982', 3000, 1200, 2),
(7839, 'KING', 'PRESIDENT', NULL, '17-JUL-1971', 5000, 1456, 1),
(7844, 'TURNER', 'SALESMAN', 7698, '08-AUG-1971', 1500, 0, 3),
(7876, 'ADAMS', 'CLERK', 7788, '12-MAR-1973', 1100, 0, 2),
(7900, 'JAMES', 'CLERK', 7698, '03-NOV-1971', 950, 0, 3),
(7902, 'FORD', 'ANALYST', 7566, '04-MAR-1961', 3000, 0, 2),
(7934, 'MILLER', 'CLERK', 7782, '21-JAN-1972', 1300, 0, 1)

์•„๋ž˜ ๊ทธ๋ฆผ์€ ์ง์›์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

  • ์ง์› ์— ํ”„๋…ธ 7369๋Š” 7902์— ์ข…์†๋ฉ๋‹ˆ๋‹ค.
  • ์ง์› ์— ํ”„๋…ธ 7902์— ์ข…์†๋œ 7566
  • ์ง์› ์— ํ”„๋…ธ 7566์— ์ข…์†๋œ 7839

SQL Server 2017 ๊ทธ๋ž˜ํ”„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์†Œ๊ฐœ
์ด์ œ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋ž˜ํ”„ ํ˜•ํƒœ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. EMPLOYEE ๋…ธ๋“œ์—๋Š” ์—ฌ๋Ÿฌ ์†์„ฑ์ด ์žˆ์œผ๋ฉฐ "์ œ์ถœ" ๊ด€๊ณ„(EmplReportsTo)๋ฅผ ํ†ตํ•ด ์ž์ฒด์ ์œผ๋กœ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. EmplReportsTo๋Š” ๊ด€๊ณ„์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

์—์ง€ ํ…Œ์ด๋ธ”(EDGE)์—๋„ ์†์„ฑ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SQL Server 2017 ๊ทธ๋ž˜ํ”„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์†Œ๊ฐœ
๋…ธ๋“œ ํ…Œ์ด๋ธ” EmpNode ์ƒ์„ฑ

๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ตฌ๋ฌธ์€ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ด๋ธ” ๋งŒ๋“ค๊ธฐ ๋งˆ์ง€๋ง‰์— ์ถ”๊ฐ€๋จ ๋…ธ๋“œ๋กœ.

CREATE TABLE dbo.EmpNode(
ID Int Identity(1,1),
EMPNO NUMERIC(4) NOT NULL,
ENAME VARCHAR(10),
MGR NUMERIC(4),
DNO INT
) AS NODE;

์ด์ œ ์ผ๋ฐ˜ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋ž˜ํ”„๋กœ ๋ณ€ํ™˜ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ INSERT ๊ด€๊ณ„ํ˜• ํ…Œ์ด๋ธ”์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค. EMP.

INSERT INTO EmpNode(EMPNO,ENAME,MGR,DNO) select empno,ename,MGR,dno from emp

SQL Server 2017 ๊ทธ๋ž˜ํ”„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์†Œ๊ฐœ
ํŠน์ˆ˜ ์—ด์˜ ๋…ธ๋“œ ํ…Œ์ด๋ธ”์—์„œ $node_id_* ํ˜ธ์ŠคํŠธ ID๋Š” JSON์œผ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ์ด ํ…Œ์ด๋ธ”์˜ ๋‚˜๋จธ์ง€ ์—ด์—๋Š” ๋…ธ๋“œ์˜ ์†์„ฑ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

๊ฐ€์žฅ์ž๋ฆฌ ๋งŒ๋“ค๊ธฐ(EDGE)

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

CREATE TABLE empReportsTo(Deptno int) AS EDGE

SQL Server 2017 ๊ทธ๋ž˜ํ”„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์†Œ๊ฐœ

์ด์ œ ์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ ์ง์› ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์ •์˜ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์— ํ”„๋…ธ ะธ M.G.R.. ์กฐ์ง๋„๋Š” ์ž‘์„ฑ ๋ฐฉ๋ฒ•์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. INSERT.

INSERT INTO empReportsTo  VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 1),
   	(SELECT $node_id FROM EmpNode WHERE id = 13),20);
INSERT INTO empReportsTo  VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 2),
   	(SELECT $node_id FROM EmpNode WHERE id = 6),10);
INSERT INTO empReportsTo  VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 3),
   	(SELECT $node_id FROM EmpNode WHERE id = 6),10)
INSERT INTO empReportsTo  VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 4),
   	(SELECT $node_id FROM EmpNode WHERE id = 9),30);
INSERT INTO empReportsTo  VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 5),
   	(SELECT $node_id FROM EmpNode WHERE id = 6),30);
INSERT INTO empReportsTo  VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 6),
   	(SELECT $node_id FROM EmpNode WHERE id = 9),30);
INSERT INTO empReportsTo  VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 7),
   	(SELECT $node_id FROM EmpNode WHERE id = 9),30);
INSERT INTO empReportsTo  VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 8),
   	(SELECT $node_id FROM EmpNode WHERE id = 4),30);
INSERT INTO empReportsTo  VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 9),
   	(SELECT $node_id FROM EmpNode WHERE id = 9),30);
INSERT INTO empReportsTo  VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 10),
   	(SELECT $node_id FROM EmpNode WHERE id = 6),30);
INSERT INTO empReportsTo  VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 11),
   	(SELECT $node_id FROM EmpNode WHERE id = 8),30);
INSERT INTO empReportsTo  VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 12),
   	(SELECT $node_id FROM EmpNode WHERE id = 6),30);
INSERT INTO empReportsTo  VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 13),
   	(SELECT $node_id FROM EmpNode WHERE id = 4),30);
INSERT INTO empReportsTo  VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 14),
   	(SELECT $node_id FROM EmpNode WHERE id = 7),30);

Edge ํ…Œ์ด๋ธ”์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์„ธ ๊ฐœ์˜ ์—ด์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ, $edge_id โ€” JSON ํ˜•์‹์˜ ์—์ง€ ์‹๋ณ„์ž. ๋‚˜๋จธ์ง€ ๋‘ ๊ฐœ($from_id ะธ $to_id) ๋…ธ๋“œ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ฐ€์žฅ์ž๋ฆฌ์—๋Š” ์ถ”๊ฐ€ ์†์„ฑ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ ์ด ๋ŽํŠธ๋…ธ.

์‹œ์Šคํ…œ ๋ณด๊ธฐ

์‹œ์Šคํ…œ ๋ณด๊ธฐ์—์„œ sys.tables ๋‘ ๊ฐœ์˜ ์ƒˆ ์—ด์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. is_edge
  2. is_node

SELECT t.is_edge,t.is_node,*
FROM sys.tables t
WHERE name like 'emp%'

SQL Server 2017 ๊ทธ๋ž˜ํ”„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์†Œ๊ฐœ

SSMS

๊ทธ๋ž˜ํ”„์™€ ๊ด€๋ จ๋œ ๊ฐœ์ฒด๋Š” Graph Tables ํด๋”์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋…ธ๋“œ ํ…Œ์ด๋ธ” ์•„์ด์ฝ˜์€ ์ ์œผ๋กœ ํ‘œ์‹œ๋˜๊ณ  ์—์ง€ ํ…Œ์ด๋ธ” ์•„์ด์ฝ˜์€ ๋‘ ๊ฐœ์˜ ์—ฐ๊ฒฐ๋œ ์›(์•ฝ๊ฐ„ ์•ˆ๊ฒฝ์ฒ˜๋Ÿผ ๋ณด์ž„)์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

SQL Server 2017 ๊ทธ๋ž˜ํ”„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์†Œ๊ฐœ

๋งค์น˜ ์‹

ํ‘œํ˜„ MATCH CQL(Cypher Query Language)์—์„œ ๊ฐ€์ ธ์˜จ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๊ทธ๋ž˜ํ”„์˜ ์†์„ฑ์„ ์ฟผ๋ฆฌํ•˜๋Š” ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. CQL์€ ์‹์œผ๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. MATCH.

๊ตฌ๋ฌธ

MATCH (<graph_search_pattern>)
 
<graph_search_pattern>::=
    {<node_alias> {
                 	{ <-( <edge_alias> )- }
               	| { -( <edge_alias> )-> }
             	<node_alias>
             	}
 	}
 	[ { AND } { ( <graph_search_pattern> ) } ]
 	[ ,...n ]
 
<node_alias> ::=
    node_table_name | node_alias
 
<edge_alias> ::=
    edge_table_name | edge_alias

์˜ˆ

๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜ ์ฟผ๋ฆฌ๋Š” Smith์™€ ๊ทธ์˜ ๊ด€๋ฆฌ์ž๊ฐ€ ๋ณด๊ณ ํ•˜๋Š” ์ง์›์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

SELECT
E.EMPNO,E.ENAME,E.MGR,E1.EMPNO,E1.ENAME,E1.MGR
FROM
    empnode e, empnode e1, empReportsTo m
WHERE
    MATCH(e-(m)->e1)
and e.ENAME='SMITH'

SQL Server 2017 ๊ทธ๋ž˜ํ”„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์†Œ๊ฐœ
๋‹ค์Œ ์ฟผ๋ฆฌ๋Š” Smith์˜ ์ง์› ๋ฐ XNUMX๋‹จ๊ณ„ ๊ด€๋ฆฌ์ž๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ œ์•ˆ์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒฝ์šฐ WHERE, ๊ทธ๋Ÿฌ๋ฉด ๋ชจ๋“  ์ง์›์ด ๊ฒฐ๊ณผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

SELECT
E.EMPNO,E.ENAME,E.MGR,E1.EMPNO,E1.ENAME,E1.MGR,E2.EMPNO,e2.ENAME,E2.MGR
FROM
    empnode e, empnode e1, empReportsTo m ,empReportsTo m1, empnode e2
WHERE
    MATCH(e-(m)->e1-(m1)->e2)
and e.ENAME='SMITH'

SQL Server 2017 ๊ทธ๋ž˜ํ”„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์†Œ๊ฐœ
๋งˆ์ง€๋ง‰์œผ๋กœ XNUMX๊ธ‰ ์ง์› ๋ฐ ๊ด€๋ฆฌ์ž์— ๋Œ€ํ•œ ์š”์ฒญ์ž…๋‹ˆ๋‹ค.

SELECT
E.EMPNO,E.ENAME,E.MGR,E1.EMPNO,E1.ENAME,E1.MGR,E2.EMPNO,e2.ENAME,E2.MGR,E3.EMPNO,e3.ENAME,E3.MGR
FROM
    empnode e, empnode e1, empReportsTo m ,empReportsTo m1, empnode e2, empReportsTo M2, empnode e3
WHERE
    MATCH(e-(m)->e1-(m1)->e2-(m2)->e3)
and e.ENAME='SMITH'

SQL Server 2017 ๊ทธ๋ž˜ํ”„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์†Œ๊ฐœ
์ด์ œ Smith์˜ ์ƒ์‚ฌ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ๋ฐฉํ–ฅ์„ ๋ฐ”๊พธ์ž.

SELECT
E.EMPNO,E.ENAME,E.MGR,E1.EMPNO,E1.ENAME,E1.MGR,E2.EMPNO,e2.ENAME,E2.MGR,E3.EMPNO,e3.ENAME,E3.MGR
FROM
    empnode e, empnode e1, empReportsTo m ,empReportsTo m1, empnode e2, empReportsTo M2, empnode e3
WHERE
    MATCH(e<-(m)-e1<-(m1)-e2<-(m2)-e3)

SQL Server 2017 ๊ทธ๋ž˜ํ”„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์†Œ๊ฐœ

๊ฒฐ๋ก 

SQL Server 2017์€ ๋‹ค์–‘ํ•œ ๋น„์ฆˆ๋‹ˆ์Šค IT ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๋Š” ์™„๋ฒฝํ•œ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์†”๋ฃจ์…˜์œผ๋กœ ์ž๋ฆฌ ์žก์•˜์Šต๋‹ˆ๋‹ค. SQL Graph์˜ ์ฒซ ๋ฒˆ์งธ ๋ฒ„์ „์€ ๋งค์šฐ ์œ ๋งํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ ์ œํ•œ ์‚ฌํ•ญ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๊ทธ๋ž˜ํ”„์˜ ๊ฐ€๋Šฅ์„ฑ์„ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ถฉ๋ถ„ํ•œ ๊ธฐ๋Šฅ์ด ์ด๋ฏธ ์žˆ์Šต๋‹ˆ๋‹ค.

SQL ๊ทธ๋ž˜ํ”„ ๊ธฐ๋Šฅ์€ SQL ์—”์ง„์— ์™„์ „ํžˆ ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋ฏธ ์–ธ๊ธ‰ํ•œ ๋ฐ”์™€ ๊ฐ™์ด SQL Server 2017์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ œํ•œ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹คํ˜•์„ฑ์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ๋‹จ๋ฐฉํ–ฅ ๋งํฌ๋งŒ ์ง€์›๋ฉ๋‹ˆ๋‹ค.
  • Edge๋Š” UPDATE๋ฅผ ํ†ตํ•ด $from_id ๋ฐ $to_id ์—ด์„ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ์ „์ด ํ์‡„๋Š” ์ง€์›๋˜์ง€ ์•Š์ง€๋งŒ CTE๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฉ”๋ชจ๋ฆฌ ๋‚ด OLTP ๊ฐœ์ฒด์— ๋Œ€ํ•œ ์ง€์›์ด ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.
  • ์ž„์‹œ ํ…Œ์ด๋ธ”(์‹œ์Šคํ…œ ๋ฒ„์ „ ์ž„์‹œ ํ…Œ์ด๋ธ”), ์ž„์‹œ ๋กœ์ปฌ ๋ฐ ์ „์—ญ ํ…Œ์ด๋ธ”์€ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํ…Œ์ด๋ธ” ์œ ํ˜• ๋ฐ ํ…Œ์ด๋ธ” ๋ณ€์ˆ˜๋Š” NODE ๋˜๋Š” EDGE๋กœ ์„ ์–ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ„ ์ฟผ๋ฆฌ๋Š” ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜ ํ…Œ์ด๋ธ”์„ ๊ทธ๋ž˜ํ”„ ํ…Œ์ด๋ธ”๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ง์ ‘์ ์ธ ๋ฐฉ๋ฒ•์ด๋‚˜ ์ผ์ข…์˜ ๋งˆ๋ฒ•์‚ฌ(๋งˆ๋ฒ•์‚ฌ)๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๋ž˜ํ”„๋ฅผ ํ‘œ์‹œํ•˜๋Š” GUI๋Š” ์—†์ง€๋งŒ Power BI๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SQL Server 2017 ๊ทธ๋ž˜ํ”„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์†Œ๊ฐœ

๋” ์ฝ์–ด๋ณด๊ธฐ:

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€