๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„ ๊ธฐ์ดˆ - PostgreSQL, Cassandra ๋ฐ MongoDB ๋น„๊ต

์•ˆ๋…•ํ•˜์„ธ์š” ์นœ๊ตฌ. XNUMX์›” ๋‘ ๋ฒˆ์งธ ์—ฐํœด๋ฅผ ๋– ๋‚˜๊ธฐ ์ „์—, ์ฝ”์Šค์— ์ƒˆ๋กœ์šด ์ŠคํŠธ๋ฆผ์ด ์‹œ์ž‘๋  ๊ฒƒ์„ ์˜ˆ์ƒํ•˜์—ฌ ๋ฒˆ์—ญํ•œ ์ž๋ฃŒ๋ฅผ ์—ฌ๋Ÿฌ๋ถ„๊ณผ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค. "๊ด€๊ณ„ํ˜• DBMS".

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„ ๊ธฐ์ดˆ - PostgreSQL, Cassandra ๋ฐ MongoDB ๋น„๊ต

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์ž๋Š” ์˜๋„ํ•œ ์›Œํฌ๋กœ๋“œ์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์„ ํƒํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ์šด์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋น„๊ตํ•˜๋Š” ๋ฐ ๋งŽ์€ ์‹œ๊ฐ„์„ ์†Œ๋น„ํ•ฉ๋‹ˆ๋‹ค. ์š”๊ตฌ ์‚ฌํ•ญ์—๋Š” ๋‹จ์ˆœํ™”๋œ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง, ํŠธ๋žœ์žญ์…˜ ๋ณด์žฅ, ์ฝ๊ธฐ/์“ฐ๊ธฐ ์„ฑ๋Šฅ, ์ˆ˜ํ‰ ํ™•์žฅ ๋ฐ ๋‚ด๊ฒฐํ•จ์„ฑ์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „ํ†ต์ ์œผ๋กœ ์„ ํƒ์€ SQL ๋˜๋Š” NoSQL์ด๋ผ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฒ”์ฃผ์—์„œ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ๊ฐ ๋ฒ”์ฃผ๋Š” ๋ช…ํ™•ํ•œ ์žฅ๋‹จ์ ์„ ์ œ์‹œํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‚ฎ์€ ๋Œ€๊ธฐ ์‹œ๊ฐ„๊ณผ ๋†’์€ ์ฒ˜๋ฆฌ๋Ÿ‰ ์ธก๋ฉด์—์„œ ๊ณ ์„ฑ๋Šฅ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ ˆ์ถฉ ๋ถˆ๊ฐ€๋Šฅํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์œผ๋กœ ๊ฐ„์ฃผ๋˜๋ฏ€๋กœ ๋ชจ๋“  ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.

์ด ๊ธฐ์‚ฌ์˜ ๋ชฉ์ ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง์˜ ๋งฅ๋ฝ์—์„œ SQL๊ณผ NoSQL ์ค‘์—์„œ ์˜ฌ๋ฐ”๋ฅธ ์„ ํƒ์„ ํ•˜๋„๋ก ๋•๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ SQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ธ PostgreSQL๊ณผ ๋‘ ๊ฐœ์˜ NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ธ Cassandra ๋ฐ MongoDB๋ฅผ ์‚ดํŽด๋ณด๊ณ  ํ…Œ์ด๋ธ” ์ƒ์„ฑ, ์ฑ„์šฐ๊ธฐ, ํ…Œ์ด๋ธ”์—์„œ ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ ๋ฐ ์‚ญ์ œ์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„์˜ ๊ธฐ๋ณธ ์‚ฌํ•ญ์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ธฐ์‚ฌ์—์„œ๋Š” ์ธ๋ฑ์Šค, ํŠธ๋žœ์žญ์…˜, JOIN, TTL ์ง€์‹œ๋ฌธ ๋ฐ JSON ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋””์ž์ธ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

SQL๊ณผ NoSQL์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

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

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

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

NoSQL์€ ๋ถ„์‚ฐ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋†’์€ ์„ฑ๋Šฅ์„ ๋‹ฌ์„ฑํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘๊ณ  ์žˆ์œผ๋ฉฐ ์ด๋Š” ACID ํŠธ๋žœ์žญ์…˜ ์†์‹ค, JOIN ๋ฐ ์ผ๊ด€๋œ ๊ธ€๋กœ๋ฒŒ ๋ณด์กฐ ์ธ๋ฑ์Šค๋ฅผ ํฌํ•จํ•˜๋Š” ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„ ์ ˆ์ถฉ์•ˆ์˜ ๊ธฐ๋ณธ ๊ทผ๊ฑฐ์ž…๋‹ˆ๋‹ค.

NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์„ ํ˜• ์“ฐ๊ธฐ ํ™•์žฅ์„ฑ๊ณผ ๋†’์€ ๋‚ด๊ฒฐํ•จ์„ฑ์„ ์ œ๊ณตํ•˜์ง€๋งŒ ํŠธ๋žœ์žญ์…˜ ๋ณด์žฅ์ด ์ƒ์‹ค๋˜์–ด ๋ฏธ์…˜ ํฌ๋ฆฌํ‹ฐ์ปฌ ๋ฐ์ดํ„ฐ์— ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค๋Š” ์ฃผ์žฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ํ‘œ์—์„œ๋Š” NoSQL์˜ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง์ด SQL๊ณผ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„ ๊ธฐ์ดˆ - PostgreSQL, Cassandra ๋ฐ MongoDB ๋น„๊ต

SQL๊ณผ NoSQL: ๋‘˜ ๋‹ค ํ•„์š”ํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

Amazon.com, Netflix, Uber, Airbnb์™€ ๊ฐ™์ด ์‚ฌ์šฉ์ž ์ˆ˜๊ฐ€ ๋งŽ์€ ์‹ค์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋ณต์žกํ•˜๊ณ  ๋‹ค๋ฉด์ ์ธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Amazon.com๊ณผ ๊ฐ™์€ ์ „์ž ์ƒ๊ฑฐ๋ž˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์‚ฌ์šฉ์ž ์ •๋ณด, ์ œํ’ˆ, ์ฃผ๋ฌธ, ์†ก์žฅ๊ณผ ๊ฐ™์€ ๊ฐ€๋ณ๊ณ  ์ค‘์š”๋„๊ฐ€ ๋†’์€ ๋ฐ์ดํ„ฐ์™€ ์ œํ’ˆ ๋ฆฌ๋ทฐ, ์ง€์› ๋ฉ”์‹œ์ง€, ์‚ฌ์šฉ์ž ํ™œ๋™ ๋“ฑ ๋ฌด๊ฒ๊ณ  ๋œ ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ๋ฆฌ๋ทฐ ๋ฐ ์ถ”์ฒœ. ๋‹น์—ฐํžˆ ์ด๋Ÿฌํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ํ•˜๋‚˜ ์ด์ƒ์˜ NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ํ•จ๊ป˜ ํ•˜๋‚˜ ์ด์ƒ์˜ SQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ง€์—ญ ๊ฐ„ ๋ฐ ๊ธ€๋กœ๋ฒŒ ์‹œ์Šคํ…œ์—์„œ NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ํŠน์ • ์ง€์—ญ์—์„œ ์‹คํ–‰๋˜๋Š” ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์›๋ณธ SQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ง€๋ฆฌ์  ๋ถ„์‚ฐ ์บ์‹œ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

YugaByte DB๋Š” SQL๊ณผ NoSQL์„ ์–ด๋–ป๊ฒŒ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๊นŒ?

๋กœ๊ทธ ์ค‘์‹ฌ ํ˜ผํ•ฉ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„, ์ž๋™ ์ƒค๋”ฉ, ์ƒค๋”ฉ๋œ ๋ถ„์‚ฐ ํ•ฉ์˜ ๋ณต์ œ ๋ฐ ACID ๋ถ„์‚ฐ ํŠธ๋žœ์žญ์…˜(Google Spanner์—์„œ ์˜๊ฐ์„ ์–ป์Œ)์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•๋œ YugaByte DB๋Š” NoSQL(Cassandra & Redis)๊ณผ ๋™์‹œ์— ํ˜ธํ™˜๋˜๋Š” ์„ธ๊ณ„ ์ตœ์ดˆ์˜ ์˜คํ”ˆ ์†Œ์Šค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ž…๋‹ˆ๋‹ค. SQL(ํฌ์ŠคํŠธ๊ทธ๋ ˆSQL). ์•„๋ž˜ ํ‘œ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด Cassandra์™€ ํ˜ธํ™˜๋˜๋Š” YugaByte DB API์ธ YCQL์€ NoSQL API์— ๋‹จ์ผ ๋ฐ ๋‹ค์ค‘ ํ‚ค ACID ํŠธ๋žœ์žญ์…˜๊ณผ ๊ธ€๋กœ๋ฒŒ ๋ณด์กฐ ์ธ๋ฑ์Šค ๊ฐœ๋…์„ ์ถ”๊ฐ€ํ•˜์—ฌ ํŠธ๋žœ์žญ์…˜ NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ๋Œ€๋ฅผ ์—ฝ๋‹ˆ๋‹ค. ๋˜ํ•œ PostgreSQL๊ณผ ํ˜ธํ™˜๋˜๋Š” YugaByte DB API์ธ YCQL์€ SQL API์— ์„ ํ˜• ์“ฐ๊ธฐ ํ™•์žฅ ๋ฐ ์ž๋™ ๋‚ด๊ฒฐํ•จ์„ฑ ๊ฐœ๋…์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ถ„์‚ฐ SQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์„ธ์ƒ์— ์„ ๋ณด์ž…๋‹ˆ๋‹ค. YugaByte DB๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ํŠธ๋žœ์žญ์…˜์ด๋ฏ€๋กœ ์ด์ œ NoSQL API๋ฅผ ๋ฏธ์…˜ ํฌ๋ฆฌํ‹ฐ์ปฌ ๋ฐ์ดํ„ฐ์˜ ๋งฅ๋ฝ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„ ๊ธฐ์ดˆ - PostgreSQL, Cassandra ๋ฐ MongoDB ๋น„๊ต

