๋‹ค์ค‘ ๋ชจ๋ธ DBMS๊ฐ€ ํ˜„๋Œ€ ์ •๋ณด ์‹œ์Šคํ…œ์˜ ๊ธฐ์ดˆ์ž…๋‹ˆ๊นŒ?

ํ˜„๋Œ€ ์ •๋ณด ์‹œ์Šคํ…œ์€ ๋งค์šฐ ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค. ๋ฌด์—‡๋ณด๋‹ค๋„, ๊ทธ ๋ณต์žก์„ฑ์€ ๊ทธ ์•ˆ์—์„œ ์ฒ˜๋ฆฌ๋˜๋Š” ๋ฐ์ดํ„ฐ์˜ ๋ณต์žก์„ฑ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ์˜ ๋ณต์žก์„ฑ์€ ์ข…์ข… ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์˜ ๋‹ค์–‘์„ฑ์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐ์ดํ„ฐ๊ฐ€ "ํฐ" ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ํŠน์„ฑ ์ค‘ ํ•˜๋‚˜๋Š” ๋ฐ์ดํ„ฐ์˜ ์–‘("๋ณผ๋ฅจ")๋ฟ ์•„๋‹ˆ๋ผ ๋‹ค์–‘์„ฑ("๋‹ค์–‘์„ฑ")์ž…๋‹ˆ๋‹ค.

์ถ”๋ก ์—์„œ ์•„์ง ๊ฒฐํ•จ์„ ์ฐพ์ง€ ๋ชปํ–ˆ๋‹ค๋ฉด ๊ณ„์† ์ฝ์œผ์‹ญ์‹œ์˜ค.

๋‹ค์ค‘ ๋ชจ๋ธ DBMS๊ฐ€ ํ˜„๋Œ€ ์ •๋ณด ์‹œ์Šคํ…œ์˜ ๊ธฐ์ดˆ์ž…๋‹ˆ๊นŒ?


๋‚ด์šฉ

๋‹ค์–ธ์–ด ์ง€์†์„ฑ
๋‹ค์ค‘ ๋ชจ๋ธ
๊ด€๊ณ„ํ˜• ๋ชจ๋ธ ๊ธฐ๋ฐ˜์˜ ๋‹ค์ค‘ ๋ชจ๋ธ DBMS
     MS SQL Server์˜ ๋ฌธ์„œ ๋ชจ๋ธ
     MS SQL Server์˜ ๊ทธ๋ž˜ํ”„ ๋ชจ๋ธ
๋ฌธ์„œ ๋ชจ๋ธ ๊ธฐ๋ฐ˜์˜ ๋‹ค์ค‘ ๋ชจ๋ธ DBMS
     MarkLogic์˜ ๊ด€๊ณ„ํ˜• ๋ชจ๋ธ
     MarkLogic์˜ ๊ทธ๋ž˜ํ”„ ๋ชจ๋ธ
โ€œ์ฃผ๋ชจ๋ธ ์—†๋Š”โ€ ๋‹ค์ค‘๋ชจ๋ธ DBMS
     ์•„๋ž‘๊ณ DB
     OrientDB
     ์• ์ € ์ฝ”์Šค๋ชจ์ŠคDB
๊ทธ๋ž˜ํ”„ ๋ชจ๋ธ ๊ธฐ๋ฐ˜์˜ ๋‹ค์ค‘ ๋ชจ๋ธ DBMS?
๊ฒฐ๋ก 
ะžะฟั€ะพั

๋‹ค์–ธ์–ด ์ง€์†์„ฑ

์œ„์˜ ๋‚ด์šฉ์€ ๋•Œ๋กœ๋Š” ํ•˜๋‚˜์˜ ์‹œ์Šคํ…œ ํ”„๋ ˆ์ž„์›Œํฌ ๋‚ด์—์„œ๋„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ DBMS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค๋กœ ์ด์–ด์ง€๋ฉฐ, ๊ฐ DBMS๋Š” ์ž์ฒด ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. M. Fowler์˜ ๊ฐ€๋ฒผ์šด ์†๊ธธ๋กœ, ์ €์ž ๋งŽ์€ ์œ ๋ช…ํ•œ ์ฑ…๋“ค๊ณผ ๊ทธ ์ค‘ ํ•˜๋‚˜ ๊ณต๋™ ์ €์ž ์• ์ž์ผ ์„ ์–ธ๋ฌธ(Agile Manifesto), ์ด๋Ÿฐ ์ƒํ™ฉ์„ ์ด๋ ‡๊ฒŒ ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ๋‹ค์ค‘ ๋ณ€ํ˜• ์Šคํ† ๋ฆฌ์ง€ (โ€œ๋‹ค์–ธ์–ด ์ง€์†์„ฑโ€).

Fowler๋Š” ๋˜ํ•œ ์ „์ž ์ƒ๊ฑฐ๋ž˜ ๋ถ„์•ผ์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ ๊ณ ๋ถ€ํ•˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ˆ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์ค‘ ๋ชจ๋ธ DBMS๊ฐ€ ํ˜„๋Œ€ ์ •๋ณด ์‹œ์Šคํ…œ์˜ ๊ธฐ์ดˆ์ž…๋‹ˆ๊นŒ?

๋ฌผ๋ก  ์ด ์˜ˆ๋Š” ๋‹ค์†Œ ๊ณผ์žฅ๋˜์—ˆ์ง€๋งŒ ํ•ด๋‹น ๋ชฉ์ ์— ๋งž๊ฒŒ ํ•˜๋‚˜ ๋˜๋Š” ๋‹ค๋ฅธ DBMS๋ฅผ ์„ ํƒํ•˜๋Š” ๋ฐ ์œ ๋ฆฌํ•œ ๋ช‡ ๊ฐ€์ง€ ๊ณ ๋ ค ์‚ฌํ•ญ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—.

๊ทธ๋Ÿฐ ๋™๋ฌผ์›์—์„œ ํ•˜์ธ์ด ๋˜๋Š” ๊ฒƒ์ด ์‰ฝ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์€ ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฐ์ดํ„ฐ ์ €์žฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฝ”๋“œ์˜ ์–‘์€ ์‚ฌ์šฉ๋˜๋Š” DBMS ์ˆ˜์— ๋น„๋ก€ํ•˜์—ฌ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ๋™๊ธฐํ™”ํ•˜๋Š” ์ฝ”๋“œ์˜ ์–‘์€ ์ด ์ˆซ์ž์˜ ์ œ๊ณฑ์— ๋น„๋ก€ํ•˜์ง€ ์•Š๋”๋ผ๋„ ์ข‹์Šต๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ๋˜๋Š” DBMS ์ˆ˜์˜ ๋ฐฐ์ˆ˜์— ๋”ฐ๋ผ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ DBMS์˜ ๊ธฐ์—… ํŠน์„ฑ(ํ™•์žฅ์„ฑ, ๋‚ด๊ฒฐํ•จ์„ฑ, ๊ณ ๊ฐ€์šฉ์„ฑ)์„ ์ œ๊ณตํ•˜๋Š” ๋น„์šฉ์ด ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ์Šคํ† ๋ฆฌ์ง€ ํ•˜์œ„ ์‹œ์Šคํ…œ ์ „์ฒด์˜ ๊ธฐ์—… ํŠน์„ฑ, ํŠนํžˆ ํŠธ๋žœ์žญ์…˜์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋™๋ฌผ์› ์ฑ…์ž„์ž์˜ ๊ด€์ ์—์„œ ๋ณด๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • DBMS ์ œ์กฐ์—…์ฒด์˜ ๋ผ์ด์„ผ์Šค ๋ฐ ๊ธฐ์ˆ  ์ง€์› ๋น„์šฉ์ด ์—ฌ๋Ÿฌ ๋ฒˆ ์ฆ๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์ธ๋ ฅ ๊ณผ์ž‰ ๋ฐ ๋งˆ๊ฐ์ผ ์ฆ๊ฐ€.
  • ๋ฐ์ดํ„ฐ ๋ถˆ์ผ์น˜๋กœ ์ธํ•œ ์ง์ ‘์ ์ธ ๊ธˆ์ „์  ์†์‹ค์ด๋‚˜ ๋ฒŒ๊ธˆ.

