IT Knowledge/Database/images/sql-vs-nosql-venn.svg

SQL vs NoSQL

๐Ÿ“Œ ํ•ต์‹ฌ ์ฐจ์ด

ํ•ญ๋ชฉSQLNoSQL
์Šคํ‚ค๋งˆ๊ณ ์ •์œ ์—ฐ
ํ™•์žฅ์ˆ˜์ง (Scale-up)์ˆ˜ํ‰ (Scale-out)
ํŠธ๋žœ์žญ์…˜ACID ๋ณด์žฅ๊ฒฐ๊ตญ ์ผ๊ด€์„ฑ
์กฐ์ธ์ง€์›์ œํ•œ์ 
์‚ฌ์šฉ ์‚ฌ๋ก€๊ธˆ์œต, ERPSNS, IoT, ๋น…๋ฐ์ดํ„ฐ

๐ŸŽฏ ์‹ค์ „ ์‚ฌ๋ก€

์‚ฌ๋ก€ 1: ์ „์ž์ƒ๊ฑฐ๋ž˜ - SQL ์„ ํƒ

์ด์œ : ์žฌ๊ณ , ์ฃผ๋ฌธ, ๊ฒฐ์ œ๋Š” ์ •ํ™•์„ฑ ํ•„์ˆ˜

-- ์ฃผ๋ฌธ ์ฒ˜๋ฆฌ (ํŠธ๋žœ์žญ์…˜)
BEGIN TRANSACTION;
 
-- 1. ์žฌ๊ณ  ํ™•์ธ ๋ฐ ์ฐจ๊ฐ
UPDATE products
SET stock = stock - 1
WHERE id = 123 AND stock > 0;
 
-- 2. ์ฃผ๋ฌธ ์ƒ์„ฑ
INSERT INTO orders (user_id, product_id, amount)
VALUES (456, 123, 29000);
 
-- 3. ๊ฒฐ์ œ ์ฒ˜๋ฆฌ
INSERT INTO payments (order_id, amount, status)
VALUES (LAST_INSERT_ID(), 29000, 'COMPLETED');
 
COMMIT;  -- ๋ชจ๋‘ ์„ฑ๊ณตํ•˜๊ฑฐ๋‚˜ ๋ชจ๋‘ ์‹คํŒจ

์‚ฌ๋ก€ 2: ์†Œ์…œ ๋ฏธ๋””์–ด - NoSQL ์„ ํƒ

์ด์œ : ์Šคํ‚ค๋งˆ ์œ ์—ฐ์„ฑ, ๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ

// MongoDB: ๊ฒŒ์‹œ๋ฌผ ์ €์žฅ
db.posts.insertOne({
  userId: ObjectId('...'),
  content: '์—ฌํ–‰ ์‚ฌ์ง„',
  images: ['img1.jpg', 'img2.jpg'],  // ๋ฐฐ์—ด ์ž์œ ๋กญ๊ฒŒ
  tags: ['์—ฌํ–‰', '์ œ์ฃผ๋„'],
  likes: [],
  comments: [
    { userId: ObjectId('...'), text: '์ข‹์•„์š”!', createdAt: ISODate() }
  ],
  createdAt: ISODate()
});
 
// ์ข‹์•„์š” ์ถ”๊ฐ€ (๊ฐ„๋‹จ)
db.posts.updateOne(
  { _id: ObjectId('...') },
  { $push: { likes: userId } }
);

๐Ÿ’ก ์„ ํƒ ๊ฐ€์ด๋“œ

SQL ์„ ํƒ:

  • โœ… ๋ณต์žกํ•œ ๊ด€๊ณ„ (์‚ฌ์šฉ์ž-์ฃผ๋ฌธ-์ƒํ’ˆ)
  • โœ… ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ ์ค‘์š”
  • โœ… ๋ณต์žกํ•œ ์ฟผ๋ฆฌ ํ•„์š”

NoSQL ์„ ํƒ:

  • โœ… ๋น ๋ฅธ ์ฝ๊ธฐ/์“ฐ๊ธฐ
  • โœ… ์Šคํ‚ค๋งˆ ์ž์ฃผ ๋ณ€๊ฒฝ
  • โœ… ๋Œ€๊ทœ๋ชจ ํ™•์žฅ ํ•„์š”

๐Ÿ”— ์ฐธ๊ณ  ์ž๋ฃŒ