์•ž์„œ ๊ธฐ์‚ฌ์—์„œ ๋ฐํ˜”๋“ฏ์ด "YSQL ์†Œ๊ฐœ: YugaByte DB์šฉ PostgreSQL ํ˜ธํ™˜ ๋ถ„์‚ฐ SQL API", YugaByte DB์—์„œ SQL ๋˜๋Š” NoSQL ์ค‘ ์„ ํƒ์€ ์ „์ ์œผ๋กœ ๊ธฐ๋ณธ ์›Œํฌ๋กœ๋“œ์˜ ํŠน์„ฑ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

  • ๊ธฐ๋ณธ ์›Œํฌ๋กœ๋“œ๊ฐ€ ๋‹ค์ค‘ ํ‚ค JOIN ์ž‘์—…์ธ ๊ฒฝ์šฐ YSQL์„ ์„ ํƒํ•  ๋•Œ ํ‚ค๊ฐ€ ์—ฌ๋Ÿฌ ๋…ธ๋“œ์— ๋ถ„์‚ฐ๋˜์–ด NoSQL๋ณด๋‹ค ์ง€์—ฐ ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง€๊ฑฐ๋‚˜ ์ฒ˜๋ฆฌ๋Ÿ‰์ด ๋‚ฎ์•„์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์ดํ•ดํ•˜์„ธ์š”.
  • ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋‘ ๊ฐ€์ง€ NoSQL API ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜์„ธ์š”. ํ•œ ๋ฒˆ์— ํ•œ ๋…ธ๋“œ์—์„œ ์ฟผ๋ฆฌ๊ฐ€ ์ œ๊ณต๋˜๋ฉด ๋” ๋‚˜์€ ์„ฑ๋Šฅ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์—ผ๋‘์— ๋‘์„ธ์š”. YugaByte DB๋Š” ์—ฌ๋Ÿฌ ์›Œํฌ๋กœ๋“œ๋ฅผ ๋™์‹œ์— ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์‹ค์ œ ๋ณต์žกํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ ๋‹จ์ผ ์šด์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ญํ• ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์„น์…˜์˜ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง ๋žฉ์€ ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์•„๋‹Œ PostgreSQL ๋ฐ Cassandra API ํ˜ธํ™˜ YugaByte DB ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์™„์ „ํžˆ ๋…๋ฆฝ์ ์ธ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋‹ฌ๋ฆฌ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋Ÿฌ์Šคํ„ฐ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ API(๋‘ ๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ํฌํŠธ์— ์žˆ์Œ)์™€ ์‰ฝ๊ฒŒ ์ƒํ˜ธ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ๊ฐ•์กฐํ•ฉ๋‹ˆ๋‹ค.
๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง ๋žฉ์„ ์‚ดํŽด๋ณด๊ณ  ๋‹ค๋ฃจ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ฐจ์ด์ ๊ณผ ์ผ๋ถ€ ๊ณตํ†ต์ ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง ์—ฐ๊ตฌ์‹ค

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค์น˜

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

PostgreSQL ๋ฐ Cassandra ํ˜ธํ™˜ YugaByte DB ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

mkdir ~/yugabyte && cd ~/yugabyte
wget https://downloads.yugabyte.com/yb-docker-ctl && chmod +x yb-docker-ctl
docker pull yugabytedb/yugabyte
./yb-docker-ctl create --enable_postgres

MongoDB์˜

docker run --name my-mongo -d mongo:latest

๋ช…๋ น์ค„ ์•ก์„ธ์Šค

ํ•ด๋‹น API์— ๋Œ€ํ•œ ๋ช…๋ น์ค„ ์…ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—ฐ๊ฒฐํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

PostgreSQL

psql PostgreSQL๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋ช…๋ น์ค„ ์…ธ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ ํŽธ์˜์„ฑ์„ ์œ„ํ•ด YugaByte DB์—๋Š” bin ํด๋”์— ๋ฐ”๋กœ psql์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

docker exec -it yb-postgres-n1 /home/yugabyte/postgres/bin/psql -p 5433 -U postgres

์นด์‚ฐ๋“œ ๋ผ