์‹œ์Šคํ…œ์˜ ์ด ์†Œ์œ  ๋น„์šฉ(TCO)์ด ํฌ๊ฒŒ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. "์—ฌ๋Ÿฌ ์Šคํ† ๋ฆฌ์ง€ ์˜ต์…˜" ์ƒํ™ฉ์—์„œ ๋ฒ—์–ด๋‚  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‹ค์ค‘ ๋ชจ๋ธ

"๋‹ค๋ณ€๋Ÿ‰ ์ €์žฅ"์ด๋ผ๋Š” ์šฉ์–ด๋Š” 2011๋…„์— ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ ‘๊ทผ ๋ฐฉ์‹์˜ ๋ฌธ์ œ์ ์„ ์ธ์‹ํ•˜๊ณ  ์†”๋ฃจ์…˜์„ ์ฐพ๋Š” ๋ฐ ์ˆ˜๋…„์ด ๊ฑธ๋ ธ์œผ๋ฉฐ 2015๋…„์— Gartner ๋ถ„์„๊ฐ€์˜ ์ž…์„ ํ†ตํ•ด ๋‹ต๋ณ€์ด ๊ณต์‹ํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  • "์—์„œNoSQL DBMS ์‹œ์žฅ ๊ฐ€์ด๋“œ - 2015ยป:

    DBMS์˜ ๋ฏธ๋ž˜, ์•„ํ‚คํ…์ฒ˜ ๋ฐ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์€ ๋‹ค์ค‘ ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค.

  • "์—์„œODBMS ๋งค์ง ์ฟผ๋“œ๋ŸฐํŠธ - 2016ยป:

    ์ฃผ์š” ์šด์˜ DBMS๋Š” ๋‹จ์ผ ํ”Œ๋žซํผ์˜ ์ผ๋ถ€๋กœ ๊ด€๊ณ„ํ˜• ๋ฐ ๋น„๊ด€๊ณ„ํ˜• ๋“ฑ ๋‹ค์–‘ํ•œ ๋ชจ๋ธ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฒˆ์—๋Š” Gartner ๋ถ„์„๊ฐ€์˜ ์˜ˆ์ธก์ด ์˜ณ์•˜๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜์‹œ๋ฉด ์ฃผ์š” ํ‰๊ฐ€ DB-Engine์˜ DBMS๋ฅผ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.ะพ๋Œ€๋ถ€๋ถ„์˜ ๋ฆฌ๋”๋Š” ์Šค์Šค๋กœ๋ฅผ ๋‹ค์ค‘ ๋ชจ๋ธ DBMS๋กœ ํฌ์ง€์…”๋‹ํ•ฉ๋‹ˆ๋‹ค. ๋น„๊ณต๊ฐœ ๋“ฑ๊ธ‰์ด ์žˆ๋Š” ํŽ˜์ด์ง€์—์„œ๋„ ๋™์ผํ•œ ๋‚ด์šฉ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜ ํ‘œ๋Š” ๋‹ค์ค‘ ๋ชจ๋ธ์ด๋ผ๊ณ  ์ฃผ์žฅํ•˜๋Š” ๊ฐ ๋น„๊ณต๊ฐœ ๋“ฑ๊ธ‰์˜ ์„ ๋‘์ฃผ์ž์ธ DBMS๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๊ฐ DBMS์— ๋Œ€ํ•ด ์›๋ž˜ ์ง€์›๋˜๋Š” ๋ชจ๋ธ(ํ•œ๋•Œ ์œ ์ผํ•œ ๋ชจ๋ธ)๊ณผ ํ˜„์žฌ ์ง€์›๋˜๋Š” ๋ชจ๋ธ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ž์ฒด์ ์œผ๋กœ "์›๋ž˜ ๋‹ค์ค‘ ๋ชจ๋ธ"๋กœ ์ž๋ฆฌ๋งค๊น€ํ•˜๊ณ  ์ž‘์„ฑ์ž์— ๋”ฐ๋ฅด๋ฉด ์ดˆ๊ธฐ ์ƒ์†๋œ ๋ชจ๋ธ์ด ์—†๋Š” DBMS๋„ ๋‚˜์—ด๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

DBMS ์ดˆ๊ธฐ ๋ชจ๋ธ ์ถ”๊ฐ€ ๋ชจ๋ธ
์‹ ํƒ ๊ด€๊ณ„ํ˜• ๊ทธ๋ž˜ํ”„, ๋ฌธ์„œ
MS์˜ SQL ๊ด€๊ณ„ํ˜• ๊ทธ๋ž˜ํ”„, ๋ฌธ์„œ
PostgreSQL ๊ด€๊ณ„ํ˜• ๊ทธ๋ž˜ํ”„*, ๋ฌธ์„œ
๋งˆํฌ๋กœ์ง ๊ธฐ๋กํ•œ ๊ฒƒ ๊ทธ๋ž˜ํ”„, ๊ด€๊ณ„ํ˜•
MongoDB์˜ ๊ธฐ๋กํ•œ ๊ฒƒ ํ‚ค-๊ฐ’, ๊ทธ๋ž˜ํ”„*
๋ฐ์ดํ„ฐ์Šคํƒ์Šค ์™€์ด๋“œ ์ปฌ๋Ÿผ ๋‹คํ๋ฉ˜ํ„ฐ๋ฆฌ, ๊ทธ๋ž˜ํ”„
Redis ํ•ต์‹ฌ ๊ฐ€์น˜ ๋‹คํ๋ฉ˜ํ„ฐ๋ฆฌ, ๊ทธ๋ž˜ํ”„*
์•„๋ž‘๊ณ DB - ๊ทธ๋ž˜ํ”„, ๋ฌธ์„œ
OrientDB - ๊ทธ๋ž˜ํ”„, ๋ฌธ์„œ, ๊ด€๊ณ„ํ˜•
์• ์ € ์ฝ”์Šค๋ชจ์ŠคDB - ๊ทธ๋ž˜ํ”„, ๋ฌธ์„œ, ๊ด€๊ณ„ํ˜•

ํ…Œ์ด๋ธ” ๋…ธํŠธ

