ํ๋ ์ ๋ณด ์์คํ ์ ๋งค์ฐ ๋ณต์กํฉ๋๋ค. ๋ฌด์๋ณด๋ค๋, ๊ทธ ๋ณต์ก์ฑ์ ๊ทธ ์์์ ์ฒ๋ฆฌ๋๋ ๋ฐ์ดํฐ์ ๋ณต์ก์ฑ์ผ๋ก ์ธํด ๋ฐ์ํฉ๋๋ค. ๋ฐ์ดํฐ์ ๋ณต์ก์ฑ์ ์ข ์ข ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ ๋ชจ๋ธ์ ๋ค์์ฑ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์๋ฅผ ๋ค์ด ๋ฐ์ดํฐ๊ฐ "ํฐ" ๊ฒฝ์ฐ ๋ฌธ์ ๊ฐ ๋๋ ํน์ฑ ์ค ํ๋๋ ๋ฐ์ดํฐ์ ์("๋ณผ๋ฅจ")๋ฟ ์๋๋ผ ๋ค์์ฑ("๋ค์์ฑ")์ ๋๋ค.
์ถ๋ก ์์ ์์ง ๊ฒฐํจ์ ์ฐพ์ง ๋ชปํ๋ค๋ฉด ๊ณ์ ์ฝ์ผ์ญ์์ค.
๋ค์ธ์ด ์ง์์ฑ
์์ ๋ด์ฉ์ ๋๋ก๋ ํ๋์ ์์คํ
ํ๋ ์์ํฌ ๋ด์์๋ ์ฌ๋ฌ ๊ฐ์ ์๋ก ๋ค๋ฅธ DBMS๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์ด๋ฅผ ์ฒ๋ฆฌํ๋ ๋ค์ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผ ํ๋ค๋ ์ฌ์ค๋ก ์ด์ด์ง๋ฉฐ, ๊ฐ DBMS๋ ์์ฒด ๋ฐ์ดํฐ ๋ชจ๋ธ์ ์ง์ํฉ๋๋ค. M. Fowler์ ๊ฐ๋ฒผ์ด ์๊ธธ๋ก,
Fowler๋ ๋ํ ์ ์ ์๊ฑฐ๋ ๋ถ์ผ์ ๋ชจ๋ ๊ธฐ๋ฅ์ ๊ฐ์ถ ๊ณ ๋ถํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ดํฐ ์ ์ฅ์๋ฅผ ๊ตฌ์ฑํ๋ ๋ค์๊ณผ ๊ฐ์ ์๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
๋ฌผ๋ก ์ด ์๋ ๋ค์ ๊ณผ์ฅ๋์์ง๋ง ํด๋น ๋ชฉ์ ์ ๋ง๊ฒ ํ๋ ๋๋ ๋ค๋ฅธ DBMS๋ฅผ ์ ํํ๋ ๋ฐ ์ ๋ฆฌํ ๋ช ๊ฐ์ง ๊ณ ๋ ค ์ฌํญ์ ์ฐพ์ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๊ทธ๋ฐ ๋๋ฌผ์์์ ํ์ธ์ด ๋๋ ๊ฒ์ด ์ฝ์ง ์๋ค๋ ๊ฒ์ ๋ถ๋ช ํฉ๋๋ค.
- ๋ฐ์ดํฐ ์ ์ฅ์ ์ํํ๋ ์ฝ๋์ ์์ ์ฌ์ฉ๋๋ DBMS ์์ ๋น๋กํ์ฌ ์ฆ๊ฐํฉ๋๋ค. ๋ฐ์ดํฐ๋ฅผ ๋๊ธฐํํ๋ ์ฝ๋์ ์์ ์ด ์ซ์์ ์ ๊ณฑ์ ๋น๋กํ์ง ์๋๋ผ๋ ์ข์ต๋๋ค.
- ์ฌ์ฉ๋๋ DBMS ์์ ๋ฐฐ์์ ๋ฐ๋ผ ์ฌ์ฉ๋๋ ๊ฐ DBMS์ ๊ธฐ์ ํน์ฑ(ํ์ฅ์ฑ, ๋ด๊ฒฐํจ์ฑ, ๊ณ ๊ฐ์ฉ์ฑ)์ ์ ๊ณตํ๋ ๋น์ฉ์ด ์ฆ๊ฐํฉ๋๋ค.
- ์คํ ๋ฆฌ์ง ํ์ ์์คํ ์ ์ฒด์ ๊ธฐ์ ํน์ฑ, ํนํ ํธ๋์ญ์ ์ฑ์ ๋ณด์ฅํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
๋๋ฌผ์ ์ฑ ์์์ ๊ด์ ์์ ๋ณด๋ฉด ๋ชจ๋ ๊ฒ์ด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- DBMS ์ ์กฐ์ ์ฒด์ ๋ผ์ด์ผ์ค ๋ฐ ๊ธฐ์ ์ง์ ๋น์ฉ์ด ์ฌ๋ฌ ๋ฒ ์ฆ๊ฐํ์ต๋๋ค.
- ์ธ๋ ฅ ๊ณผ์ ๋ฐ ๋ง๊ฐ์ผ ์ฆ๊ฐ.
- ๋ฐ์ดํฐ ๋ถ์ผ์น๋ก ์ธํ ์ง์ ์ ์ธ ๊ธ์ ์ ์์ค์ด๋ ๋ฒ๊ธ.
์์คํ ์ ์ด ์์ ๋น์ฉ(TCO)์ด ํฌ๊ฒ ์ฆ๊ฐํฉ๋๋ค. "์ฌ๋ฌ ์คํ ๋ฆฌ์ง ์ต์ " ์ํฉ์์ ๋ฒ์ด๋ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
๋ค์ค ๋ชจ๋ธ
"๋ค๋ณ๋ ์ ์ฅ"์ด๋ผ๋ ์ฉ์ด๋ 2011๋ ์ ์ฌ์ฉ๋์์ต๋๋ค. ์ ๊ทผ ๋ฐฉ์์ ๋ฌธ์ ์ ์ ์ธ์ํ๊ณ ์๋ฃจ์ ์ ์ฐพ๋ ๋ฐ ์๋ ์ด ๊ฑธ๋ ธ์ผ๋ฉฐ 2015๋ ์ Gartner ๋ถ์๊ฐ์ ์ ์ ํตํด ๋ต๋ณ์ด ๊ณต์ํ๋์์ต๋๋ค.
- "์์
NoSQL DBMS ์์ฅ ๊ฐ์ด๋ - 2015 ยป:
DBMS์ ๋ฏธ๋, ์ํคํ ์ฒ ๋ฐ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋ค์ค ๋ชจ๋ธ์ ๋๋ค.
- "์์
ODBMS ๋งค์ง ์ฟผ๋๋ฐํธ - 2016 ยป:
์ฃผ์ ์ด์ DBMS๋ ๋จ์ผ ํ๋ซํผ์ ์ผ๋ถ๋ก ๊ด๊ณํ ๋ฐ ๋น๊ด๊ณํ ๋ฑ ๋ค์ํ ๋ชจ๋ธ์ ์ ๊ณตํฉ๋๋ค.
์ด๋ฒ์๋ Gartner ๋ถ์๊ฐ์ ์์ธก์ด ์ณ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ํด๋น ํ์ด์ง๋ก ์ด๋ํ์๋ฉด
์๋ ํ๋ ๋ค์ค ๋ชจ๋ธ์ด๋ผ๊ณ ์ฃผ์ฅํ๋ ๊ฐ ๋น๊ณต๊ฐ ๋ฑ๊ธ์ ์ ๋์ฃผ์์ธ 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
๋ง์ง๋ง์ผ๋ก 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
, ์ด๋ฌํ ํ
์ด๋ธ์ ํญ๋ชฉ์ ๋
ธ๋ ๊ฐ์ ์ฐ๊ฒฐ์ ๋ช
ํํ๊ฒ ์ ์ํฉ๋๋ค. ๊ฐ ์ ํ์ ๊ด๊ณ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ๋ณ๋์ ํ
์ด๋ธ์ด ์ฌ์ฉ๋ฉ๋๋ค.
์ด๋ฅผ ์๋ฅผ ๋ค์ด ์ค๋ช ํ๊ฒ ์ต๋๋ค. ๊ทธ๋ํ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ ๋ ์ด์์์ผ๋ก ๋ง๋ญ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํด๋น ๊ตฌ์กฐ๋ฅผ ์์ฑํ๋ ค๋ฉด ๋ค์ 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์ ๊ทธ๋ํ ๋ชจ๋ธ
๊ทธ๋ํ(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์ ๋ ๊ฐ์ง ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ๊ทธ๋ํ ๋ชจ๋ธ์ ์ง์ํฉ๋๋ค.
- DBMS๋ RDF ๋ฐ์ดํฐ์ ์์ ํ ๋ณ๋ ์ ์ฅ์๊ฐ ๋ ์ ์์ต๋๋ค.
๊ด๋ฆฌ ์์์ ์ค๋ช ํ ๊ฒ๊ณผ๋ ๋์กฐ์ ์ผ๋ก์ถ์ถํ ). - ํน์ ์ง๋ ฌํ์ RDF๋ XML ๋๋ JSON ๋ฌธ์์ ๊ฐ๋จํ ์ฝ์
ํ ์ ์์ต๋๋ค(๊ทธ๋ฌ๋ฉด ์ธ ์์ด ํธ์ถ๋ฉ๋๋ค).
๊ด๋ฆฌ๋์ง ์๋ ). ์ด๊ฒ์ ์๋ง๋ ๋ฉ์ปค๋์ฆ์ ๋์์ผ ๊ฒ์ ๋๋ค.idref
๊ธฐํ
MarkLogic์์ "์ค์ ๋ก" ์๋ํ๋ ๋ฐฉ์์ ๋ํ ์ข์ ์์ด๋์ด๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
โ์ฃผ๋ชจ๋ธ ์๋โ ๋ค์ค๋ชจ๋ธ DBMS
์์๋ ๋ฉ์ธ ๋ชจ๋ธ ์์ด ์ด๊ธฐ์ ๋ค์ค ๋ชจ๋ธ๋ก ์๋ฆฌ๋งค๊นํ๋ DBMS๋ ์์ฅ์ ๋์ ์์ต๋๋ค. ์ฌ๊ธฐ์๋ ๋ค์์ด ํฌํจ๋ฉ๋๋ค
์ค์ ๋ก ArangoDB์ OrientDB์๋ "ํต์ฌ" ๋ชจ๋ธ์ด ์์ต๋๋ค. ๋ ๊ฒฝ์ฐ ๋ชจ๋ ๋ฌธ์ ๋ชจ๋ธ์ ์ผ๋ฐํํ ์์ฒด ๋ฐ์ดํฐ ๋ชจ๋ธ์ ๋๋ค. ์ผ๋ฐํ๋ ์ฃผ๋ก ๊ทธ๋ํ ๋ฐ ๊ด๊ณํ ์ฟผ๋ฆฌ๋ฅผ ์ํํ๋ ๊ธฐ๋ฅ์ ์ฉ์ดํ๊ฒ ํ๊ธฐ ์ํ ๊ฒ์ ๋๋ค.
์ด๋ฌํ ๋ชจ๋ธ์ ์ง์ ๋ DBMS์์ ์ฌ์ฉํ ์ ์๋ ์ ์ผํ ๋ชจ๋ธ์ด๋ฉฐ ์์ฒด ์ฟผ๋ฆฌ ์ธ์ด๋ ์ด๋ฌํ ๋ชจ๋ธ๊ณผ ํจ๊ป ์๋ํ๋๋ก ์ค๊ณ๋์์ต๋๋ค. ๋ฌผ๋ก ๊ทธ๋ฌํ ๋ชจ๋ธ๊ณผ DBMS๋ ์ ๋งํ์ง๋ง ํ์ค ๋ชจ๋ธ ๋ฐ ์ธ์ด์์ ํธํ์ฑ ๋ถ์กฑ์ผ๋ก ์ธํด ์ด๋ฌํ DBMS๋ฅผ ๋ ๊ฑฐ์ ์์คํ ์์ ์ฌ์ฉํ์ฌ ์ด๋ฏธ ์ฌ์ฉ๋ DBMS๋ฅผ ๋์ฒดํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
Habrรฉ์๋ ArangoDB์ OrientDB์ ๊ดํ ํ๋ฅญํ ๊ธฐ์ฌ๊ฐ ์ด๋ฏธ ์์ต๋๋ค:
์๋๊ณ 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์ ์์ฒด ์์ฑ์ด ์๋ ๊ฒฝ์ฐ
์์ ๋ฐ์ดํฐ
์ ๊ฐ๊น์ด ํ์์ผ๋ก
[
{
"@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"
}
]
๋ณด์๋ค์ํผ ์ ์ ์ ๋ค์ด์ค๊ณ ๋๊ฐ๋ ๊ฐ์ฅ์๋ฆฌ์ ๋ํ ์ ๋ณด๋ ์ ์ฅํฉ๋๋ค. ~์
์ฟผ๋ฆฌ ๋ฐ ๊ฒฐ๊ณผ
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 ๋ด๋ถ ๋ชจ๋ธ ํ์์ผ๋ก ์ ์ฅ๋ฉ๋๋ค.
๊ทธ๋ฌ๋ ์ฌ์ฉ์๊ฐ ์ ํํ ๋ฐ์ดํฐ ๋ชจ๋ธ๊ณผ ์ฌ์ฉ๋๋ API๋ ์๋น์ค์์ ๊ณ์ ์ ์์ฑํ๋ ์์ ์ ๊ณ ์ ๋ฉ๋๋ค. ๋ค์๊ณผ ๊ฐ์ด ํ ๋ชจ๋ธ์ ๋ก๋๋ ๋ฐ์ดํฐ์ ๋ค๋ฅธ ๋ชจ๋ธ์ ํ์์ผ๋ก ์ก์ธ์คํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
๋ฐ๋ผ์ ํ์ฌ Azure CosmosDB์ ๋ค์ค ๋ชจ๋ธ์ ํ ์ ์กฐ์ ์ฒด์ ๋ค์ํ ๋ชจ๋ธ์ ์ง์ํ๋ ์ฌ๋ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ธฐ๋ฅ์ผ ๋ฟ์ด๋ฉฐ, ์ด๋ ๋ค์ค ๋ณํ ์คํ ๋ฆฌ์ง์ ๋ชจ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ๋ชปํฉ๋๋ค.
๊ทธ๋ํ ๋ชจ๋ธ ๊ธฐ๋ฐ์ ๋ค์ค ๋ชจ๋ธ DBMS?
์ฃผ๋ชฉํ ๋งํ ์ ์ ์์ง ์์ฅ์ ๊ทธ๋ํ ๋ชจ๋ธ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๋ค์ค ๋ชจ๋ธ DBMS๊ฐ ์๋ค๋ ์ฌ์ค์
๋๋ค(RDF์ LPG๋ผ๋ ๋ ๊ฐ์ง ๊ทธ๋ํ ๋ชจ๋ธ์ ๋์์ ์ง์ํ๋ ๋ค์ค ๋ชจ๋ธ ์ง์์ ์ ์ธ).
๊ทธ๋ํ ๋ชจ๋ธ ์์ ๊ด๊ณํ ๋ชจ๋ธ์ ์ด๋ป๊ฒ ๊ตฌํํ๋๋๋ ๋ฌธ์ ๋ ๊ทธ๋ํ ๋ชจ๋ธ์ ๊ตฌ์ฑํ๋ ๊ณผ์ ์์๋ ๊ณ ๋ ค๋๋ค. ์ด๋ป๊ฒ
(1) ์ผ๋ฐ์ ์ธ ํค ๊ฐ ์์์ ํํ์ ๋ณต๊ตฌํ๊ณ (2) ๊ด๊ณ ์ ํ๋ณ ํํ.
๊ทธ๋ํ ๋ชจ๋ธ ์์ ๋ฌธ์ ๋ชจ๋ธ์ ๊ตฌํํ ๋ ๋ค์ ์ฌํญ์ ์ผ๋์ ๋์ด์ผ ํฉ๋๋ค.
- JSON ๋ฐฐ์ด์ ์์๋ ์์๊ฐ ์๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋์ง๋ง ๊ทธ๋ํ ๊ฐ์ฅ์๋ฆฌ์ ๊ผญ์ง์ ์์ ๋์ค๋ ์์๋ ์์๊ฐ ์์ต๋๋ค.
- ๋ฌธ์ ๋ชจ๋ธ์ ๋ฐ์ดํฐ๋ ์ผ๋ฐ์ ์ผ๋ก ๋น์ ๊ทํ๋์ด ์์ผ๋ฏ๋ก ๋์ผํ ํฌํจ ๋ฌธ์์ ์ฌ๋ฌ ๋ณต์ฌ๋ณธ์ ์ ์ฅํ๊ณ ์ถ์ง ์์ผ๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ํ์ ๋ฌธ์์๋ ์๋ณ์๊ฐ ์์ต๋๋ค.
- ๋ฐ๋ฉด, ๋ฌธ์ DBMS์ ์ด๋ ์ ๋ฌธ์๊ฐ ๋งค๋ฒ ์๋ก ๊ตฌ์ถํ ํ์๊ฐ ์๋ ๊ธฐ์ฑํ "์งํฉ์ฒด"๋ผ๋ ๊ฒ์ ๋๋ค. ์์ฑ๋ ๋ฌธ์์ ํด๋นํ๋ ํ์ ๊ทธ๋ํ๋ฅผ ๋น ๋ฅด๊ฒ ์ป์ ์ ์๋ ๊ธฐ๋ฅ์ ๊ทธ๋ํ ๋ชจ๋ธ์ ์ ๊ณตํด์ผ ํฉ๋๋ค.
์ผ๋ถ ๊ด๊ณ
์ด ๊ธฐ์ฌ์ ์ ์๋ ๋ด๋ถ ๋ชจ๋ธ์ด ๊ทธ๋ํ์ด๊ณ ์ธ๋ถ ๋ชจ๋ธ(๊ด๊ณํ ๋ฐ ๋ฌธ์)์ด ํํ์ธ NitrosBase DBMS์ ๊ฐ๋ฐ๊ณผ ๊ด๋ จ๋์ด ์์ต๋๋ค. ๋ชจ๋ ๋ชจ๋ธ์ ๋์ผํฉ๋๋ค. ์์ฐ์ค๋ฌ์ด ์ฟผ๋ฆฌ ์ธ์ด๋ฅผ ์ฌ์ฉํ์ฌ ๊ฑฐ์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ํ ์ด๋ค ๋ณด๊ธฐ์์๋ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. ๋ณ๊ฒฝ ์ฌํญ์ ๋ด๋ถ ๋ชจ๋ธ์ ๋ฐ์๋๋ฉฐ ๊ทธ์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ณด๊ธฐ์๋ ๋ฐ์๋ฉ๋๋ค.
๋ค์ ๊ธฐ์ฌ ์ค ํ๋๋ฅผ ํตํด NitrosBase์ ๋ชจ๋ธ ๋งค์นญ์ด ์ด๋ค ๋ชจ์ต์ธ์ง ์ค๋ช ํ๊ฒ ์ต๋๋ค.
๊ฒฐ๋ก
๋ค์ค ๋ชจ๋ธ๋ง์ด๋ผ ๋ถ๋ฆฌ๋ ๊ฒ์ ์ผ๋ฐ์ ์ธ ๊ฐ์๊ฐ ๋ ์๋ค์๊ฒ ์ด๋ ์ ๋ ๋ช ํํด์ก๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๋ค์ค ๋ชจ๋ธ DBMS๋ ์๋นํ ๋ค๋ฅด๋ฉฐ "๋ค์ค ๋ชจ๋ธ ์ง์"๋ ๋ค๋ฅด๊ฒ ๋ณด์ผ ์ ์์ต๋๋ค. ๊ฐ๊ฐ์ ํน์ ์ฌ๋ก์์ "๋ค์ค ๋ชจ๋ธ"์ด ๋ฌด์์ธ์ง ์ดํดํ๋ ค๋ฉด ๋ค์ ์ง๋ฌธ์ ๋ตํ๋ ๊ฒ์ด ์ ์ฉํฉ๋๋ค.
- ์ฐ๋ฆฌ๋ ์ ํต์ ์ธ ๋ชจ๋ธ์ ์ง์ํ๋ ๊ฒ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๊น, ์๋๋ฉด ์ผ์ข ์ "ํ์ด๋ธ๋ฆฌ๋" ๋ชจ๋ธ์ ์ง์ํ๋ ๊ฒ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๊น?
- ๋ชจ๋ธ์ด "๋๋ฑ"ํฉ๋๊น, ์๋๋ฉด ๊ทธ ์ค ํ๋๊ฐ ๋ค๋ฅธ ๋ชจ๋ธ์ ์ฃผ์ ์ ๋๊น?
- ๋ชจ๋ธ์ ์๋ก "๋ฌด๊ด์ฌ"ํฉ๋๊น? ํ ๋ชจ๋ธ์ ๊ธฐ๋ก๋ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฅธ ๋ชจ๋ธ์์ ์ฝ๊ฑฐ๋ ๋ฎ์ด์ธ ์ ์๋์?
๋ค์ค ๋ชจ๋ธ DBMS์ ํ๋น์ฑ์ ๋ํ ์ง๋ฌธ์ ์ด๋ฏธ ๊ธ์ ์ ์ผ๋ก ๋๋ตํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ํฅ๋ฏธ๋ก์ด ์ง๋ฌธ์ ๊ฐ๊น์ด ๋ฏธ๋์ ์ด๋ค ์ ํ์ DBMS๊ฐ ๋ ์์๊ฐ ๋ง์ ๊ฒ์ธ๊ฐ์ ๋๋ค. ์ฃผ๋ก ๊ด๊ณํ์ธ ๊ธฐ์กด ๋ชจ๋ธ์ ์ง์ํ๋ ๋ค์ค ๋ชจ๋ธ DBMS์ ์์๊ฐ ๋ ์ปค์ง ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค. ๋ค์ํ ๊ธฐ์กด DBMS์ ์ฅ์ ์ ๊ฒฐํฉํ ์๋ก์ด ๋ชจ๋ธ์ ์ ๊ณตํ๋ ๋ค์ค ๋ชจ๋ธ DBMS์ ์ธ๊ธฐ๋ ๋ ๋จผ ๋ฏธ๋์ ๋ฌธ์ ์ ๋๋ค.
๋ฑ๋ก๋ ์ฌ์ฉ์๋ง ์ค๋ฌธ ์กฐ์ฌ์ ์ฐธ์ฌํ ์ ์์ต๋๋ค.
๋ค์ค ๋ชจ๋ธ DBMS๋ฅผ ์ฌ์ฉํ์๋์?
-
์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ์ฌ์ฉํ์ง ์๊ณ ๋ชจ๋ ๊ฒ์ ํ๋์ DBMS์ ํ๋์ ๋ชจ๋ธ์ ์ ์ฅํฉ๋๋ค.
-
์ฐ๋ฆฌ๋ ์ ํต์ ์ธ DBMS์ ๋ค์ค ๋ชจ๋ธ ๊ธฐ๋ฅ์ ์ฌ์ฉํฉ๋๋ค.
-
์ฐ๋ฆฌ๋ ๋ค์ค ์ธ์ด ์ง์์ฑ์ ์ค์ฒํฉ๋๋ค.
-
์๋ก์ด ๋ค์ค ๋ชจ๋ธ DBMS(Arango, Orient, CosmosDB)๋ฅผ ์ฌ์ฉํฉ๋๋ค.
19๋ช
์ ์ฌ์ฉ์๊ฐ ํฌํํ์ต๋๋ค. 4๋ช
์ ์ฌ์ฉ์๊ฐ ๊ธฐ๊ถํ์ต๋๋ค.
์ถ์ฒ : habr.com