cqlsh CQL(Cassandra Query Language)์„ ํ†ตํ•ด Cassandra ๋ฐ ํ˜ธํ™˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋ช…๋ น์ค„ ์…ธ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ ํŽธ์˜์„ฑ์„ ์œ„ํ•ด YugaByte DB์—๋Š” cqlsh ์นดํƒˆ๋กœ๊ทธ์— bin.
CQL์€ SQL์—์„œ ์˜๊ฐ์„ ์–ป์—ˆ์œผ๋ฉฐ ํ…Œ์ด๋ธ”, ํ–‰, ์—ด ๋ฐ ์ธ๋ฑ์Šค์™€ ์œ ์‚ฌํ•œ ๊ฐœ๋…์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ NoSQL ์–ธ์–ด๋กœ์„œ ํŠน์ • ์ œํ•œ ์‚ฌํ•ญ์ด ์ถ”๊ฐ€๋˜๋ฉฐ, ๋Œ€๋ถ€๋ถ„์€ ๋‹ค๋ฅธ ๊ธฐ์‚ฌ์—์„œ๋„ ๋‹ค๋ฃฐ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

docker exec -it yb-tserver-n1 /home/yugabyte/bin/cqlsh

MongoDB์˜

๋ชฝ๊ณ  MongoDB์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋ช…๋ น์ค„ ์…ธ์ž…๋‹ˆ๋‹ค. MongoDB ์„ค์น˜์˜ bin ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

docker exec -it my-mongo bash 
cd bin
mongo

ํ…Œ์ด๋ธ” ๋งŒ๋“ค๊ธฐ

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

PostgreSQL

CREATE TABLE Music (
    Artist VARCHAR(20) NOT NULL, 
    SongTitle VARCHAR(30) NOT NULL,
    AlbumTitle VARCHAR(25),
    Year INT,
    Price FLOAT,
    Genre VARCHAR(10),
    CriticRating FLOAT,
    Tags TEXT,
    PRIMARY KEY(Artist, SongTitle)
);	

์นด์‚ฐ๋“œ ๋ผ

Cassandra์—์„œ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ PostgreSQL๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์š” ์ฐจ์ด์  ์ค‘ ํ•˜๋‚˜๋Š” ๋ฌด๊ฒฐ์„ฑ ์ œ์•ฝ ์กฐ๊ฑด(์˜ˆ: NOT NULL)์ด ์—†๋‹ค๋Š” ์ ์ด์ง€๋งŒ ์ด๋Š” NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์•„๋‹Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ฑ…์ž„์ž…๋‹ˆ๋‹ค.. ๊ธฐ๋ณธ ํ‚ค๋Š” ํŒŒํ‹ฐ์…˜ ํ‚ค(์•„๋ž˜ ์˜ˆ์˜ Artist ์—ด)์™€ ํด๋Ÿฌ์Šคํ„ฐ๋ง ์—ด ์ง‘ํ•ฉ(์•„๋ž˜ ์˜ˆ์˜ SongTitle ์—ด)์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ํŒŒํ‹ฐ์…˜ ํ‚ค๋Š” ํ–‰์„ ์–ด๋Š ํŒŒํ‹ฐ์…˜/์ƒค๋“œ์— ๋ฐฐ์น˜ํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ฒฐ์ •ํ•˜๊ณ , ํด๋Ÿฌ์Šคํ„ฐ๋ง ์—ด์€ ํ˜„์žฌ ์ƒค๋“œ ๋‚ด์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

CREATE KEYSPACE myapp;
USE myapp;
CREATE TABLE Music (
    Artist TEXT, 
    SongTitle TEXT,
    AlbumTitle TEXT,
    Year INT,
    Price FLOAT,
    Genre TEXT,
    CriticRating FLOAT,
    Tags TEXT,
    PRIMARY KEY(Artist, SongTitle)
);

MongoDB์˜

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

use myNewDatabase;

ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ
PostgreSQL

d Music
Table "public.music"
    Column    |         Type          | Collation | Nullable | Default 
--------------+-----------------------+-----------+----------+--------
 artist       | character varying(20) |           | not null | 
 songtitle    | character varying(30) |           | not null | 
 albumtitle   | character varying(25) |           |          | 
 year         | integer               |           |          | 
 price        | double precision      |           |          | 
 genre        | character varying(10) |           |          | 
 criticrating | double precision      |           |          | 
 tags         | text                  |           |          | 
Indexes:
    "music_pkey" PRIMARY KEY, btree (artist, songtitle)

์นด์‚ฐ๋“œ ๋ผ

DESCRIBE TABLE MUSIC;
CREATE TABLE myapp.music (
    artist text,
    songtitle text,
    albumtitle text,
    year int,
    price float,
    genre text,
    tags text,
    PRIMARY KEY (artist, songtitle)
) WITH CLUSTERING ORDER BY (songtitle ASC)
    AND default_time_to_live = 0
    AND transactions = {'enabled': 'false'};

MongoDB์˜

use myNewDatabase;
show collections;

ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ ์ž…๋ ฅ
PostgreSQL

INSERT INTO Music 
    (Artist, SongTitle, AlbumTitle, 
    Year, Price, Genre, CriticRating, 
    Tags)