์˜ˆ์•ฝ์ด ํ•„์š”ํ•œ ํ…Œ์ด๋ธ” ํ‘œ์‹œ ๋ฌธ์˜ ๋ณ„ํ‘œ:

  • PostgreSQL DBMS๋Š” ๊ทธ๋ž˜ํ”„ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์„ ์ง€์›ํ•˜์ง€ ์•Š์ง€๋งŒ, ์ด ์ œํ’ˆ์€ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์„ ๊ธฐ๋ฐ˜์œผ๋กœ, AgensGraph์™€ ๊ฐ™์€.
  • MongoDB์™€ ๊ด€๋ จํ•˜์—ฌ ์ฟผ๋ฆฌ ์–ธ์–ด์— ๊ทธ๋ž˜ํ”„ ์—ฐ์‚ฐ์ž๊ฐ€ ์žˆ๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ๋” ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค($lookup, $graphLookup) ๊ทธ๋ž˜ํ”„ ๋ชจ๋ธ ์ง€์›์— ๊ด€ํ•œ ๊ฒƒ๋ณด๋‹ค ๋ฌผ๋ก  ๋„์ž…์—๋Š” ๊ทธ๋ž˜ํ”„ ๋ชจ๋ธ ์ง€์› ๋ฐฉํ–ฅ์œผ๋กœ ๋ฌผ๋ฆฌ์  ์Šคํ† ๋ฆฌ์ง€ ์ˆ˜์ค€์—์„œ ์ผ๋ถ€ ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • Redis์™€ ๊ด€๋ จํ•˜์—ฌ ์šฐ๋ฆฌ๋Š” ํ™•์žฅ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ ˆ๋””์Šค๊ทธ๋ž˜ํ”„.

๋‹ค์Œ์œผ๋กœ, ๊ฐ ํด๋ž˜์Šค์— ๋Œ€ํ•ด ์ด ํด๋ž˜์Šค์˜ DBMS์—์„œ ์—ฌ๋Ÿฌ ๋ชจ๋ธ์— ๋Œ€ํ•œ ์ง€์›์ด ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋˜๋Š”์ง€ ๋ณด์—ฌ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ด€๊ณ„ํ˜•, ๋ฌธ์„œ ๋ฐ ๊ทธ๋ž˜ํ”„ ๋ชจ๋ธ์„ ๊ฐ€์žฅ ์ค‘์š”ํ•˜๊ฒŒ ๊ณ ๋ คํ•˜๊ณ  ํŠน์ • DBMS์˜ ์˜ˆ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ "๋ˆ„๋ฝ๋œ ๋ชจ๋ธ"์ด ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋˜๋Š”์ง€ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๊ด€๊ณ„ํ˜• ๋ชจ๋ธ ๊ธฐ๋ฐ˜์˜ ๋‹ค์ค‘ ๋ชจ๋ธ DBMS

ํ˜„์žฌ ์ฃผ์š” DBMS๋Š” ๊ด€๊ณ„ํ˜•์ด๋ฏ€๋กœ RDBMS๊ฐ€ ๋‹ค์ค‘ ๋ชจ๋ธ๋ง ๋ฐฉํ–ฅ์œผ๋กœ์˜ ์›€์ง์ž„์„ ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค๋ฉด Gartner์˜ ์˜ˆ์ธก์€ ์‚ฌ์‹ค์ด๋ผ๊ณ  ๊ฐ„์ฃผ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋“ค์€ ์‹œ์—ฐํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ๋‹ค์ค‘ ๋ชจ๋ธ DBMS๋Š” ์•„๋ฌด๊ฒƒ๋„ ์ž˜ ํ•  ์ˆ˜ ์—†๋Š” ์Šค์œ„์Šค ์นผ๊ณผ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด Larry Ellison์—๊ฒŒ ์ง์ ‘์ ์œผ๋กœ ์ „๋‹ฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ €์ž๋Š” ๋ฌธ์„œ ๋ฐ ๊ทธ๋ž˜ํ”„ ๋ชจ๋ธ์— ๋Œ€ํ•œ RDBMS ์ง€์›์ด ์„ค๋ช…๋  ์˜ˆ์—์„œ Microsoft SQL Server์˜ ๋‹ค์ค‘ ๋ชจ๋ธ๋ง ๊ตฌํ˜„์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

MS SQL Server์˜ ๋ฌธ์„œ ๋ชจ๋ธ

MS SQL Server๊ฐ€ ๋ฌธ์„œ ๋ชจ๋ธ์— ๋Œ€ํ•œ ์ง€์›์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด Habrรฉ์—๋Š” ์ด๋ฏธ ๋‘ ๊ฐœ์˜ ํ›Œ๋ฅญํ•œ ๊ธฐ์‚ฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ„๋žตํ•œ ์„ค๋ช…๊ณผ ์„ค๋ช…์œผ๋กœ ์ œํ•œํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

MS SQL Server์—์„œ ๋ฌธ์„œ ๋ชจ๋ธ์„ ์ง€์›ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๊ด€๊ณ„ํ˜• DBMS์—์„œ ๋งค์šฐ ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. JSON ๋ฌธ์„œ๋Š” ์ผ๋ฐ˜ ํ…์ŠคํŠธ ํ•„๋“œ์— ์ €์žฅํ•˜๋„๋ก ์ œ์•ˆ๋ฉ๋‹ˆ๋‹ค. ๋ฌธ์„œ ๋ชจ๋ธ์— ๋Œ€ํ•œ ์ง€์›์€ ์ด JSON์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ธฐ ์œ„ํ•œ ํŠน์ˆ˜ ์—ฐ์‚ฐ์ž๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • JSON_VALUE ์Šค์นผ๋ผ ์†์„ฑ ๊ฐ’์„ ์ถ”์ถœํ•˜๋ ค๋ฉด,
  • JSON_QUERY ํ•˜์œ„ ๋ฌธ์„œ๋ฅผ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.

๋‘ ์—ฐ์‚ฐ์ž์˜ ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” JSONPath์™€ ์œ ์‚ฌํ•œ ๊ตฌ๋ฌธ์˜ ํ‘œํ˜„์‹์ž…๋‹ˆ๋‹ค.

์ถ”์ƒ์ ์œผ๋กœ, ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ์ €์žฅ๋œ ๋ฌธ์„œ๋Š” ํŠœํ”Œ๊ณผ ๋‹ฌ๋ฆฌ ๊ด€๊ณ„ํ˜• DBMS์˜ "์ผ๊ธ‰ ์—”ํ„ฐํ‹ฐ"๊ฐ€ ์•„๋‹ˆ๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ MS SQL Server์—๋Š” ํ˜„์žฌ JSON ๋ฌธ์„œ์˜ ํ•„๋“œ์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ํ•„๋“œ์˜ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ด๋ธ”์„ ์กฐ์ธํ•˜๊ณ  ์ด๋Ÿฌํ•œ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์„œ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์กฐ์ฐจ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ•ด๋‹น ํ•„๋“œ์— ๋Œ€ํ•ด ๊ณ„์‚ฐ๋œ ์—ด๊ณผ ํ•ด๋‹น ํ•„๋“œ์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ MS SQL Server๋Š” ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ด๋ธ” ๋‚ด์šฉ์—์„œ JSON ๋ฌธ์„œ๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ๊ตฌ์„ฑํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. FOR JSON PATH -์–ด๋–ค ์˜๋ฏธ์—์„œ๋Š” ์ด์ „์˜ ๊ธฐ์กด ์Šคํ† ๋ฆฌ์ง€์™€ ๋ฐ˜๋Œ€๋˜๋Š” ๊ฐ€๋Šฅ์„ฑ์ž…๋‹ˆ๋‹ค. RDBMS๊ฐ€ ์•„๋ฌด๋ฆฌ ๋น ๋ฅด๋”๋ผ๋„ ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ธ๊ธฐ ์žˆ๋Š” ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ๊ธฐ์„ฑ ๋‹ต๋ณ€์„ ์ €์žฅํ•˜๊ณ  ๊ฐœ๋ฐœ ์šฉ์ด์„ฑ ๋ฌธ์ œ๋งŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์†๋„๋Š” ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ๋ฌธ์„œ DBMS์˜ ์ด๋ฐ์˜ฌ๋กœ๊ธฐ์™€ ๋ชจ์ˆœ๋œ๋‹ค๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ MS SQL Server๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌธ์„œ ๊ตฌ์„ฑ์˜ ๋ฐ˜๋Œ€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ JSON์„ ํ…Œ์ด๋ธ”๋กœ ๋ถ„ํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. OPENJSON. ๋ฌธ์„œ๊ฐ€ ์™„์ „ํžˆ ํ‰ํ‰ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. CROSS APPLY.