VALUES(
    'No One You Know', 'Call Me Today', 'Somewhat Famous',
    2015, 2.14, 'Country', 7.8,
    '{"Composers": ["Smith", "Jones", "Davis"],"LengthInSeconds": 214}'
);
INSERT INTO Music 
    (Artist, SongTitle, AlbumTitle, 
    Price, Genre, CriticRating)
VALUES(
    'No One You Know', 'My Dog Spot', 'Hey Now',
    1.98, 'Country', 8.4
);
INSERT INTO Music 
    (Artist, SongTitle, AlbumTitle, 
    Price, Genre)
VALUES(
    'The Acme Band', 'Look Out, World', 'The Buck Starts Here',
    0.99, 'Rock'
);
INSERT INTO Music 
    (Artist, SongTitle, AlbumTitle, 
    Price, Genre, 
    Tags)
VALUES(
    'The Acme Band', 'Still In Love', 'The Buck Starts Here',
    2.47, 'Rock', 
    '{"radioStationsPlaying": ["KHCR", "KBQX", "WTNR", "WJJH"], "tourDates": { "Seattle": "20150625", "Cleveland": "20150630"}, "rotation": Heavy}'
);

์นด์‚ฐ๋“œ ๋ผ

์ „์ฒด์ ์ธ ํ‘œํ˜„ INSERT Cassandra์˜ ๊ฒฝ์šฐ PostgreSQL์˜ ๊ฒฝ์šฐ์™€ ๋งค์šฐ ์œ ์‚ฌํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์˜๋ฏธ๋ก ์—๋Š” ํ•œ ๊ฐ€์ง€ ํฐ ์ฐจ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์นด์‚ฐ๋“œ๋ผ์—์„œ INSERT ์‹ค์ œ๋กœ๋Š” ์กฐ์ž‘์ด๋‹ค UPSERT, ํ–‰์ด ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ๋งˆ์ง€๋ง‰ ๊ฐ’์ด ํ–‰์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ์ž…๋ ฅ์€ PostgreSQL๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. INSERT ์ด์ƒ

.

MongoDB์˜

MongoDB๋Š” Cassandra์™€ ๊ฐ™์€ NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ด์ง€๋งŒ ์‚ฝ์ž… ์ž‘์—…์€ Cassandra์˜ ์˜๋ฏธ์  ๋™์ž‘๊ณผ ๊ณตํ†ต์ ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ชฝ๊ณ DB์—์„œ ๋ผ์›Œ ๋„ฃ๋‹ค() ๊ธฐํšŒ๊ฐ€ ์—†๋‹ค UPSERT, ์ด๋Š” PostgreSQL๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์—†์ด ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€ _idspecified ์ƒˆ ๋ฌธ์„œ๊ฐ€ ์ปฌ๋ ‰์…˜์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

db.music.insert( {
artist: "No One You Know",
songTitle: "Call Me Today",
albumTitle: "Somewhat Famous",
year: 2015,
price: 2.14,
genre: "Country",
tags: {
Composers: ["Smith", "Jones", "Davis"],
LengthInSeconds: 214
}
}
);
db.music.insert( {
artist: "No One You Know",
songTitle: "My Dog Spot",
albumTitle: "Hey Now",
price: 1.98,
genre: "Country",
criticRating: 8.4
}
);
db.music.insert( {
artist: "The Acme Band",
songTitle: "Look Out, World",
albumTitle:"The Buck Starts Here",
price: 0.99,
genre: "Rock"
}
);
db.music.insert( {
artist: "The Acme Band",
songTitle: "Still In Love",
albumTitle:"The Buck Starts Here",
price: 2.47,
genre: "Rock",
tags: {
radioStationsPlaying:["KHCR", "KBQX", "WTNR", "WJJH"],
tourDates: {
Seattle: "20150625",
Cleveland: "20150630"
},
rotation: "Heavy"
}
}
);

ํ…Œ์ด๋ธ” ์ฟผ๋ฆฌ

์•„๋งˆ๋„ ์ฟผ๋ฆฌ ๊ตฌ์„ฑ ์ธก๋ฉด์—์„œ SQL๊ณผ NoSQL์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ฐจ์ด์ ์€ ์‚ฌ์šฉ๋˜๋Š” ์–ธ์–ด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. FROM ะธ WHERE. SQL์—์„œ๋Š” ํ‘œํ˜„์‹ ์ดํ›„์— ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. FROM ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์„ ์„ ํƒํ•˜๊ณ  WHERE ์–ด๋–ค ๋ณต์žก์„ฑ์ด๋ผ๋„ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์šด์˜ ํฌํ•จ). JOIN ํ…Œ์ด๋ธ” ์‚ฌ์ด). ๊ทธ๋Ÿฌ๋‚˜ NoSQL์€ ๋‹ค์Œ ์‚ฌํ•ญ์— ์‹ฌ๊ฐํ•œ ์ œํ•œ์„ ๊ฐ€ํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. FROM, ์ง€์ •๋œ ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”์—์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. WHERE, ๊ธฐ๋ณธ ํ‚ค๋Š” ํ•ญ์ƒ ์ง€์ •๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์•ž์„œ ์ด์•ผ๊ธฐํ•œ NoSQL ์„ฑ๋Šฅ ํ–ฅ์ƒ๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์š”๊ตฌ๋กœ ์ธํ•ด ํ‘œ ๊ฐ„ ๋ฐ ํ‚ค ๊ฐ„ ์ƒํ˜ธ ์ž‘์šฉ์ด ๊ฐ€๋Šฅํ•œ ํ•œ ๋ชจ๋‘ ๊ฐ์†Œ๋ฉ๋‹ˆ๋‹ค. ์š”์ฒญ์— ์‘๋‹ตํ•  ๋•Œ ๋…ธ๋“œ ๊ฐ„ ํ†ต์‹ ์— ํฐ ์ง€์—ฐ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ผ๋ฐ˜์ ์œผ๋กœ ํ”ผํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Cassandra์—์„œ๋Š” ์ฟผ๋ฆฌ๊ฐ€ ํŠน์ • ์—ฐ์‚ฐ์ž๋กœ ์ œํ•œ๋˜๋„๋ก ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค( =, IN, <, >, =>, <=)๋ฅผ ํŒŒํ‹ฐ์…˜ ํ‚ค์— ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‹จ, ๋ณด์กฐ ์ธ๋ฑ์Šค๋ฅผ ์š”์ฒญํ•  ๋•Œ๋ฅผ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค(์—ฌ๊ธฐ์„œ๋Š” = ์—ฐ์‚ฐ์ž๋งŒ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค).

PostgreSQL

๋‹ค์Œ์€ SQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์‰ฝ๊ฒŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ฟผ๋ฆฌ์˜ ์„ธ ๊ฐ€์ง€ ์˜ˆ์ž…๋‹ˆ๋‹ค.

  • ์•„ํ‹ฐ์ŠคํŠธ์˜ ๋ชจ๋“  ๋…ธ๋ž˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
  • ์ œ๋ชฉ์˜ ์ฒซ ๋ฒˆ์งธ ๋ถ€๋ถ„๊ณผ ์ผ์น˜ํ•˜๋Š” ์•„ํ‹ฐ์ŠคํŠธ์˜ ๋ชจ๋“  ๋…ธ๋ž˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
  • ์ œ๋ชฉ์— ํŠน์ • ๋‹จ์–ด๊ฐ€ ์žˆ๊ณ  ๊ฐ€๊ฒฉ์ด 1.00 ๋ฏธ๋งŒ์ธ ์•„ํ‹ฐ์ŠคํŠธ์˜ ๋ชจ๋“  ๋…ธ๋ž˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
SELECT * FROM Music
WHERE Artist='No One You Know';
SELECT * FROM Music
WHERE Artist='No One You Know' AND SongTitle LIKE 'Call%';
SELECT * FROM Music
WHERE Artist='No One You Know' AND SongTitle LIKE '%Today%'
AND Price > 1.00;

์นด์‚ฐ๋“œ ๋ผ

์œ„์— ๋‚˜์—ด๋œ PostgreSQL ์ฟผ๋ฆฌ ์ค‘ ์ฒซ ๋ฒˆ์งธ ์ฟผ๋ฆฌ๋งŒ Cassandra์—์„œ ๋ณ€๊ฒฝ ์—†์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. LIKE ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํด๋Ÿฌ์Šคํ„ฐ๋ง ์—ด์—๋Š” ์ ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. SongTitle. ์ด ๊ฒฝ์šฐ ์šด์˜์ž๋งŒ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. = ะธ IN.

SELECT * FROM Music
WHERE Artist='No One You Know';
SELECT * FROM Music
WHERE Artist='No One You Know' AND SongTitle IN ('Call Me Today', 'My Dog Spot')
AND Price > 1.00;

MongoDB์˜

์ด์ „ ์˜ˆ์ œ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด MongoDB์—์„œ ์ฟผ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ฃผ์š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. db.collection.find(). ์ด ๋ฉ”์„œ๋“œ์—๋Š” ์ปฌ๋ ‰์…˜ ์ด๋ฆ„(music ์•„๋ž˜ ์˜ˆ์—์„œ๋Š”), ๋”ฐ๋ผ์„œ ์—ฌ๋Ÿฌ ์ปฌ๋ ‰์…˜์„ ์ฟผ๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ๊ธˆ์ง€๋ฉ๋‹ˆ๋‹ค.

db.music.find( {
  artist: "No One You Know"
 } 
);
db.music.find( {
  artist: "No One You Know",
  songTitle: /Call/
 } 
);

ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ํ–‰ ์ฝ๊ธฐ