MS SQL Server์˜ ๊ทธ๋ž˜ํ”„ ๋ชจ๋ธ

๊ทธ๋ž˜ํ”„(LPG) ๋ชจ๋ธ์— ๋Œ€ํ•œ ์ง€์›๋„ Microsoft SQL Server์—์„œ ์™„๋ฒฝํ•˜๊ฒŒ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ƒ๋Œ€๋กœ: ๋…ธ๋“œ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ทธ๋ž˜ํ”„ ์—์ง€๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ํŠน์ˆ˜ ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ œ์•ˆ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ…Œ์ด๋ธ”์€ ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. CREATE TABLE AS NODE ะธ CREATE TABLE AS EDGE ๊ฐ๊ฐ.

์ฒซ ๋ฒˆ์งธ ์œ ํ˜•์˜ ํ…Œ์ด๋ธ”์€ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ €์žฅํ•˜๋Š” ์ผ๋ฐ˜ ํ…Œ์ด๋ธ”๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ ํ…Œ์ด๋ธ”์— ์‹œ์Šคํ…œ ํ•„๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋Š” ์ ๋งŒ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. $node_id โ€” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋‚ด ๊ทธ๋ž˜ํ”„ ๋…ธ๋“œ์˜ ๊ณ ์œ  ์‹๋ณ„์ž์ž…๋‹ˆ๋‹ค.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋‘ ๋ฒˆ์งธ ์œ ํ˜•์˜ ํ…Œ์ด๋ธ”์—๋Š” ์‹œ์Šคํ…œ ํ•„๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. $from_id ะธ $to_id, ์ด๋Ÿฌํ•œ ํ…Œ์ด๋ธ”์˜ ํ•ญ๋ชฉ์€ ๋…ธ๋“œ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์œ ํ˜•์˜ ๊ด€๊ณ„๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋ณ„๋„์˜ ํ…Œ์ด๋ธ”์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์ค‘ ๋ชจ๋ธ DBMS๊ฐ€ ํ˜„๋Œ€ ์ •๋ณด ์‹œ์Šคํ…œ์˜ ๊ธฐ์ดˆ์ž…๋‹ˆ๊นŒ? ์ด๋ฅผ ์˜ˆ๋ฅผ ๋“ค์–ด ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜ํ”„ ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์€ ๋ ˆ์ด์•„์›ƒ์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ํ•ด๋‹น ๊ตฌ์กฐ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ DDL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

CREATE TABLE Person (
  ID INTEGER NOT NULL,
  name VARCHAR(100)
) AS NODE;

CREATE TABLE Cafe (
  ID INTEGER NOT NULL, 
  name VARCHAR(100), 
) AS NODE;

CREATE TABLE likes (
  rating INTEGER
) AS EDGE;

CREATE TABLE friendOf
  AS EDGE;

ALTER TABLE likes
  ADD CONSTRAINT EC_LIKES CONNECTION (Person TO Cafe);

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

SELECT Cafe.name
  FROM Person, likes, Cafe
  WHERE MATCH (Person-(friendOf)-(likes)->Cafe)
  AND Person.name = 'John';

๋”์šฑ์ด, ๊ทธ๋Ÿฌํ•œ ํ…Œ์ด๋ธ”๋กœ ์ž‘์—…ํ•  ๋•Œ ์ด๋Ÿฌํ•œ ๊ทธ๋ž˜ํ”„ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ์ƒ๋‹นํžˆ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ผ๋ฐ˜์ ์ธ SQL ์ฟผ๋ฆฌ์—์„œ ์œ ์‚ฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ์‹œ์Šคํ…œ "๊ทธ๋ž˜ํ”„" ๋…ธ๋“œ ์‹๋ณ„์ž๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€์ ์ธ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์—ฌ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค($node_id, $from_id, $to_id; ๊ฐ™์€ ์ด์œ ๋กœ ๋ฐ์ดํ„ฐ ์‚ฝ์ž… ์ฟผ๋ฆฌ๋Š” ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ฒˆ๊ฑฐ๋กœ์›Œ ์—ฌ๊ธฐ์— ํ‘œ์‹œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

๋ฌธ์„œ ๋ชจ๋ธ ๊ธฐ๋ฐ˜์˜ ๋‹ค์ค‘ ๋ชจ๋ธ DBMS

์ด ์„น์…˜์—์„œ๋Š” ๊ฐ€์žฅ ์ธ๊ธฐ๊ฐ€ ์—†๋Š” MongoDB์˜ ์˜ˆ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์„œ DBMS์—์„œ ๋‹ค์ค‘ ๋ชจ๋ธ์˜ ๊ตฌํ˜„์„ ์„ค๋ช…ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค(๋งํ•œ ๋Œ€๋กœ ์กฐ๊ฑด๋ถ€ ๊ทธ๋ž˜ํ”„ ์—ฐ์‚ฐ์ž๋งŒ ์žˆ์Œ). $lookup ะธ $graphLookup, ์ƒค๋”ฉ๋œ ์ปฌ๋ ‰์…˜์—์„œ ์ž‘์—…ํ•˜์ง€ ์•Š์Œ), ๋ณด๋‹ค ์„ฑ์ˆ™ํ•˜๊ณ  "์—”ํ„ฐํ”„๋ผ์ด์ฆˆ" DBMS์˜ ์˜ˆ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋งˆํฌ๋กœ์ง.

๋”ฐ๋ผ์„œ ์ปฌ๋ ‰์…˜์— ๋‹ค์Œ ์œ ํ˜•์˜ XML ๋ฌธ์„œ ์„ธํŠธ๋ฅผ ํฌํ•จ์‹œํ‚ค์‹ญ์‹œ์˜ค(MarkLogic์—์„œ๋Š” JSON ๋ฌธ์„œ๋ฅผ ์ €์žฅํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค).

<Person INN="631803299804">
  <name>John</name>
  <surname>Smith</surname>
</Person>

MarkLogic์˜ ๊ด€๊ณ„ํ˜• ๋ชจ๋ธ