๋ชจ๋“  ํ–‰์„ ์ฝ๋Š” ๊ฒƒ์€ ์•ž์„œ ์‚ดํŽด๋ณธ ์ฟผ๋ฆฌ ํŒจํ„ด์˜ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

PostgreSQL

SELECT * 
FROM Music;

์นด์‚ฐ๋“œ ๋ผ

์œ„์˜ PostgreSQL ์˜ˆ์ œ์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

MongoDB์˜

db.music.find( {} );

ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ ํŽธ์ง‘

PostgreSQL

PostgreSQL์€ ์ง€์นจ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. UPDATE ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋…€์—๊ฒŒ๋Š” ๊ธฐํšŒ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค UPSERT์ด๋ฏ€๋กœ ํ•ด๋‹น ํ–‰์ด ๋” ์ด์ƒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—†์œผ๋ฉด ์ด ๋ฌธ์€ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

UPDATE Music
SET Genre = 'Disco'
WHERE Artist = 'The Acme Band' AND SongTitle = 'Still In Love';

์นด์‚ฐ๋“œ ๋ผ

์นด์‚ฐ๋“œ๋ผ๋Š” UPDATE PostgreSQL๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. UPDATE ๋™์ผํ•œ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค UPSERT, ์ข‹๋‹ค INSERT.

์œ„์˜ PostgreSQL ์˜ˆ์ œ์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

MongoDB์˜
์šด์ „ ์ตœ์‹  ์ •๋ณด() MongoDB์—์„œ๋Š” ๊ธฐ์กด ๋ฌธ์„œ๋ฅผ ์™„์ „ํžˆ ์—…๋ฐ์ดํŠธํ•˜๊ฑฐ๋‚˜ ํŠน์ • ํ•„๋“œ๋งŒ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์˜๋ฏธ ์ฒด๊ณ„๊ฐ€ ๋น„ํ™œ์„ฑํ™”๋œ ํ•˜๋‚˜์˜ ๋ฌธ์„œ๋งŒ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. UPSERT. ์—ฌ๋Ÿฌ ๋ฌธ์„œ ์—…๋ฐ์ดํŠธ ๋ฐ ์œ ์‚ฌํ•œ ๋™์ž‘ UPSERT ํ•ด๋‹น ์ž‘์—…์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•˜์—ฌ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์•„๋ž˜ ์˜ˆ์—์„œ๋Š” ํŠน์ • ์•„ํ‹ฐ์ŠคํŠธ์˜ ์žฅ๋ฅด๊ฐ€ ๊ทธ์˜ ๋…ธ๋ž˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.

db.music.update(
  {"artist": "The Acme Band"},
  { 
    $set: {
      "genre": "Disco"
    }
  },
  {"multi": true, "upsert": true}
);

ํ…Œ์ด๋ธ”์—์„œ ๋ฐ์ดํ„ฐ ์ œ๊ฑฐ

PostgreSQL

DELETE FROM Music
WHERE Artist = 'The Acme Band' AND SongTitle = 'Look Out, World';

์นด์‚ฐ๋“œ ๋ผ

์œ„์˜ PostgreSQL ์˜ˆ์ œ์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

MongoDB์˜

MongoDB์—๋Š” ๋ฌธ์„œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์˜ ์ž‘์—…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ญ์ œ์›() /์‚ญ์ œ๋งŽ์€() ะธ ์—†์• ๋‹ค(). ๋‘ ๊ฐ€์ง€ ์œ ํ˜• ๋ชจ๋‘ ๋ฌธ์„œ๋ฅผ ์‚ญ์ œํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

db.music.deleteMany( {
        artist: "The Acme Band"
    }
);

ํ…Œ์ด๋ธ” ์‚ญ์ œ

PostgreSQL

DROP TABLE Music;

์นด์‚ฐ๋“œ ๋ผ

์œ„์˜ PostgreSQL ์˜ˆ์ œ์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

MongoDB์˜

db.music.drop();

๊ฒฐ๋ก 

SQL๊ณผ NoSQL ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๋…ผ์Ÿ์€ 10๋…„ ๋„˜๊ฒŒ ๊ฒฉ๋ ฌํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ์ด ๋…ผ์Ÿ์—๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—”์ง„ ์•„ํ‚คํ…์ฒ˜(๋ชจ๋†€๋ฆฌ์‹, ํŠธ๋žœ์žญ์…˜ SQL ๋Œ€ ๋ถ„์‚ฐ, ๋น„ํŠธ๋žœ์žญ์…˜ NoSQL)์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„ ์ ‘๊ทผ ๋ฐฉ์‹(SQL์—์„œ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง ๋Œ€ NoSQL์—์„œ ์ฟผ๋ฆฌ ๋ชจ๋ธ๋ง)์ด๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ์ธก๋ฉด์ด ์žˆ์Šต๋‹ˆ๋‹ค.

YugaByte DB์™€ ๊ฐ™์€ ๋ถ„์‚ฐ ํŠธ๋žœ์žญ์…˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•œ ๋…ผ์Ÿ์„ ์‰ฝ๊ฒŒ ์ž ์žฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ๋ณผ๋ฅจ์ด ๋‹จ์ผ ๋…ธ๋“œ์— ์“ธ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋ณด๋‹ค ์ปค์ง€๋ฉด์„œ ์ž๋™ ์ƒค๋”ฉ/๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑ์„ ํ†ตํ•ด ์„ ํ˜• ์“ฐ๊ธฐ ํ™•์žฅ์„ฑ์„ ์ง€์›ํ•˜๋Š” ์™„์ „ ๋ถ„์‚ฐํ˜• ์•„ํ‚คํ…์ฒ˜๊ฐ€ ํ•„์š”ํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

๊ฒŒ๋‹ค๊ฐ€ ์–ด๋Š ๊ธฐ์‚ฌ์—์„œ๋„ ๋ฐํ˜”๋“ฏ์ด Google ํด๋ผ์šฐ๋“œ,ํŠธ๋žœ์žญ์…˜์ ์ด๊ณ  ๊ฐ•๋ ฅํ•œ ์ผ๊ด€์„ฑ์„ ๊ฐ–์ถ˜ ์•„ํ‚คํ…์ฒ˜๋Š” ์ด์ œ ๋น„ํŠธ๋žœ์žญ์…˜์ ์ด๊ณ  ์ตœ์ข…์ ์œผ๋กœ ์ผ๊ด€๋œ ์•„ํ‚คํ…์ฒ˜๋ณด๋‹ค ๋” ๋‚˜์€ ๊ฐœ๋ฐœ ๋ฏผ์ฒฉ์„ฑ์„ ์ œ๊ณตํ•˜๋Š” ๋ฐ ๋” ๋งŽ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„ ๋…ผ์˜๋กœ ๋Œ์•„๊ฐ€์„œ, ๋ณต์žกํ•œ ์‹ค์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—๋Š” ๋‘ ๊ฐ€์ง€ ์„ค๊ณ„ ์ ‘๊ทผ ๋ฐฉ์‹(SQL ๋ฐ NoSQL)์ด ๋ชจ๋‘ ํ•„์š”ํ•˜๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ํƒ€๋‹นํ•ฉ๋‹ˆ๋‹ค. SQL "๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง" ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐœ๋ฐœ์ž๋Š” ๋ณ€ํ™”ํ•˜๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ ์‚ฌํ•ญ์„ ๋ณด๋‹ค ์‰ฝ๊ฒŒ โ€‹โ€‹์ถฉ์กฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, NoSQL "์ฟผ๋ฆฌ ๋ชจ๋ธ๋ง" ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ๋™์ผํ•œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์งง์€ ๋Œ€๊ธฐ ์‹œ๊ฐ„๊ณผ ๋†’์€ ์ฒ˜๋ฆฌ๋Ÿ‰์œผ๋กœ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ YugaByte DB๋Š” ์ ‘๊ทผ ๋ฐฉ์‹ ์ค‘ ํ•˜๋‚˜๋ฅผ ํ™๋ณดํ•˜๋Š” ๋Œ€์‹  ๊ณตํ†ต ์ฝ”์–ด์—์„œ SQL ๋ฐ NoSQL API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ YugaByte DB๋Š” PostgreSQL ๋ฐ Cassandra๋ฅผ ๋น„๋กฏํ•œ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์–ธ์–ด์™€์˜ ํ˜ธํ™˜์„ฑ์„ ์ œ๊ณตํ•จ์œผ๋กœ์จ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ผ๊ด€์„ฑ์ด ๋›ฐ์–ด๋‚œ ๋ถ„์‚ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—”์ง„์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ์–ธ์–ด๋ฅผ ๋ฐฐ์šธ ํ•„์š”๊ฐ€ ์—†๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ธฐ์‚ฌ์—์„œ๋Š” PostgreSQL, Cassandra ๋ฐ MongoDB ๊ฐ„์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„ ๊ธฐ๋ณธ ์‚ฌํ•ญ์ด ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ํ–ฅํ›„ ๊ธฐ์‚ฌ์—์„œ๋Š” ์ธ๋ฑ์Šค, ํŠธ๋žœ์žญ์…˜, JOIN, TTL ์ง€์‹œ๋ฌธ ๋ฐ JSON ๋ฌธ์„œ์™€ ๊ฐ™์€ ๊ณ ๊ธ‰ ๋””์ž์ธ ๊ฐœ๋…์„ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚จ์€ ์ฃผ๋ง ์ž˜ ๋ณด๋‚ด์‹œ๊ธฐ ๋ฐ”๋ผ๋ฉฐ, ์ดˆ๋Œ€ํ•ฉ๋‹ˆ๋‹ค. ๋ฌด๋ฃŒ ์›น ์„ธ๋ฏธ๋‚˜, 14์›” XNUMX์ผ์— ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

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