๋ฌธ์„œ ๋ชจ์Œ์˜ ๊ด€๊ณ„ํ˜• ๋ณด๊ธฐ๋Š” ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋””์Šคํ”Œ๋ ˆ์ด ํ…œํ”Œ๋ฆฟ (์š”์†Œ์˜ ๋‚ด์šฉ value ์•„๋ž˜ ์˜ˆ์—๋Š” ์ž„์˜์˜ XPath๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<template >
  <context>/Person</context>
  <rows>
    <row>
      <view-name>Person</view-name>
      <columns>
        <column>
          <name>SSN</name>
          <value>@SSN</value>
          <type>string</type>
        </column>
        <column>
          <name>name</name>
          <value>name</value>
        </column>
        <column>
          <name>surname</name>
          <value>surname</value>
        </column>
      </columns>
    </row>
  <rows>
</template>

SQL ์ฟผ๋ฆฌ(์˜ˆ: ODBC๋ฅผ ํ†ตํ•ด)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑ๋œ ๋ทฐ์˜ ์ฃผ์†Œ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SELECT name, surname FROM Person WHERE name="John"

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

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

๊ทธ๋ž˜ํ”„(RDF) ๋ชจ๋ธ์„ ์ง€์›ํ•˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ๊ฑฐ์˜ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋„์›€์„ ๋ฐ›์•„ ๋””์Šคํ”Œ๋ ˆ์ด ํ…œํ”Œ๋ฆฟ ์œ„์˜ ์˜ˆ์—์„œ ๋ฌธ์„œ ๋ชจ์Œ์˜ RDF ํ‘œํ˜„์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<template >
  <context>/Person</context>
    <vars>
      <var>
        <name>PREFIX</name>
        <val>"http://example.org/example#"</val>
      </var>
    </vars>
  <triples>
    <triple>
      <subject><value>sem:iri( $PREFIX || @SSN )</value></subject>
      <predicate><value>sem:iri( $PREFIX || surname )</value></predicate>
      <object><value>xs:string( surname )</value></object>
    </triple>
    <triple>
      <subject><value>sem:iri( $PREFIX || @SSN )</value></subject>
      <predicate><value>sem:iri( $PREFIX || name )</value></predicate>
      <object><value>xs:string( name )</value></object>
    </triple>
  </triples>
  </template>

SPARQL ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒฐ๊ณผ RDF ๊ทธ๋ž˜ํ”„๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

PREFIX : <http://example.org/example#>
SELECT ?name ?surname {
  :631803299804 :name ?name ; :surname ?surname .
}

๊ด€๊ณ„ํ˜• ๋ชจ๋ธ๊ณผ ๋‹ฌ๋ฆฌ MarkLogic์€ ๋‘ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๊ทธ๋ž˜ํ”„ ๋ชจ๋ธ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

  1. DBMS๋Š” RDF ๋ฐ์ดํ„ฐ์˜ ์™„์ „ํ•œ ๋ณ„๋„ ์ €์žฅ์†Œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ด€๋ฆฌ ์œ„์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ๊ณผ๋Š” ๋Œ€์กฐ์ ์œผ๋กœ ์ถ”์ถœํ•œ).
  2. ํŠน์ˆ˜ ์ง๋ ฌํ™”์˜ RDF๋Š” XML ๋˜๋Š” JSON ๋ฌธ์„œ์— ๊ฐ„๋‹จํžˆ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๊ทธ๋Ÿฌ๋ฉด ์„ธ ์Œ์ด ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค). ๊ด€๋ฆฌ๋˜์ง€ ์•Š๋Š”). ์ด๊ฒƒ์€ ์•„๋งˆ๋„ ๋ฉ”์ปค๋‹ˆ์ฆ˜์˜ ๋Œ€์•ˆ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. idref ๊ธฐํƒ€

MarkLogic์—์„œ "์‹ค์ œ๋กœ" ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•œ ์ข‹์€ ์•„์ด๋””์–ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ด‘ํ•™ API, ์ด๋Ÿฌํ•œ ์˜๋ฏธ์—์„œ ๋ชฉ์ ์€ ์˜คํžˆ๋ ค ๋ฐ˜๋Œ€์ด์ง€๋งŒ ์‚ฌ์šฉ๋œ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์—์„œ ์ถ”์ƒํ™”ํ•˜๊ณ  ๋‹ค์–‘ํ•œ ๋ชจ๋ธ, ํŠธ๋žœ์žญ์…˜์„ฑ ๋“ฑ์˜ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ผ๊ด€๋œ ์ž‘์—…์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋‚ฎ์€ ์ˆ˜์ค€์ž…๋‹ˆ๋‹ค.

โ€œ์ฃผ๋ชจ๋ธ ์—†๋Š”โ€ ๋‹ค์ค‘๋ชจ๋ธ DBMS

์ƒ์†๋œ ๋ฉ”์ธ ๋ชจ๋ธ ์—†์ด ์ดˆ๊ธฐ์— ๋‹ค์ค‘ ๋ชจ๋ธ๋กœ ์ž๋ฆฌ๋งค๊น€ํ•˜๋Š” DBMS๋„ ์‹œ์žฅ์— ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๋‹ค์Œ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค ์•„๋ž‘๊ณ DB, OrientDB (2018๋…„๋ถ€ํ„ฐ ๊ฐœ๋ฐœ ํšŒ์‚ฌ๋Š” SAP์— ์†ํ•จ) ๋ฐ ์ฝ”์Šค๋ชจ์ŠคDB (Microsoft Azure ํด๋ผ์šฐ๋“œ ํ”Œ๋žซํผ์˜ ์ผ๋ถ€์ธ ์„œ๋น„์Šค).

์‹ค์ œ๋กœ ArangoDB์™€ OrientDB์—๋Š” "ํ•ต์‹ฌ" ๋ชจ๋ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ ๋ฌธ์„œ ๋ชจ๋ธ์„ ์ผ๋ฐ˜ํ™”ํ•œ ์ž์ฒด ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜ํ™”๋Š” ์ฃผ๋กœ ๊ทธ๋ž˜ํ”„ ๋ฐ ๊ด€๊ณ„ํ˜• ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

Habrรฉ์—๋Š” ArangoDB์™€ OrientDB์— ๊ด€ํ•œ ํ›Œ๋ฅญํ•œ ๊ธฐ์‚ฌ๊ฐ€ ์ด๋ฏธ ์žˆ์Šต๋‹ˆ๋‹ค: NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— JOIN.

์•„๋ž‘๊ณ DB

ArangoDB๋Š” ๊ทธ๋ž˜ํ”„ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์„ ์ง€์›ํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค.

ArangoDB์—์„œ ๊ทธ๋ž˜ํ”„์˜ ๋…ธ๋“œ๋Š” ์ผ๋ฐ˜ ๋ฌธ์„œ์ด๊ณ , ๊ฐ€์žฅ์ž๋ฆฌ๋Š” ์ผ๋ฐ˜ ์‹œ์Šคํ…œ ํ•„๋“œ์™€ ํ•จ๊ป˜ (_key, _id, _rev) ์‹œ์Šคํ…œ ๋ถ„์•ผ _from ะธ _to. ๋ฌธ์„œ DBMS์˜ ๋ฌธ์„œ๋Š” ์ „ํ†ต์ ์œผ๋กœ ์ปฌ๋ ‰์…˜์œผ๋กœ ๊ฒฐํ•ฉ๋ฉ๋‹ˆ๋‹ค. Edge๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์„œ ๋ชจ์Œ์„ ArangoDB์—์„œ๋Š” Edge Collection์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์—ฃ์ง€ ์ˆ˜์ง‘ ๋ฌธ์„œ๋„ ๋ฌธ์„œ์ด๊ธฐ ๋•Œ๋ฌธ์— ArangoDB์˜ ์—ฃ์ง€๋„ ๋…ธ๋“œ ์—ญํ• ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์›์‹œ ๋ฐ์ดํ„ฐ

์ปฌ๋ ‰์…˜์„ ํ•ด๋ณด์ž persons, ํ•ด๋‹น ๋ฌธ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

[
  {
    "_id"  : "people/alice" ,
    "_key" : "alice" ,
    "name" : "ะะปะธัะฐ"
  },
  {
    "_id"  : "people/bob" ,
    "_key" : "bob" ,
    "name" : "ะ‘ะพะฑ"  
  }
]

์ปฌ๋ ‰์…˜๋„ ์žˆ๊ฒŒ ํ•ด์ฃผ์„ธ์š” cafes:

[
  {
    "_id" : "cafes/jd" ,
    "_key" : "jd" ,
    "name" : "ะ”ะถะพะฝ ะ”ะพะฝะฝ"  
  },
  {
    "_id" : "cafes/jj" ,
    "_key" : "jj" ,
    "name" : "ะ–ะฐะฝ-ะ–ะฐะบ"
  }
]

๊ทธ๋Ÿฐ ๋‹ค์Œ ์ปฌ๋ ‰์…˜ likes ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

[
  {
    "_id" : "likes/1" ,
    "_key" : "1" ,
    "_from" : "persons/alice" ,
    "_to" : "cafes/jd",
    "since" : 2010 
  },
  {
    "_id" : "likes/2" ,
    "_key" : "2" ,
    "_from" : "persons/alice" ,
    "_to" : "cafes/jj",
    "since" : 2011 
  } ,
  {
    "_id" : "likes/3" ,
    "_key" : "3" ,
    "_from" : "persons/bob" ,
    "_to" : "cafes/jd",
    "since" : 2012 
  }
]

์ฟผ๋ฆฌ ๋ฐ ๊ฒฐ๊ณผ

๋ˆ„๊ฐ€ ์–ด๋–ค ์นดํŽ˜๋ฅผ ์ข‹์•„ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ํ˜•์‹์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ArangoDB์—์„œ ์‚ฌ์šฉ๋˜๋Š” AQL ์–ธ์–ด์˜ ๊ทธ๋ž˜ํ”„ ์Šคํƒ€์ผ ์ฟผ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

FOR p IN persons
  FOR c IN OUTBOUND p likes
  RETURN { person : p.name , likes : c.name }

๊ด€๊ณ„๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๊ณ  "๊ณ„์‚ฐ"ํ•˜๋Š” ๊ด€๊ณ„ํ˜• ์Šคํƒ€์ผ์—์„œ๋Š” ์ด ์ฟผ๋ฆฌ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‹ค์‹œ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. likes ์—†์ด๋„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค):

FOR p IN persons
  FOR l IN likes
  FILTER p._key == l._from
    FOR c IN cafes
    FILTER l._to == c._key
    RETURN { person : p.name , likes : c.name }

๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ ๊ฒฐ๊ณผ๋Š” ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

[
  { "person" : "ะะปะธัะฐ" , likes : "ะ–ะฐะฝ-ะ–ะฐะบ" } ,
  { "person" : "ะะปะธัะฐ" , likes : "ะ”ะถะพะฝ ะ”ะพะฝะฝ" } ,
  { "person" : "ะ‘ะพะฑ" , likes : "ะ”ะถะพะฝ ะ”ะพะฝะฝ" }
]

์ถ”๊ฐ€ ์ฟผ๋ฆฌ ๋ฐ ๊ฒฐ๊ณผ

์œ„์˜ ๊ฒฐ๊ณผ ํ˜•์‹์ด ๋ฌธ์„œ DBMS๋ณด๋‹ค ๊ด€๊ณ„ํ˜• DBMS์—์„œ ๋” ์ผ๋ฐ˜์ ์ด๋ผ๊ณ  ์ƒ๊ฐ๋˜๋ฉด ์ด ์ฟผ๋ฆฌ๋ฅผ ์‹œ๋„ํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋˜๋Š” ๋‹ค์Œ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค). COLLECT):

FOR p IN persons
  RETURN {
    person : p.name,
    likes : (
      FOR c IN OUTBOUND p likes
      RETURN c.name
    )
}

๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

[
  { "person" : "ะะปะธัะฐ" , likes : ["ะ–ะฐะฝ-ะ–ะฐะบ" , "ะ”ะถะพะฝ ะ”ะพะฝะฝ"]  } ,
  { "person" : "ะ‘ะพะฑ" , likes : ["ะ”ะถะพะฝ ะ”ะพะฝะฝ"] }
]

OrientDB

OrientDB์—์„œ ๋ฌธ์„œ ๋ชจ๋ธ ์œ„์— ๊ทธ๋ž˜ํ”„ ๋ชจ๋ธ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ธฐ๋ณธ์€ ๊ธฐํšŒ ๋ฌธ์„œ ํ•„๋“œ์—๋Š” ๋‹ค์†Œ ํ‘œ์ค€์ ์ธ ์Šค์นผ๋ผ ๊ฐ’ ์™ธ์—๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์œ ํ˜•์˜ ๊ฐ’๋„ ์žˆ์Šต๋‹ˆ๋‹ค. LINK, LINKLIST, LINKSET, LINKMAP ะธ LINKBAG. ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ๊ฐ’์€ ๋‹ค์Œ์— ๋Œ€ํ•œ ๋งํฌ ๋˜๋Š” ๋งํฌ ๋ชจ์Œ์ž…๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ์‹๋ณ„์ž ๋ฌธ์„œ.

์‹œ์Šคํ…œ์— ์˜ํ•ด ํ• ๋‹น๋œ ๋ฌธ์„œ ์‹๋ณ„์ž๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ธฐ๋ก์˜ ์œ„์น˜๋ฅผ โ€‹โ€‹๋‚˜ํƒ€๋‚ด๋Š” "๋ฌผ๋ฆฌ์  ์˜๋ฏธ"๋ฅผ ๊ฐ€์ง€๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. @rid : #3:16. ๋”ฐ๋ผ์„œ ์ฐธ์กฐ ์†์„ฑ์˜ ๊ฐ’์€ (๊ด€๊ณ„ํ˜• ๋ชจ๋ธ์—์„œ์™€ ๊ฐ™์ด) ์„ ํƒ ์กฐ๊ฑด์ด ์•„๋‹ˆ๋ผ ์‹ค์ œ๋กœ ํฌ์ธํ„ฐ(๊ทธ๋ž˜ํ”„ ๋ชจ๋ธ์—์„œ์™€ ๊ฐ™์ด)์ž…๋‹ˆ๋‹ค.

ArangoDB์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ OrientDB์˜ Edge๋Š” ๋ณ„๋„์˜ ๋ฌธ์„œ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค. (Edge์— ์ž์ฒด ์†์„ฑ์ด ์—†๋Š” ๊ฒฝ์šฐ ๊ฒฝ๋Ÿ‰, ๋ณ„๋„์˜ ๋ฌธ์„œ์— ํ•ด๋‹นํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค).

์›์‹œ ๋ฐ์ดํ„ฐ

์— ๊ฐ€๊นŒ์šด ํ˜•์‹์œผ๋กœ ๋คํ”„ ํ˜•์‹ OrientDB ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ArangoDB์— ๋Œ€ํ•œ ์ด์ „ ์˜ˆ์ œ์˜ ๋ฐ์ดํ„ฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

[
     {
      "@type": "document",
      "@rid": "#11:0",
      "@class": "Person",
      "name": "ะะปะธัะฐ",
      "out_likes": [
        "#30:1",
        "#30:2"
      ],
      "@fieldTypes": "out_likes=LINKBAG"
    },
    {
      "@type": "document",
      "@rid": "#12:0",
      "@class": "Person",
      "name": "ะ‘ะพะฑ",
      "out_likes": [
        "#30:3"
      ],
      "@fieldTypes": "out_likes=LINKBAG"
    },
    {
      "@type": "document",
      "@rid": "#21:0",
      "@class": "Cafe",
      "name": "ะ–ะฐะฝ-ะ–ะฐะบ",
      "in_likes": [
        "#30:2",
        "#30:3"
      ],
      "@fieldTypes": "in_likes=LINKBAG"
    },
    {
      "@type": "document",
      "@rid": "#22:0",
      "@class": "Cafe",
      "name": "ะ”ะถะพะฝ ะ”ะพะฝะฝ",
      "in_likes": [
        "#30:1"
      ],
      "@fieldTypes": "in_likes=LINKBAG"
    },
    {
      "@type": "document",
      "@rid": "#30:1",
      "@class": "likes",
      "in": "#22:0",
      "out": "#11:0",
      "since": 1262286000000,
      "@fieldTypes": "in=LINK,out=LINK,since=date"
    },
    {
      "@type": "document",
      "@rid": "#30:2",
      "@class": "likes",
      "in": "#21:0",
      "out": "#11:0",
      "since": 1293822000000,
      "@fieldTypes": "in=LINK,out=LINK,since=date"
    },
    {
      "@type": "document",
      "@rid": "#30:3",
      "@class": "likes",
      "in": "#21:0",
      "out": "#12:0",
      "since": 1325354400000,
      "@fieldTypes": "in=LINK,out=LINK,since=date"
    }
  ]

๋ณด์‹œ๋‹ค์‹œํ”ผ ์ •์ ์€ ๋“ค์–ด์˜ค๊ณ  ๋‚˜๊ฐ€๋Š” ๊ฐ€์žฅ์ž๋ฆฌ์— ๋Œ€ํ•œ ์ •๋ณด๋„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ~์— ์‚ฌ์šฉ Document API๋Š” ์ฐธ์กฐ ๋ฌด๊ฒฐ์„ฑ ์ž์ฒด๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•ด์•ผ ํ•˜๋ฉฐ Graph API๋Š” ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์— ํ†ตํ•ฉ๋˜์ง€ ์•Š์€ "์ˆœ์ˆ˜ํ•œ" ์ฟผ๋ฆฌ ์–ธ์–ด์—์„œ OrientDB์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๊ฐ€ ์–ด๋–ค ๋ชจ์Šต์ธ์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ฟผ๋ฆฌ ๋ฐ ๊ฒฐ๊ณผ

OrientDB์˜ ArangoDB ์˜ˆ์ œ ์ฟผ๋ฆฌ์™€ ๋ชฉ์ ์ด ์œ ์‚ฌํ•œ ์ฟผ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

SELECT name AS person_name, OUT('likes').name AS cafe_name
   FROM Person
   UNWIND cafe_name

๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ์–ป์–ด์ง‘๋‹ˆ๋‹ค.

[
  { "person_name": "ะะปะธัะฐ", "cafe_name": "ะ”ะถะพะฝ ะ”ะพะฝะฝ" },
  { "person_name": "ะะปะธัะฐ", "cafe_name": "ะ–ะฐะฝ-ะ–ะฐะบ" },
  { "person_name": "ะ‘ะพะฑ",  "cafe_name": "ะ–ะฐะฝ-ะ–ะฐะบ" }
]

๊ฒฐ๊ณผ ํ˜•์‹์ด ๋„ˆ๋ฌด "๊ด€๊ณ„ํ˜•"์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋ฉด ๋‹ค์Œ ์ค„์„ ์ œ๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. UNWIND():

[
  { "person_name": "ะะปะธัะฐ", "cafe_name": [ "ะ”ะถะพะฝ ะ”ะพะฝะฝ", "ะ–ะฐะฝ-ะ–ะฐะบ" ] },
  { "person_name": "ะ‘ะพะฑ",  "cafe_name": [ "ะ–ะฐะฝ-ะ–ะฐะบ" ' }
]

OrientDB์˜ ์ฟผ๋ฆฌ ์–ธ์–ด๋Š” Gremlin๊ณผ ๊ฐ™์€ ์‚ฝ์ž…์ด ํฌํ•จ๋œ SQL๋กœ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฒ„์ „ 2.2์—์„œ๋Š” Cypher์™€ ์œ ์‚ฌํ•œ ์š”์ฒญ ์–‘์‹์ด ๋“ฑ์žฅํ–ˆ๋Š”๋ฐ, MATCH :

MATCH {CLASS: Person, AS: person}-likes->{CLASS: Cafe, AS: cafe}
RETURN person.name AS person_name, LIST(cafe.name) AS cafe_name
GROUP BY person_name

๊ฒฐ๊ณผ ํ˜•์‹์€ ์ด์ „ ์š”์ฒญ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ฟผ๋ฆฌ์ฒ˜๋Ÿผ ์ข€ ๋” "๊ด€๊ณ„ํ˜•"์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ œ๊ฑฐํ•ด์•ผ ํ•  ํ•ญ๋ชฉ์ด ๋ฌด์—‡์ธ์ง€ ์ƒ๊ฐํ•ด ๋ณด์„ธ์š”.

์• ์ € ์ฝ”์Šค๋ชจ์ŠคDB

ArangoDB ๋ฐ OrientDB์— ๋Œ€ํ•ด ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋‚ด์šฉ์€ ์–ด๋Š ์ •๋„๋Š” Azure CosmosDB์—๋„ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. CosmosDB๋Š” SQL, MongoDB, Gremlin ๋ฐ Cassandra์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

SQL API ๋ฐ MongoDB API๋Š” ๋ฌธ์„œ ๋ชจ๋ธ์˜ ๋ฐ์ดํ„ฐ์— ์•ก์„ธ์Šคํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. Gremlin API ๋ฐ Cassandra API - ๊ฐ๊ฐ ๊ทธ๋ž˜ํ”„ ๋ฐ ์—ด ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ์— ์•ก์„ธ์Šคํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ชจ๋ธ์˜ ๋ฐ์ดํ„ฐ๋Š” CosmosDB ๋‚ด๋ถ€ ๋ชจ๋ธ ํ˜•์‹์œผ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ARS (โ€œatom-record-sequenceโ€), ์ด๋Š” ๋ฌธ์„œ XNUMX์—๋„ ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.

๋‹ค์ค‘ ๋ชจ๋ธ DBMS๊ฐ€ ํ˜„๋Œ€ ์ •๋ณด ์‹œ์Šคํ…œ์˜ ๊ธฐ์ดˆ์ž…๋‹ˆ๊นŒ?

๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ์šฉ์ž๊ฐ€ ์„ ํƒํ•œ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๊ณผ ์‚ฌ์šฉ๋˜๋Š” API๋Š” ์„œ๋น„์Šค์—์„œ ๊ณ„์ •์„ ์ƒ์„ฑํ•˜๋Š” ์‹œ์ ์— ๊ณ ์ •๋ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•œ ๋ชจ๋ธ์— ๋กœ๋“œ๋œ ๋ฐ์ดํ„ฐ์— ๋‹ค๋ฅธ ๋ชจ๋ธ์˜ ํ˜•์‹์œผ๋กœ ์•ก์„ธ์Šคํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์ค‘ ๋ชจ๋ธ DBMS๊ฐ€ ํ˜„๋Œ€ ์ •๋ณด ์‹œ์Šคํ…œ์˜ ๊ธฐ์ดˆ์ž…๋‹ˆ๊นŒ?

๋”ฐ๋ผ์„œ ํ˜„์žฌ Azure CosmosDB์˜ ๋‹ค์ค‘ ๋ชจ๋ธ์€ ํ•œ ์ œ์กฐ์—…์ฒด์˜ ๋‹ค์–‘ํ•œ ๋ชจ๋ธ์„ ์ง€์›ํ•˜๋Š” ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ผ ๋ฟ์ด๋ฉฐ, ์ด๋Š” ๋‹ค์ค‘ ๋ณ€ํ˜• ์Šคํ† ๋ฆฌ์ง€์˜ ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜ํ”„ ๋ชจ๋ธ ๊ธฐ๋ฐ˜์˜ ๋‹ค์ค‘ ๋ชจ๋ธ DBMS?

์ฃผ๋ชฉํ• ๋งŒํ•œ ์ ์€ ์•„์ง ์‹œ์žฅ์— ๊ทธ๋ž˜ํ”„ ๋ชจ๋ธ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๋‹ค์ค‘ ๋ชจ๋ธ DBMS๊ฐ€ ์—†๋‹ค๋Š” ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค(RDF์™€ LPG๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ๊ทธ๋ž˜ํ”„ ๋ชจ๋ธ์„ ๋™์‹œ์— ์ง€์›ํ•˜๋Š” ๋‹ค์ค‘ ๋ชจ๋ธ ์ง€์›์€ ์ œ์™ธ). ์ด์ „ ๊ฐ„ํ–‰๋ฌผ). ๊ฐ€์žฅ ํฐ ์–ด๋ ค์›€์€ ๊ด€๊ณ„ํ˜• ๋ชจ๋ธ์ด ์•„๋‹Œ ๊ทธ๋ž˜ํ”„ ๋ชจ๋ธ ์œ„์— ๋ฌธ์„œ ๋ชจ๋ธ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜ํ”„ ๋ชจ๋ธ ์œ„์— ๊ด€๊ณ„ํ˜• ๋ชจ๋ธ์„ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š๋ƒ๋Š” ๋ฌธ์ œ๋Š” ๊ทธ๋ž˜ํ”„ ๋ชจ๋ธ์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ณผ์ •์—์„œ๋„ ๊ณ ๋ ค๋๋‹ค. ์–ด๋–ป๊ฒŒ ๊ทธ๋Š” ๋งํ–ˆ๋‹ค์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฐ์ด๋น„๋“œ ๋งฅ๊ฑฐ๋ฒˆ:

(1) ์ผ๋ฐ˜์ ์ธ ํ‚ค ๊ฐ’ ์Œ์—์„œ ํŠœํ”Œ์„ ๋ณต๊ตฌํ•˜๊ณ  (2) ๊ด€๊ณ„ ์œ ํ˜•๋ณ„ ํŠœํ”Œ.

๊ทธ๋ž˜ํ”„ ๋ชจ๋ธ ์œ„์— ๋ฌธ์„œ ๋ชจ๋ธ์„ ๊ตฌํ˜„ํ•  ๋•Œ ๋‹ค์Œ ์‚ฌํ•ญ์„ ์—ผ๋‘์— ๋‘์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • JSON ๋ฐฐ์—ด์˜ ์š”์†Œ๋Š” ์ˆœ์„œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜์ง€๋งŒ ๊ทธ๋ž˜ํ”„ ๊ฐ€์žฅ์ž๋ฆฌ์˜ ๊ผญ์ง€์ ์—์„œ ๋‚˜์˜ค๋Š” ์š”์†Œ๋Š” ์ˆœ์„œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ๋ฌธ์„œ ๋ชจ๋ธ์˜ ๋ฐ์ดํ„ฐ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋น„์ •๊ทœํ™”๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๋™์ผํ•œ ํฌํ•จ ๋ฌธ์„œ์˜ ์—ฌ๋Ÿฌ ๋ณต์‚ฌ๋ณธ์„ ์ €์žฅํ•˜๊ณ  ์‹ถ์ง€ ์•Š์œผ๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ ํ•˜์œ„ ๋ฌธ์„œ์—๋Š” ์‹๋ณ„์ž๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ๋ฐ˜๋ฉด, ๋ฌธ์„œ DBMS์˜ ์ด๋…์€ ๋ฌธ์„œ๊ฐ€ ๋งค๋ฒˆ ์ƒˆ๋กœ ๊ตฌ์ถ•ํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๊ธฐ์„ฑํ’ˆ "์ง‘ํ•ฉ์ฒด"๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™„์„ฑ๋œ ๋ฌธ์„œ์— ํ•ด๋‹นํ•˜๋Š” ํ•˜์œ„ ๊ทธ๋ž˜ํ”„๋ฅผ ๋น ๋ฅด๊ฒŒ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๊ทธ๋ž˜ํ”„ ๋ชจ๋ธ์— ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ถ€ ๊ด‘๊ณ 

์ด ๊ธฐ์‚ฌ์˜ ์ €์ž๋Š” ๋‚ด๋ถ€ ๋ชจ๋ธ์ด ๊ทธ๋ž˜ํ”„์ด๊ณ  ์™ธ๋ถ€ ๋ชจ๋ธ(๊ด€๊ณ„ํ˜• ๋ฐ ๋ฌธ์„œ)์ด ํ‘œํ˜„์ธ NitrosBase DBMS์˜ ๊ฐœ๋ฐœ๊ณผ ๊ด€๋ จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ชจ๋ธ์€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์ž์—ฐ์Šค๋Ÿฌ์šด ์ฟผ๋ฆฌ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฑฐ์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์–ด๋–ค ๋ณด๊ธฐ์—์„œ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๋‚ด๋ถ€ ๋ชจ๋ธ์— ๋ฐ˜์˜๋˜๋ฉฐ ๊ทธ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋ณด๊ธฐ์—๋„ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ๊ธฐ์‚ฌ ์ค‘ ํ•˜๋‚˜๋ฅผ ํ†ตํ•ด NitrosBase์˜ ๋ชจ๋ธ ๋งค์นญ์ด ์–ด๋–ค ๋ชจ์Šต์ธ์ง€ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

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

  1. ์šฐ๋ฆฌ๋Š” ์ „ํ†ต์ ์ธ ๋ชจ๋ธ์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ์ผ์ข…์˜ "ํ•˜์ด๋ธŒ๋ฆฌ๋“œ" ๋ชจ๋ธ์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?
  2. ๋ชจ๋ธ์ด "๋™๋“ฑ"ํ•ฉ๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ๊ทธ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋‹ค๋ฅธ ๋ชจ๋ธ์˜ ์ฃผ์ œ์ž…๋‹ˆ๊นŒ?
  3. ๋ชจ๋ธ์€ ์„œ๋กœ "๋ฌด๊ด€์‹ฌ"ํ•ฉ๋‹ˆ๊นŒ? ํ•œ ๋ชจ๋ธ์— ๊ธฐ๋ก๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฅธ ๋ชจ๋ธ์—์„œ ์ฝ๊ฑฐ๋‚˜ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ๋‚˜์š”?

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

๋“ฑ๋ก๋œ ์‚ฌ์šฉ์ž๋งŒ ์„ค๋ฌธ ์กฐ์‚ฌ์— ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋กœ๊ทธ์ธ์ œ๋ฐœ

๋‹ค์ค‘ ๋ชจ๋ธ DBMS๋ฅผ ์‚ฌ์šฉํ•˜์‹œ๋‚˜์š”?

  • ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ชจ๋“  ๊ฒƒ์„ ํ•˜๋‚˜์˜ DBMS์™€ ํ•˜๋‚˜์˜ ๋ชจ๋ธ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

  • ์šฐ๋ฆฌ๋Š” ์ „ํ†ต์ ์ธ DBMS์˜ ๋‹ค์ค‘ ๋ชจ๋ธ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ์šฐ๋ฆฌ๋Š” ๋‹ค์ค‘ ์–ธ์–ด ์ง€์†์„ฑ์„ ์‹ค์ฒœํ•ฉ๋‹ˆ๋‹ค.

  • ์ƒˆ๋กœ์šด ๋‹ค์ค‘ ๋ชจ๋ธ DBMS(Arango, Orient, CosmosDB)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

19๋ช…์˜ ์‚ฌ์šฉ์ž๊ฐ€ ํˆฌํ‘œํ–ˆ์Šต๋‹ˆ๋‹ค. 4๋ช…์˜ ์‚ฌ์šฉ์ž๊ฐ€ ๊ธฐ๊ถŒํ–ˆ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

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