STUDY - DataBase

์ˆ˜ํ˜„ยท2023๋…„ 7์›” 25์ผ
0

IT (CS)

๋ชฉ๋ก ๋ณด๊ธฐ
5/12
post-thumbnail

๐Ÿ“’ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

๐Ÿ“• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ธฐ๋ณธ

1. DB ์ •์˜

  • ์ผ์ •ํ•œ ๊ทœ์น™์œผ๋กœ ๊ตฌ์กฐํ™”๋˜์–ด ์ €์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ์˜ ๋ชจ์Œ

  • ํŠน์ง•

    • ์‹ค์‹œ๊ฐ„ ์ ‘๊ทผ ๋ฐ ๋™์‹œ ๊ณต์œ  ๊ฐ€๋Šฅ
  • ์‚ฌ์šฉ ์ด์œ 

    • DB ์กด์žฌ ์ด์ „์—๋Š” ํŒŒ์ผ ์‹œ์Šคํ…œ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ
    • ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ๊ฐ ํŒŒ์ผ ๋‹จ์œ„๋กœ ์ €์žฅํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋…๋ฆฝ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์ƒํ˜ธ ์—ฐ๋™ ํ•„์š”
    • ๋ฌธ์ œ์  : ๋ฐ์ดํ„ฐ ์ข…์†์„ฑ, ๋ฐ์ดํ„ฐ ์ค‘๋ณต์„ฑ, ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ๋ณด์žฅX
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠน์ง•

    • ๋ฐ์ดํ„ฐ์˜ ๋…๋ฆฝ์„ฑ (๋ฐ์ดํ„ฐ ์ˆ˜์ •ํ•ด๋„ ๊ด€๋ จ๋œ ์‘์šฉํ”„๋กœ๊ทธ๋žจ ์ˆ˜์ •ํ•  ํ•„์š”X)
    • ๋ฐ์ดํ„ฐ์˜ ๋ฌด๊ฒฐ์„ฑ
    • ๋ฐ์ดํ„ฐ์˜ ๋ณด์•ˆ์„ฑ
    • ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ
    • ๋ฐ์ดํ„ฐ ์ค‘๋ณต ์ตœ์†Œํ™”
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ฑ๋Šฅ

    • ๋””์Šคํฌ I/O ์–ด๋–ป๊ฒŒ ์ค„์ด๋Š๋ƒ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง (์ˆœ์ฐจ I/O๊ฐ€ ๋žœ๋ค I/O๋ณด๋‹ค ๋น ๋ฆ„)

    ๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– ๋””์Šคํฌ I/O

    • ๋””์Šคํฌ ๋“œ๋ผ์ด๋ธŒ์˜ ํ”Œ๋ž˜ํ„ฐ(์›ํŒ)์„ ๋Œ๋ ค์„œ ์ฝ์–ด์•ผ ํ•  ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋œ ์œ„์น˜๋กœ ๋””์Šคํฌ ํ—ค๋”๋ฅผ ์ด๋™์‹œํ‚จ ๋‹ค์Œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ๊ฒƒ
    • ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์€ ๋””์Šคํฌ ํ—ค๋”๋ฅผ ์›€์ง์—ฌ์„œ ์ฝ๊ณ  ์“ธ ์œ„์น˜๋กœ ์˜ฎ๊ธฐ๋Š” ๋‹จ๊ณ„์—์„œ ๊ฒฐ์ •๋จ
    • ๋””์Šคํฌ์˜ ์„ฑ๋Šฅ์€ ๋””์Šคํฌ ํ—ค๋”์˜ ์œ„์น˜ ์ด๋™ ์—†์ด ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— ๊ธฐ๋กํ•˜๋Š”๋ƒ์— ๋”ฐ๋ผ ๊ฒฐ์ •
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ ํŠœ๋‹์„ ํ†ตํ•ด ๋žœ๋ค I/O ์ž์ฒด๋ฅผ ์ค„์—ฌ์คŒ

2. DBMS ์ •์˜ (DataBase Management System)

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ œ์–ด, ๊ด€๋ฆฌํ•˜๋Š” ํ†ตํ•ฉ ์‹œ์Šคํ…œ
  • DBMS๋งˆ๋‹ค ์ •์˜๋œ Query๋ฅผ ํ†ตํ•ด ์‚ฝ์ž…, ์‚ญ์ œ, ์ˆ˜์ •, ์กฐํšŒ ์ˆ˜ํ–‰
  • ์˜ˆ์‹œ : Node.js ํ˜น์€ PHP(์‘์šฉ ํ”„๋กœ๊ทธ๋žจ)์—์„œ MySQL(DBMS)์„ ์ด์šฉํ•˜์—ฌ DB ์•ˆ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๊ด€๋ จ ๋กœ์ง ๊ตฌ์ถ•

3. ์—”ํ„ฐํ‹ฐ (Entity)

  • ์‚ฌ๋žŒ/์žฅ์†Œ/๋ฌผ๊ฑด/์‚ฌ๊ฑด/๊ฐœ๋… ๋“ฑ ์†์„ฑ์„ ์ง€๋‹Œ ๋ช…์‚ฌ
  • ์ข…๋ฅ˜
    • ์•ฝํ•œ ์—”ํ„ฐํ‹ฐ : ๊ณ ์œ ํ•˜๊ฒŒ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋‹ค๋ฅธ ์—”ํ„ฐํ‹ฐ ํƒ€์ž…์œผ๋กœ๋ถ€ํ„ฐ ํ‚ค ์• ํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ๊ฐ€์ ธ์˜ด (์ž์ฒด์ ์œผ๋กœ ํ‚ค๋ฅผ ๋ณด์œ ํ•˜์ง€ ๋ชปํ•œ ์—”ํ„ฐํ‹ฐ)
    • ๊ฐ•ํ•œ ์—”ํ„ฐํ‹ฐ : ๊ธฐ๋ณธํ‚ค๋ฅผ ๊ฐ€์ง„ ์—”ํ„ฐํ‹ฐ
  • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : ํšŒ์›

4. ๋ฆด๋ ˆ์ด์…˜ (Relation)

  • DB์—์„œ ์ •๋ณด๋ฅผ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ €์žฅํ•˜๋Š” ๊ธฐ๋ณธ ๋‹จ์œ„
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์—”ํ„ฐํ‹ฐ ์ •๋ณด๊ฐ€ ๋ฆด๋ ˆ์ด์…˜์œผ๋กœ ๊ด€๋ฆฌ
    • ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค : ํ…Œ์ด๋ธ”
    • NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค : ์ปฌ๋ ‰์…˜

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– ํ…Œ์ด๋ธ”๊ณผ ์ปฌ๋ ‰์…˜ ์ฐจ์ด

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋งˆ๋‹ค ๊ณ„์ธต์ ์ธ ๊ตฌ์กฐ ์ด๋ฆ„ ์ฐจ์ด
  • โœ๏ธ MySQL(RDBMS)์˜ ๊ตฌ์กฐ
    • ๋ ˆ์ฝ”๋“œ โžก๏ธ ํ…Œ์ด๋ธ” โžก๏ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
  • โœ๏ธ MongoDB(NoSQLDB)์˜ ๊ตฌ์กฐ
    • ๋„ํ๋จผํŠธ โžก๏ธ ์ปฌ๋ ‰์…˜ โžก๏ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

5. ์†์„ฑ

  • ๋ฆด๋ ˆ์ด์…˜์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ตฌ์ฒด์ ์ด๋ฉฐ ๊ณ ์œ ํ•œ ์ด๋ฆ„์„ ๊ฐ–๋Š” ์ •๋ณด
  • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : ์ด๋ฆ„, ์•„์ด๋””, ์ฃผ์†Œ, ์ „ํ™”๋ฒˆํ˜ธ, ์„ฑ๋ณ„

6. ๋„๋ฉ”์ธ

  • ๋ฆด๋ ˆ์ด์…˜์— ํฌํ•จ๋œ ๊ฐ๊ฐ์˜ ์†์„ฑ์ด ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฐ’์˜ ์ง‘ํ•ฉ
  • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : (์„ฑ๋ณ„์˜ ๊ฒฝ์šฐ) {๋‚จ, ์—ฌ}

7. ํ•„๋“œ์™€ ๋ ˆ์ฝ”๋“œ

  • ํ•„๋“œ : ํ•„๋“œ์˜ ์—ด(column)๋‹จ์œ„์˜ ์†์„ฑ ๋ฐ์ดํ„ฐ

  • ๋ ˆ์ฝ”๋“œ : ํ•„๋“œ์˜ ํ–‰(row)๋‹จ์œ„์˜ ๋ฐ์ดํ„ฐ

    • ํŠœํ”Œ๊ณผ ๋™์ผ
  • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : '์ฑ…' ์—”ํ„ฐํ‹ฐ ์ •์˜ํ•˜๊ณ , ํ…Œ์ด๋ธ” ์ƒ์„ฑ

    • (1) ์†์„ฑ ์ •์˜
      • ์ด๋ฆ„, ์ €์ž์˜ ID, ์ถœํŒ๋…„๋„, ์žฅ๋ฅด, ์ƒ์„ฑ์ผ์‹œ, ์—…๋ฐ์ดํŠธ ์ผ์‹œ
    • (2) ์†์„ฑ์— ๋งž๋Š” ํƒ€์ž… ์ •์˜
      • id(์ฑ…์˜ ์•„์ด๋””) : INT
      • title(์ฑ…์˜ ์ œ๋ชฉ) : VARCHAR(255)
      • author_id(์ฑ…์˜ ์ €์ž ์•„์ด๋””) : INT
      • publishing_year(์ฑ…์˜ ์ถœํŒ๋…„๋„) : VARCHAR(255)
      • genre(์ฑ…์˜ ์žฅ๋ฅด) : VARCHAR(255)
      • created_at(์ƒ์„ฑ ์ผ์‹œ) : DATETIME
      • updated_at(์—…๋ฐ์ดํŠธ ์ผ์‹œ) : DATETIME
    • (3) ํ•ด๋‹น ํ…Œ์ด๋ธ” MySQL๋กœ ๊ตฌํ˜„
    CREATE TABLE book(
    		id INT NOT NULL AUTO_INCREMENT,
      	title VARCHAR(255),
          author_id INT,
          publishing_year VARCHAR(255),
          genre VARCHAR(255),
          created_at DATETIME,
          updated_at DATETIME,
          PRIMARY KEY (id)
    );

8. ํ•„๋“œ ํƒ€์ž… ์ข…๋ฅ˜

  • DB๋งˆ๋‹ค ํƒ€์ž…์— ์ฐจ์ด๊ฐ€ ์žˆ์Œ (MySQK๊ธฐ์ค€ ์„ค๋ช…)

  • (1) ์ˆซ์ž ํƒ€์ž…

    • ์ข…๋ฅ˜ : TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT
    • ๋ฒ”์œ„ : 4๋ฐ”์ดํŠธ, -21์–ต ~ 21์–ต
  • (2) ๋‚ ์งœ ํƒ€์ž…

    • ์ข…๋ฅ˜ : DATE, DATETIME, TIMESTAMP
    • ๋ฒ”์œ„
      • DATE : ๋‚ ์งœ ๋ถ€๋ถ„ O, ์‹œ๊ฐ„ ๋ถ€๋ถ„ X (3๋ฐ”์ดํŠธ, 1000-01-01 ~ 9999-12-31)
      • DATETIME : ๋‚ ์งœ/์‹œ๊ฐ„ ๋ถ€๋ถ„ O (8๋ฐ”์ดํŠธ, 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59)
      • TIMESTAMP : ๋‚ ์งœ/์‹œ๊ฐ„ ๋ถ€๋ถ„ O (4๋ฐ”์ดํŠธ, 1970-01-01 00:00:01 ~ 2038-01-19 03:14:07)
  • (3) ๋ฌธ์ž ํƒ€์ž…

    • ์ข…๋ฅ˜ : CHAR, VARCHAR, TEXT, BLOB, ENUM, SET
    • ๋ฒ”์œ„
      • CHAR : ํ…Œ์ด๋ธ” ์ƒ์„ฑ์‹œ ์„ ์–ธํ•œ ๊ธธ์ด๋กœ ๊ณ ์ • (0 ~ 255๋ฐ”์ดํŠธ)
      • VARCHAR : ์ž…๋ ฅ๋œ ๋ฐ์ดํ„ฐ์— ๋”ฐ๋ผ ์šฉ๋Ÿ‰์„ ๊ฐ€๋ณ€(์‹ค์ œ ๋ฐ”์ดํŠธ + ๊ธธ์ด ๊ธฐ๋ก์šฉ 1๋ฐ”์ดํŠธ)ํ•˜์—ฌ ์ €์žฅ (0 ~ 65,635๋ฐ”์ดํŠธ)
      • TEXT : ๊ฒŒ์‹œํŒ ๋ณธ๋ฌธ ์ €์žฅ ๋“ฑ ํฐ ๋ฌธ์ž์—ด ์ €์žฅ
      • BLOB : ์ด๋ฏธ์ง€, ๋™์˜์ƒ ๋“ฑ ํฐ ๋ฐ์ดํ„ฐ ์ €์žฅ (๋Œ€์‹  VARCHAR๋กœ ์ด๋ฏธ์ง€ ํŒŒ์ผ ๊ฒฝ๋กœ ์˜ฌ๋ฆผ)
      • ENUM : x-small/small/medium/large/x-large ์ค‘ ๋‹จ์ผ ์„ ํƒ (๋ฆฌ์ŠคํŠธ์— ์—†๋Š” ์ž˜๋ชป๋œ ๊ฐ’ ์„ ํƒ์‹œ ๋นˆ ๋ฌธ์ž์—ด ์‚ฝ์ž…) (0 ~ 65,535๊ฐœ ์š”์†Œ)
      • SET : ์—ฌ๋Ÿฌ ๊ฐœ ๋ฐ์ดํ„ฐ ์„ ํƒ ๋ฐ ๋น„ํŠธ ๋‹จ์œ„ ์—ฐ์‚ฐ ๊ฐ€๋Šฅ (0 ~ 64๊ฐœ ์š”์†Œ)

9. ๊ด€๊ณ„

  • ํ…Œ์ด๋ธ”๊ฐ„ ์„œ๋กœ์˜ ๊ด€๊ณ„๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์Œ
  • ๊ด€๊ณ„ ์ข…๋ฅ˜
    • 1:1 ๊ด€๊ณ„
      • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : ์œ ์ €๋‹น ์œ ์ € ์ด๋ฉ”์ผ
    • 1:N ๊ด€๊ณ„ (ํ•œ ๊ฐœ์ฒด๊ฐ€ ๋‹ค๋ฅธ ๋งŽ์€ ๊ฐœ์ฒด ํฌํ•จํ•˜๋Š” ๊ด€๊ณ„)
      • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : ์œ ์ €๋‹น ์„ ํƒํ•œ ์—ฌ๋Ÿฌ๊ฐœ ์ƒํ’ˆ
    • N:M ๊ด€๊ณ„
      • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : ํ•™์ƒ๊ณผ ๊ฐ•์˜ (ํ•™์ƒ์ด ์—ฌ๋Ÿฌ ๊ฐ•์˜ ๋“ฃ๊ณ , ๊ฐ•์˜๋‹น ์—ฌ๋Ÿฌ ํ•™์ƒ ํฌํ•จ)

10. ํ‚ค

  • ํ…Œ์ด๋ธ” ์ž์ฒด์˜ ์ธ๋ฑ์Šค
  • ํ‚ค ์ข…๋ฅ˜
    • ์Šˆํผํ‚ค : ์œ ์ผ์„ฑ(์ค‘๋ณตX)
    • ํ›„๋ณดํ‚ค : ์œ ์ผ์„ฑ + ์ตœ์†Œ์„ฑ(ํ•„๋“œ ์กฐํ•ฉX, ์ตœ์†Œ ํ•„๋“œ๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ํ‚ค ํ˜•์„ฑ ๊ฐ€๋Šฅ)
    • ๊ธฐ๋ณธํ‚ค : ๋ฐ์ดํ„ฐ ๊ณ ์œ ํ•˜๊ฒŒ ์กด์žฌํ•˜๋Š” ์†์„ฑ, ์œ ์ผ์„ฑ + ์ตœ์†Œ์„ฑ + ์ค‘๋ณต X
    • ๋Œ€์ฒดํ‚ค : ํ›„๋ณดํ‚ค ์ค‘ ๊ธฐ๋ณธํ‚ค๋กœ ์„ ํƒ๋˜์ง€ ๋ชปํ•œ ํ‚ค
    • ์ž์—ฐํ‚ค : ์†์„ฑ ์ค‘ ์ค‘๋ณต๋œ ๊ฐ’์„ ์ œ์™ธํ•œ ์†์„ฑ (๋ณ€ํ•  ์ˆ˜ ์žˆ์Œ)
    • ์ธ์กฐํ‚ค : ์ธ์œ„์ ์œผ๋กœ ์ƒ์„ฑํ•œ ๊ณ ์œ  ์‹๋ณ„์ž (๋ณดํ†ต ๊ธฐ๋ณธํ‚ค๋กœ ์„ค์ •๋จ)
    • ์™ธ๋ž˜ํ‚ค : ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์˜ ๊ธฐ๋ณธํ‚ค๋ฅผ ๊ทธ๋Œ€๋กœ ์ฐธ์กฐ (์ค‘๋ณต O)

๐Ÿ“˜ ERD (Entity Relationship Diagram)

1. ERD ์ •์˜

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์ถ•์‹œ ๊ธฐ์ดˆ์ ์ธ ๋ผˆ๋Œ€ ์—ญํ•  (๋ฆด๋ ˆ์ด์…˜ ๊ฐ„ ๊ด€๊ณ„ ์ •์˜)

  • ์‹œ์Šคํ…œ์˜ ์š”๊ตฌ ์‚ฌํ•ญ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์„ฑ๋จ

  • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : ์˜์—…๋ถ€์„œ์˜ ERD

    • (1) ์š”๊ตฌ ์‚ฌํ•ญ ์ •์˜
      • ์˜์—…์‚ฌ์›์€ 0 ~ n๋ช…์˜ ๊ณ ๊ฐ์„ ๊ด€๋ฆฌํ•œ๋‹ค.
      • ๊ณ ๊ฐ์€ 0 ~ n๋ช…์˜ ์ฃผ๋ฌธ์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.
      • ์ฃผ๋ฌธ์—๋Š” 1 ~ n๊ฐœ์˜ ์ƒํ’ˆ์ด ๋“ค์–ด๊ฐ„๋‹ค.

2. ์‡ผํ•‘๋ชฐ ERD ๊ตฌ์ถ•

  • mysql ์„œ๋ฒ„ + workbench ๋‹ค์šด๋กœ๋“œ

https://dev.mysql.com/downloads/windows/installer/8.0.html https://dev.mysql.com/downloads/workbench/

  • show database; ์ฟผ๋ฆฌ ์ •์ƒ ์ž‘๋™์‹œ OK

https://github.com/wnghdcjfe/csnote/blob/main/ch4/sample.sql

3. ERD ๋ถ„์„

CREATE TABLE `customers` (
`customerNumber` int(11) NOT NULL,
`customerName` varchar(50) NOT NULL,
`contactLastName` varchar(50) NOT NULL, `contactFirstName` varchar(50) NOT NULL,
`phone` varchar(50) NOT NULL,
`addressLine1` varchar(50) NOT NULL,
`addressLine2` varchar(50) DEFAULT NULL,
`city` varchar(50) NOT NULL,
`state` varchar(50) DEFAULT NULL,
`postalCode` varchar(15) DEFAULT NULL,
`country` varchar(50) NOT NULL,
`salesRepEmployeeNumber` int(11) DEFAULT NULL, `creditLimit` decimal(10,2) DEFAULT NULL,
PRIMARY KEY (`customerNumber`),
KEY `salesRepEmployeeNumber` (`salesRepEmployeeNumber`), CONSTRAINT `customers_ibfk_1` FOREIGN KEY
(`salesRepEmployeeNumber`) REFERENCES `employees`
(`employeeNumber`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
  • decimal(10, 2) = ์†Œ์ˆ˜ ๋ถ€๋ถ„์„ ํฌํ•จํ•œ ์‹ค์ˆ˜์˜ ์ด ์ž๋ฆฌ์ˆ˜ 10์ž๋ฆฌ, 2๊ฐœ์˜ ์†Œ์ˆ˜๋ฅผ ๊ฐ€์ง€๋Š” ์‹ค์ˆ˜

  • ์ธ๋ฑ์‹ฑ์„ ํ•  ํ‚ค๋ฅผ 1๊ฐœ ๋” ์ƒ์„ฑํ•˜๊ณ , salesRepEmployeeNumber๋ฅผ ์™ธ๋ž˜ํ‚ค๋กœ ์„ค์ •ํ•จ

  • orderdetails

    • ๋ณตํ•ฉํ‚ค (orderNumber + productCode)
    • 1์ฃผ๋ฌธ(orderNumber)์•ˆ์— ์žˆ๋Š” ์ƒํ’ˆ ์ฝ”๋“œ ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณตํ•ฉํ‚ค ํ•„์š”

4. MySQL CRUD ์‹ค์Šต

https://www.w3schools.com/mySQl/

// ํ…Œ์ด๋ธ” ์ƒ์„ฑ Create CREATE TABLE Persons (
    PersonID int,
    LastName varchar(255),
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255)
);
// ํ…Œ์ด๋ธ” ์กฐํšŒ : Read
SELECT *
INTO newtable [IN externaldb] FROM oldtable
WHERE condition;
// ํ…Œ์ด๋ธ” ์—…๋ฐ์ดํŠธ : Update ALTER TABLE Customers
ADD Email varchar(255);
// ํ…Œ์ด๋ธ” ์ œ๊ฑฐ : Delete DROP TABLE Shippers;

๐Ÿ“• ํŠธ๋žœ์žญ์…˜

1. ํŠธ๋žœ์žญ์…˜ ์ •์˜

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

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– Query

  • โœ๏ธ ์ •์˜
    • DB์— ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๋Š” ์ผ
    • query = ์งˆ์˜๋ฌธ = SQL
  • โœ๏ธ ์ข…๋ฅ˜
    • SELECT
    • DELETE
    • UPDATE

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– ํŠธ๋žœ์žญ์…˜๊ณผ Lock ์ฐจ์ด

  • โœ๏ธ Transaction : ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ๊ธฐ๋Šฅ
    • ํ•˜๋‚˜ ํ˜น์€ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ณ€๊ฒฝ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฟผ๋ฆฌ์— ๊ด€๊ณ„์—†์ด
    • ๋…ผ๋ฆฌ์ ์ธ ์ž‘์—…์ด 100% ์ ์šฉ๋˜๊ฑฐ๋‚˜ ์•„๋ฌด๊ฒƒ๋„ ์ ์šฉ๋˜์ง€ ์•Š๋„๋ก ๋ณด์žฅํ•จ
  • โœ๏ธ Lock : ๋™์‹œ์„ฑ ์ œ์–ดํ•˜๋Š” ๊ธฐ๋Šฅ
    • ์—ฌ๋Ÿฌ ์ปค๋„ฅ์…˜์—์„œ ๋™์‹œ์— ๋™์ผํ•œ ์ž์›(๋ ˆ์ฝ”๋“œ/ํ…Œ์ด๋ธ”)์„ ์š”์ฒญํ•  ๊ฒฝ์šฐ
    • ์ˆœ์„œ๋Œ€๋กœ ํ•œ ์ปค๋„ฅ์…˜๋งŒ ๋ณ€๊ฒฝํ•˜๊ฒŒ ํ•ด์คŒ

2. commit๊ณผ rollback

  • ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ๋ณด์žฅ ๋ฐ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์‰ฝ๊ฒŒ ํ™•์ธ ๊ฐ€๋Šฅ (์ž‘์—… ๊ทธ๋ฃนํ™”)

  • ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๋ฌถ๋Š” ๋กœ์ง์— ์™ธ๋ถ€ APIํ˜ธ์ถœ ์ž์ œ

  • commit

    • ์—ฌ๋Ÿฌ ์ฟผ๋ฆฌ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์—ˆ๋‹ค๊ณ  ํ™•์ •ํ•˜๋Š” ๋ช…๋ น์–ด
    • ํŠธ๋žœ์žญ์…˜ ๋‹จ์œ„(update, insert, delete ๋“ฑ)๋กœ ์ˆ˜ํ–‰
    • ๋ณ€๊ฒฝ๋œ ๋‚ด์šฉ์ด DB์— ์˜๊ตฌ์ ์œผ๋กœ ์ €์žฅ๋จ
    • ์ปค๋ฐ‹ ์ˆ˜ํ–‰ = ํŠธ๋žœ์žญ์…˜ ์„ฑ๊ณต์ ์œผ๋กœ ์ˆ˜ํ–‰
  • rollback

    • ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ ์ „ ์ƒํ™ฉ์œผ๋กœ ๋ณต๊ท€(์ทจ์†Œ)ํ•˜๋Š” ์ผ
    • ์—๋Ÿฌ ๋ฐ ์ด์Šˆ ๋ฐœ์ƒ์‹œ ์ด์ „์œผ๋กœ ๋Œ๋ฆผ

3. ํŠธ๋žœ์žญ์…˜ ์ „ํŒŒ (Transaction Propagation)

  • ํŠธ๋žœ์žญ์…˜ ์‹œ์ž‘

    • ํŠธ๋žœ์žญ์…˜ ์ˆ˜ํ–‰์‹œ Connection ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์™€ ์‚ฌ์šฉ
    • setAutoCommit(false)๋กœ ํŠธ๋žœ์žญ์…˜ ์‹œ์ž‘์„ ์„ ์–ธ (JDBC ๊ธฐ๋ณธ ์„ค์ •์œผ๋กœ DB์ž‘์—… ์ˆ˜ํ–‰ ์งํ›„ ์ž๋™ ์ปค๋ฐ‹ ์˜ต์…˜ ํ™œ์„ฑํ™” ๋˜์–ด์žˆ์–ด์„œ false๋กœ ์„ค์ •ํ•จ)
  • ํŠธ๋žœ์žญ์…˜ ์ข…๋ฃŒ

    • ์‹œ์ž‘๋˜๋ฉด commit() ๋˜๋Š” rollback() ํ˜ธ์ถœ๋  ๋•Œ๊นŒ์ง€ ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜
  • ํŠธ๋žœ์žญ์…˜ ์ „ํŒŒ

    • ํŠธ๋žœ์žญ์…˜์ด ์ง„ํ–‰์ค‘์ผ ๋•Œ ์ถ”๊ฐ€ ํŠธ๋žœ์žญ์…˜ ์ง„ํ–‰์„ ์–ด๋–ป๊ฒŒ ํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ

    • ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์„ ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๋ฌถ์Œ

    • ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜์— ์ฐธ์—ฌ / ๋ณ„๋„์˜ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ์ง„ํ–‰ / ์—๋Ÿฌ ๋ฐœ์ƒ์‹œํ‚ด

    • Spring ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ @Transactional ์• ๋„ˆํ…Œ์ด์…˜์„ ํ†ตํ•ด ์—ฌ๋Ÿฌ ์ฟผ๋ฆฌ ์ฝ”๋“œ๋ฅผ 1๊ฐœ์˜ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ์ฒ˜๋ฆฌํ•จ

    @Service
    @Transactional(readOnly = true)
    public class MemberService{
    	private final MemberRepository memberRepository;
      
      public MemberService(MemberRepository memberRepository) {
      	this.memberRepository = memberRepository;
       }
    }
    • ํŠธ๋žœ์žญ์…˜ ์ „ํŒŒ ์‚ฌ์šฉ์‹œ ๋…ผ๋ฆฌ ํŠธ๋žœ์žญ์…˜ ๊ฐœ๋… ์‚ฌ์šฉ๋จ
    • ๋ฌผ๋ฆฌ ํŠธ๋žœ์žญ์…˜ : ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ์šฉ๋˜๋Š” ํŠธ๋žœ์žญ์…˜ (Connection์„ ํ†ตํ•ด commit/rollbackํ•˜๋Š” ๋‹จ์œ„)
    • ๋…ผ๋ฆฌ ํŠธ๋žœ์žญ์…˜ : ์Šคํ”„๋ง์ด ํŠธ๋žœ์žญ์…˜ ๋งค๋‹ˆ์ €๋ฅผ ํ†ตํ•ด ํŠธ๋žœ์žญ์…˜์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋‹จ์œ„
  • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : ๊ฒŒ์‹œํŒ์— ๊ธ€ ์ž‘์„ฑํ•˜๋Š” ๊ธฐ๋Šฅ

    • ๊ธ€์„ ์ž„์‹œ ์ €์žฅํ•˜๋Š” ๊ธฐ๋Šฅ(A)์ด ๊ธ€ ์ž‘์„ฑ ์ค‘๊ฐ„์— ์ˆ˜ํ–‰๋˜๊ณ , ๋™์‹œ์— ๋กœ๊น…(B)์„ ํ•ด์•ผํ•˜๋Š” ์ƒํ™ฉ
    • ๋งŒ์•ฝ, ๋กœ๊น…(B) ์ž‘์—…์—์„œ ์˜ˆ์™ธ ๋ฐœ์ƒ๋  ๊ฒฝ์šฐ, ํŠธ๋žœ์žญ์…˜ ์ „ํŒŒ ์˜ต์…˜์ด Defaul์ด๋ฉด ๋กœ๊น…(B)์ด Rollback ์ง„ํ–‰๋˜๋ฉด์„œ ์ž„์‹œ ์ €์žฅ ๊ธฐ๋Šฅ(A)๋„ ํ•จ๊ป˜ Rollback ๋ฐœ์ƒ
    • ํ•˜์ง€๋งŒ, ์œ„์˜ ๊ฒฝ์šฐ A๊ฐ€ Rollback ๋˜๋ฉด ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ํŠธ๋žœ์žญ์…˜ ์ „ํŒŒ ์†์„ฑ ์„ค์ • ํ•„์š”ํ•จ

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– ํŠธ๋žœ์žญ์…˜ ์ „ํŒŒ ์†์„ฑ

  • REQUIRED
    • ํŠธ๋žœ์žญ์…˜์ด ํ•„์š”ํ•˜๊ณ , ์—†์œผ๋ฉด ์ƒˆ๋กœ ๋งŒ๋“ฆ (Default ์†์„ฑ)
    • ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜ ์—†์Œ : ์ƒˆ๋กœ์šด ํŠธ๋žœ์žญ์…˜ ์ƒ์„ฑํ•จ
    • ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜ ์žˆ์Œ : ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜์— ์ฐธ์—ฌํ•จ
    • ๊ธฐ๋ณธ์ ์œผ๋กœ ๋…ผ๋ฆฌ ํŠธ๋žœ์žญ์…˜ 2๊ฐœ๋ฅผ ๋ฌถ์–ด 1๊ฐœ์˜ ๋ฌผ๋ฆฌ ํŠธ๋žœ์žญ์…˜์„ ์‚ฌ์šฉํ•จ
      • ๋ชจ๋“  ๋…ผ๋ฆฌ ํŠธ๋žœ์žญ์…˜์ด ์ปค๋ฐ‹๋˜์–ด์•ผ ๋ฌผ๋ฆฌ ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹๋จ
      • ํ•˜๋‚˜์˜ ๋…ผ๋ฆฌ ํŠธ๋žœ์žญ์…˜์ด๋ผ๋„ ๋กค๋ฐฑ๋˜๋ฉด ๋ฌผ๋ฆฌ ํŠธ๋žœ์žญ์…˜ ๋กค๋ฐฑ๋จ
    • ํŠธ๋žœ์žญ์…˜ ๋งค๋‹ˆ์ €์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋Š” ๋…ผ๋ฆฌ ํŠธ๋žœ์žญ์…˜์ด ์กด์žฌํ•˜๋ฏ€๋กœ ์ปค๋ฐ‹ ์ด 2ํšŒ(๋‚ด๋ถ€ 1ํšŒ, ์™ธ๋ถ€ 1ํšŒ) ์‹คํ–‰
  • REQUIRES_NEW
    • ํ•ญ์ƒ ์ƒˆ๋กœ์šด ํŠธ๋žœ์žญ์…˜์ด ํ•„์š”ํ•จ
    • ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜ ์—†์Œ : ์ƒˆ๋กœ์šด ํŠธ๋žœ์žญ์…˜ ์ƒ์„ฑ
    • ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜ ์žˆ์Œ : ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜์„ ๋ณด๋ฅ˜์‹œํ‚ค๊ณ  ์ƒˆ๋กœ์šด ํŠธ๋žœ์žญ์…˜ ์ƒ์„ฑํ•จ
    • ์™ธ๋ถ€/๋‚ด๋ถ€ ํŠธ๋žœ์žญ์…˜์„ ์™„์ „ํžˆ ๋ถ„๋ฆฌํ•˜๋Š” ์ „ํŒŒ ์†์„ฑ (๋‚ด๋ถ€ ํŠธ๋žœ์žญ์…˜ ๋กค๋ฐฑ์ด ์™ธ๋ถ€ ํŠธ๋žœ์žญ์…˜ ๋กค๋ฐฑ์— ์˜ํ–ฅ X)
    • ๊ฐ๊ฐ ํŠธ๋žœ์žญ์…˜ ๋ณ„๋กœ ์ปค๋ฐ‹๊ณผ ๋กค๋ฐฑ์ด ์ˆ˜ํ–‰๋จ (๊ฐ๊ฐ์˜ DB Connection ์‚ฌ์šฉ๋จ, 1๊ฐœ์˜ HTTP ์š”์ฒญ์— ๋Œ€ํ•ด 2๊ฐœ์˜ Connection ์‚ฌ์šฉ)
    • ๋‚ด๋ถ€ ํŠธ๋žœ์žญ์…˜์ด ์ฒ˜๋ฆฌ ์ค‘์ผ ๊ฒฝ์šฐ, ์™ธ๋ถ€ ํŠธ๋žœ์žญ์…˜์ด ๋Œ€๊ธฐํ•จ (DB Connection ๊ณ ๊ฐˆ ์ฃผ์˜)
  • SUPPORTS
    • ํŠธ๋žœ์žญ์…˜์ด ์žˆ์œผ๋ฉด ์ง€์›ํ•จ (ํŠธ๋žœ์žญ์…˜์ด ์—†์–ด๋„ ๋จ)
    • ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜ ์—†์Œ : ํŠธ๋žœ์žญ์…˜ ์—†์ด ์ง„ํ–‰ํ•จ
    • ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜ ์žˆ์Œ : ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜์— ์ฐธ์—ฌํ•จ
  • MANDATORY
    • ํŠธ๋žœ์žญ์…˜์ด ์˜๋ฌด์ž„ (ํŠธ๋žœ์žญ์…˜ ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•จ)
    • ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜ ์—†์Œ : illegalTransactionStateException ์˜ˆ์™ธ ๋ฐœ์ƒ
    • ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜ ์žˆ์Œ : ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜์— ์ฐธ์—ฌํ•จ
  • NOT_SUPPORTED
    • ํŠธ๋žœ์žญ์…˜์„ ์ง€์›ํ•˜์ง€ ์•Š์Œ (ํŠธ๋žœ์žญ์…˜ ์—†์ด ์ง„ํ–‰ํ•จ)
    • ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜ ์—†์Œ : ํŠธ๋žœ์žญ์…˜ ์—†์ด ์ง„ํ–‰ํ•จ
    • ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜ ์žˆ์Œ : ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜์„ ๋ณด๋ฅ˜์‹œํ‚ค๊ณ  ํŠธ๋žœ์žญ์…˜ ์—†์ด ์ง„ํ–‰ํ•จ
  • NEVER
    • ํŠธ๋žœ์žญ์…˜์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ (๊ธฐ์กด ํŠธ๋žœ์žญ์…˜๋„ ํ—ˆ์šฉํ•˜์ง€ X)
    • ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜ ์—†์Œ : ํŠธ๋žœ์žญ์…˜ ์—†์ด ์ง„ํ–‰
    • ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜ ์žˆ์Œ : illegalTransactionStateException ์˜ˆ์™ธ ๋ฐœ์ƒ
  • NESTED
    • ์ค‘์ฒฉ(์ž์‹) ํŠธ๋žœ์žญ์…˜ ์ƒ์„ฑํ•จ
    • ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜ ์—†์Œ : ์ƒˆ๋กœ์šด ํŠธ๋žœ์žญ์…˜์„ ์ƒ์„ฑํ•จ
    • ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜ ์žˆ์Œ : ์ค‘์ฒฉ ํŠธ๋žœ์žญ์…˜์„ ๋งŒ๋“ฆ
    • ๋…๋ฆฝ์ ์ธ ํŠธ๋žœ์žญ์…˜(REQUIRES_NEW)์ด ์•„๋‹Œ ์ด๋ฏธ ์ง„ํ–‰์ค‘์ธ ํŠธ๋žœ์žญ์…˜์— ์ค‘์ฒฉ(์ž์‹) ํŠธ๋žœ์žญ์…˜ ์ƒ์„ฑ
      • ๋ถ€๋ชจ ํŠธ๋žœ์žญ์…˜์˜ ์˜ํ–ฅ(์ปค๋ฐ‹๊ณผ ๋กค๋ฐฑ)์€ ๋ฐ›์ง€๋งŒ, ์™ธ๋ถ€์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Œ
      • ์ค‘์ฒฉ ํŠธ๋žœ์žญ์…˜์ด ๋กค๋ฐฑ์ด ๋˜์–ด๋„ ์™ธ๋ถ€ ํŠธ๋žœ์žญ์…˜์€ ์ปค๋ฐ‹ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์™ธ๋ถ€ ํŠธ๋žœ์žญ์…˜์ด ๋กค๋ฐฑ๋  ๊ฒฝ์šฐ ์ค‘์ฒฉ ํŠธ๋žœ์žญ์…˜๋„ ํ•จ๊ป˜ ๋กค๋ฐฑ๋จ

4. ํŠธ๋žœ์žญ์…˜ ํŠน์ง• (ACID)

  • (1) ์›์ž์„ฑ atomicity
    • ํŠธ๋žœ์žญ์…˜์ด DB์— ๋ชจ๋‘ ๋ฐ˜์˜๋˜๊ฑฐ๋‚˜, ์ „ํ˜€ ๋ฐ˜์˜๋˜์ง€ ์•Š์Œ (All or Nothing)
    • ํŠธ๋žœ์žญ์…˜ ์ค‘๊ฐ„์— ๋ฌธ์ œ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ, ํŠธ๋žœ์žญ์…˜์— ํ•ด๋‹นํ•˜๋Š” ์–ด๋– ํ•œ ์ž‘์—…๋„ ์ˆ˜ํ–‰๋˜์ง€ ์•Š๊ณ  ์•„๋ฌด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ์—๋งŒ ๋ชจ๋“  ์ž‘์—… ์ˆ˜ํ–‰ํ•จ
  • (2) ์ผ๊ด€์„ฑ consistency
    • ํŠธ๋žœ์žญ์…˜ ์ž‘์—… ์ฒ˜๋ฆฌ์˜ ๊ฒฐ๊ณผ๊ฐ€ ํ•ญ์ƒ ๋™์ผํ•จ (ํ—ˆ์šฉ๋œ ๋ฐฉ์‹์œผ๋กœ๋งŒ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ)
    • ํŠธ๋žœ์žญ์…˜์ด ์ผ์–ด๋‚˜๊ธฐ ์ „์˜ ์ƒํ™ฉ๊ณผ ๋™์ผํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ ๋ณด์žฅ
  • (3) ๊ฒฉ๋ฆฌ์„ฑ isolation
    • ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์€ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์— ๋ผ์–ด๋“ค ์ˆ˜ ์—†์Œ (๊ฐ„์„ญ ๋ถˆ๊ฐ€๋Šฅ)
    • ๊ฐ๊ฐ์˜ ํŠธ๋žœ์žญ์…˜์€ ์„œ๋กœ์˜ ๊ฐ„์„ญ์—†์ด ๋…๋ฆฝ์ ์œผ๋กœ ์ˆ˜ํ–‰
  • (4) ์ง€์†์„ฑ durability
    • ํŠธ๋žœ์žญ์…˜์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜๋ฉด ์˜๊ตฌ์ ์œผ๋กœ ๊ฒฐ๊ณผ์— ์ €์žฅ๋จ (commit)

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– ๋ฌด๊ฒฐ์„ฑ

  • ๋ฐ์ดํ„ฐ์˜ ์ •ํ™•์„ฑ, ์ผ๊ด€์„ฑ, ์œ ํšจ์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ

5. ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€

  • ํŠธ๋žœ์žญ์…˜์ด ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋  ๊ฒฝ์šฐ : ๊ฒฉ๋ฆฌ์„ฑโฌ†๏ธ, ๋™์‹œ์„ฑโฌ‡๏ธ, ์„ฑ๋Šฅโฌ‡๏ธ
  • ๊ฒฉ๋ฆฌ ์ˆ˜์ค€ ๋‹จ๊ณ„
    • Serializable : ์ด์ƒํ˜„์ƒ ๋ฐœ์ƒ X (๊ฒฉ๋ฆฌ์„ฑโฌ†๏ธ)
    • Repatable Read : ํŒฌํ…€ ๋ฆฌ๋“œ ๋ฐœ์ƒ ๊ฐ€๋Šฅ
    • Read Commited : + ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์€ ์กฐํšŒ ๋ฐœ์ƒ ๊ฐ€๋Šฅ
    • Read Uncommited : + ๋”ํ‹ฐ ๋ฆฌ๋“œ ๋ฐœ์ƒ ๊ฐ€๋Šฅ (๊ฒฉ๋ฆฌ์„ฑโฌ‡๏ธ)
Isolation LevelDirty readsNon-repeatable readsPhantoms
Read UncommitedMay occurMay occurMay occur
Read CommitedDon't occurMay occurMay occur
Repeatable ReadDon't occurDon't occurMay occur
SerializableDon't occurDon't occurDon't occur

  • ๊ฒฉ๋ฆฌ ์ˆ˜์ค€ ์„ค์ •
set session transaction isolation level read uncommitted;
  • Serializable

    • ์ปค๋ฐ‹ ์™„๋ฃŒ๋œ ๋ฐ์ดํ„ฐ๋งŒ ์กฐํšŒ ๊ฐ€๋Šฅ
    • ํŠธ๋žœ์žญ์…˜์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ง„ํ–‰ (๊ฐ„์„ญ ๋ฐœ์ƒ X)
    • ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์ด ๋™์‹œ์— ๊ฐ™์€ ํ–‰์— ์ ‘๊ทผ ๋ถˆ๊ฐ€
  • Repatable Read

    • ์ปค๋ฐ‹ ์™„๋ฃŒ๋œ ๋ฐ์ดํ„ฐ๋งŒ ์กฐํšŒ ๊ฐ€๋Šฅ
    • ๊ฐ™์€ ํ–‰์„ ๋ฐ˜๋ณตํ•ด์„œ ์กฐํšŒํ•˜๋”๋ผ๋„ ๋™์ผํ•œ ๊ฒฐ๊ณผ ๋ณด์žฅ
    • ํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ ์ˆ˜์ •ํ•œ ํ–‰์„ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์ˆ˜์ • ๋ถˆ๊ฐ€ / ์ƒˆ๋กœ์šด ํ–‰ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ (โžก๏ธ ํŒฌํ…€ ๋ฆฌ๋“œ ๋ฐœ์ƒ)
    • MySQL8.0์˜ innoDB์˜ ๊ธฐ๋ณธ๊ฐ’
  • Read Commited

    • ์ปค๋ฐ‹ ์™„๋ฃŒ๋œ ๋ฐ์ดํ„ฐ๋งŒ ์กฐํšŒ ๊ฐ€๋Šฅ
    • ๊ฐ™์€ ํ–‰์„ ๋ฐ˜๋ณตํ•ด์„œ ์กฐํšŒํ•˜๋”๋ผ๋„ ๋™์ผํ•œ ๊ฒฐ๊ณผ ๋ณด์žฅX
    • ํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ ์ˆ˜์ •ํ•œ ํ–‰์„ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์ˆ˜์ • + ์ƒˆ๋กœ์šด ํ–‰ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ (โžก๏ธ ํŒฌํ…€ ๋ฆฌ๋“œ, ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์€ ์กฐํšŒ ๋ฐœ์ƒ)
    • PostgreSQL, SQL Server, ์˜ค๋ผํด์˜ ๊ธฐ๋ณธ๊ฐ’
  • Read Uncommited

    • ์ปค๋ฐ‹ํ•˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ ์กฐํšŒ ๊ฐ€๋Šฅ
    • ์†๋„ ๊ฐ€์žฅ ๋น ๋ฆ„

6. ํŠธ๋žœ์žญ์…˜ ์ด์ƒ ํ˜„์ƒ

  • (1) ํŒฌํ…€ ๋ฆฌ๋“œ(Phantom reads)

    • ํ•œ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ๋™์ผํ•œ ์ฟผ๋ฆฌ๋ฅผ 2๋ฒˆ ์ด์ƒ ๋ณด๋ƒˆ์„ ๋•Œ (๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์˜ ์˜ํ–ฅ์œผ๋กœ) ์กฐํšŒ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค๋ฆ„
    • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : ์ƒˆ๋กœ์šด ๋ ˆ์ฝ”๋“œ ์ถ”๊ฐ€ ๋ฐ ์‚ญ์ œ๋˜์–ด ๋ฐœ์ƒ
  • (2) ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์€ ์กฐํšŒ (Nonrepatable Reads)

    • ํ•œ ํŠธ๋žœ์žญ์…˜ ๋‚ด์˜ ๊ฐ™์€ ํ–‰์— 2๋ฒˆ ์ด์ƒ ์กฐํšŒ๊ฐ€ ๋ฐœ์ƒ ํ–ˆ์„ ๋•Œ, ๊ทธ ๊ฐ’์ด ๋‹ค๋ฅธ ๊ฒƒ
    • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : ํŠธ๋žœ์žญ์…˜ A๋Š” SELECTํ•˜๋Š” ๊ตฌ๋ฌธ์ด๊ณ , ํŠธ๋žœ์žญ์…˜ B๋Š” ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝํ•˜๋Š” ๊ตฌ๋ฌธ์ผ ๊ฒฝ์šฐ ํŠธ๋žœ์žญ์…˜ A๋Š” B๋•Œ๋ฌธ์— ๋ฐ˜๋ณต ์ˆ˜ํ–‰์‹œ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ ๊ฐ€์ ธ์˜ด
  • (3) ๋”ํ‹ฐ ๋ฆฌ๋“œ (Dirty Reads)

    • ํ•œ ํŠธ๋žœ์žญ์…˜์ด ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์˜ ์•„์ง ์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Œ
    • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : ํŠธ๋žœ์žญ์…˜ A๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ , ์ปค๋ฐ‹ํ•˜๊ธฐ ์ „์— ํŠธ๋žœ์žญ์…˜ B๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ๊ฒฝ์šฐ ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ ์ฝ์Œ

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– ํŠธ๋žœ์žญ์…˜ ์‚ฌ์šฉ์‹œ ์ฃผ์˜

  • ํŠธ๋žœ์žญ์…˜์€ ๊ผญ ํ•„์š”ํ•œ ์ตœ์†Œํ•œ ์ฝ”๋“œ์—๋งŒ ์ ์šฉํ•˜๊ธฐ
  • ์ผ๋ฐ˜์ ์œผ๋กœ DB Connection ๊ฐœ์ˆ˜๋Š” ์ œํ•œ์ ์ด๋ฏ€๋กœ, ๊ฐ ๋‹จ์œ„ ํ”„๋กœ๊ทธ๋žจ์—์„œ Connection ์†Œ์œ  ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง€๋ฉด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์—ฌ์œ  Connection ๊ฐœ์ˆ˜๊ฐ€ ์ค„์–ด๋“ฆ
  • ๋”ฐ๋ผ์„œ, ํŠธ๋žœ์žญ์…˜ ๋ฒ”์œ„ ์ตœ์†Œํ™”

๐Ÿ“• ๊ด€๊ณ„ํ˜•๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ NoSQL ์ฐจ์ด

1. RDBMS (๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ ์‹œ์Šคํ…œ)

  • SQL์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•ด ํ…Œ์ด๋ธ”, ํ–‰, ์—ด์˜ ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

  • ์ข…๋ฅ˜ : MySQL, PostgreSQL, ์˜ค๋ผํด(PL/SQL), SQL Server(T-SQL), MSSQL(SQL)

  • DBMS์™€ ์ฐจ์ด์ 

    • ํ…Œ์ด๋ธ”๊ฐ„ ๊ด€๊ณ„(์™ธ๋ž˜ํ‚ค ๋“ฑ)๋ฅผ ๋งบ๊ณ  ์žˆ์–ด DBMS๋ณด๋‹ค ํšจ์œจ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ
  • ์žฅ์ 

    • ๋ฐ์ดํ„ฐ ์ค‘๋ณต ์—†์Œ
    • ๋ช…ํ™•ํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๋ณด์žฅ
  • ๋‹จ์ 

    • ์‹œ์Šคํ…œ์ด ์ปค์งˆ ๊ฒฝ์šฐ JOIN๋ฌธ์ด ๋งŽ์€ ๋ณต์žกํ•œ ์ฟผ๋ฆฌ
    • ์Šคํ‚ค๋งˆ๋กœ ์ธํ•ด ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ์œ ์—ฐํ•˜์ง€X (๋ณ€๊ฒฝ์‹œ ์–ด๋ ค์›€)
    • ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•ด์„œ๋Š” ์„œ๋ฒ„ ์„ฑ๋Šฅ ํ–ฅ์ƒ์‹œํ‚ค๋Š” Scale-up๋งŒ ์ง€์› (๋น„์šฉ ํฌ๊ฒŒ ๋Š˜์–ด๋‚จ)
  • ์‚ฌ์šฉ : ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๋ช…ํ™•ํ•˜์—ฌ ๋ณ€๊ฒฝ๋  ์—ฌ์ง€๊ฐ€ ์—†๊ณ , ๋ช…ํ™•ํ•œ ์Šคํ‚ค๋งˆ๊ฐ€ ์ค‘์š”ํ•œ ๊ฒฝ์šฐ ์‚ฌ์šฉ

2. NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

  • SQL์–ธ์–ด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋‹ค๋ฅธ ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ ์ €์žฅ ๊ธฐ์ˆ 
  • ์ข…๋ฅ˜ : MongoDB, redis
  • RDBMS์™€ ์ฐจ์ด์ 
    • ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ์€ ํฌ๊ธฐํ•˜์ง€๋งŒ, ๋น„์šฉ์„ ๊ณ ๋ คํ•˜์—ฌ ์—ฌ๋Ÿฌ ๋Œ€์— ๋ฐ์ดํ„ฐ ๋ถ„์‚ฐ ์ €์žฅ
  • ์žฅ์ 
    • ์œ ํ˜„ํ•œ ์Šคํ‚ค๋งˆ, ํ™•์žฅ์„ฑ
    • ๋Œ€๋Ÿ‰์˜ ๋ถ„์‚ฐ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์กฐํšŒ์— ์šฉ์ด
    • ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ๊ณณ์— ๋ถ„์‚ฐํ•˜๋Š” Scale-out๋„ ๊ฐ€๋Šฅ
    • ์“ฐ๊ธฐ/์ฝ๊ธฐ ์„ฑ๋Šฅ ํŠนํ™”, 2์ฐจ ์ธ๋ฑ์Šค ์ง€์›, ์˜คํ†  ์ƒค๋”ฉ ์ง€์›
  • ๋‹จ์ 
    • ๋ฐ์ดํ„ฐ ์ค‘๋ณต ๋ฐœ์ƒ ๊ฐ€๋Šฅ (์ค‘๋ณต๋œ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์‹œ ๋ชจ๋“  ์ปฌ๋ ‰์…˜ ์ˆ˜์ • ํ•„์š”)
    • ์Šคํ‚ค๋งˆ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์•„, ๋ช…ํ™•ํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๋ณด์žฅ X
  • ์‚ฌ์šฉ : ์ •ํ™•ํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ์•Œ ์ˆ˜ ์—†๊ณ , ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ/ํ™•์žฅ๋  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– ์ €์žฅ ๋ฐฉ์‹์— ๋”ฐ๋ฅธ NoSQL ๋ถ„๋ฅ˜

  • โœ๏ธ Key-Value Model
    • Redis
    • ํ‚ค 1๊ฐœ๋กœ ๋ฐ์ดํ„ฐ 1๊ฐœ ์ €์žฅ/์กฐํšŒํ•˜๋Š” ๋‹จ์ผ ํ‚ค-๊ฐ’ ๊ตฌ์กฐ
    • ์žฅ์  : ๋‹จ์ˆœํ•œ ์ €์žฅ ๊ตฌ์กฐ, ๊ณ ์† ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ์— ์ตœ์ ํ™”
    • ๋‹จ์  : ๋ณต์žกํ•œ ์กฐํšŒ ์—ฐ์‚ฐ ์ง€์›X, 1๊ฐœ์˜ ์„œ๋น„์Šค ์š”์ฒญ์— ๋‹ค์ˆ˜์˜ ๋ฐ์ดํ„ฐ ์กฐํšŒ/์ˆ˜์ • ์—ฐ์‚ฐ ๋ฐœ์ƒํ•˜๋ฉด ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ ๋ณด์žฅ ๋ชปํ•จ
    • ์‚ฌ์šฉ : ์‚ฌ์šฉ์ž์˜ ํ”„๋กœํ•„ ์ •๋ณด, ์›น ์„œ๋ฒ„ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์œ„ํ•œ ์„ธ์…˜ ์ •๋ณด, URL ๋‹จ์ถ• ์ •๋ณด ์ €์žฅ
  • โœ๏ธ Document Model
    • MongoDB
    • ํ‚ค 1๊ฐœ์— ๊ตฌ์กฐํ™”๋œ ๋ฌธ์„œ๋ฅผ ์ €์žฅ/์กฐํšŒ (๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์œ ์‚ฌ)
    • ํ‚ค๋Š” ๋ฌธ์„œ์— ๋Œ€ํ•œ ID๋กœ ํ‘œํ˜„๋จ
    • ์ €์žฅ๋œ ๋ฌธ์„œ๋Š” ์ปฌ๋ ‰์…˜์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ , ๋ฌธ์„œ ์ €์žฅ๊ณผ ๋™์‹œ์— ๋ฌธ์„œ ID์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค ์ƒ์„ฑ
    • ์ธ๋ฑ์Šค ์‚ฌ์šฉํ•˜์—ฌ O(1) ์‹œ๊ฐ„ ์•ˆ์— ๋ฌธ์„œ ์กฐํšŒ ๊ฐ€๋Šฅ
    • B-Tree ์ธ๋ฑ์Šค ์‚ฌ์šฉํ•˜์—ฌ 2์ฐจ ์ธ๋ฑ์Šค ์ƒ์„ฑํ•จ (ํฌ๊ธฐ ์ปค์งˆ์ˆ˜๋ก ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ์ž…๋ ฅ/์‚ญ์ œ์‹œ ์„ฑ๋Šฅ ์ €ํ•˜๋จ)
    • ์‚ฌ์šฉ : ์ค‘์•™ ์ง‘์ค‘์‹ ๋กœ๊ทธ ์ €์žฅ, ํƒ€์ž„๋ผ์ธ ์ €์žฅ, ํ†ต๊ณ„ ์ •๋ณด ์ €์žฅ
  • โœ๏ธ Column Model
    • Google์˜ ๋น…ํ…Œ์ด๋ธ”
    • 1๊ฐœ์˜ ํ‚ค์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ปฌ๋Ÿผ ์ด๋ฆ„๊ณผ ์ปฌ๋Ÿผ ๊ฐ’์˜ ์Œ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐ์ดํ„ฐ ์ €์žฅ/์กฐํšŒ
    • ๋น…ํ…Œ์ด๋ธ” ๊ฐœ๋… (Row Key, Column Key, Column Family ๋“ฑ) ์‚ฌ์šฉ
    • ์ปฌ๋Ÿผ ๋‹จ์œ„๋กœ ์ €์žฅ, ์ปฌ๋Ÿผ ์ด๋ฆ„, ์ปฌ๋Ÿผ ๊ฐ’, ํƒ€์ž„์Šคํƒฌํ”„๋กœ ๊ตฌ์„ฑ๋จ (๋ชจ๋“  ์ปฌ๋Ÿผ์€ ํ•ญ์ƒ ํƒ€์ž„ ์Šคํƒฌํ”„ ๊ฐ’๊ณผ ํ•จ๊ป˜ ์ €์žฅ)
    • ์ฝ๊ธฐ๋ณด๋‹ค ์“ฐ๊ธฐ์— ์ตœ์ ํ™” (๋น ๋ฅธ ์‹œ๊ฐ„ ์•ˆ์— ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ ์ž…๋ ฅ/์กฐํšŒํ•˜๋Š” ์„œ๋น„์Šค ๊ตฌํ˜„์‹œ ์ ํ•ฉ)
    • ๋ฐ์ดํ„ฐ๋ฅผ ๋จผ์ € ์ปค๋ฐ‹๋กœ๊ทธ์™€ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•œ ํ›„ ์‘๋‹ตํ•˜์—ฌ ๋น ๋ฅธ ์‘๋‹ต์†๋„ ์ œ๊ณต
    • ์‚ฌ์šฉ : ์ฑ„ํŒ… ๋‚ด์šฉ ์ €์žฅ, ์‹ค์‹œ๊ฐ„ ๋ถ„์„์„ ์œ„ํ•œ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ

3. MySQL

  • ๋Œ€๋ถ€๋ถ„ ์šด์˜์ฒด์ œ์™€ ํ˜ธํ™˜๋˜๊ณ , ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
  • ํŠน์ง•
    • C, C++๋กœ ๋งŒ๋“ฆ
    • B-ํŠธ๋ฆฌ ๊ธฐ๋ฐ˜์˜ ์ธ๋ฑ์Šค
    • ์Šค๋ ˆ๋“œ ๊ธฐ๋ฐ˜์˜ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์‹œ์Šคํ…œ
    • ๋งค์šฐ ๋น ๋ฅธ ์กฐ์ธ
    • ์ตœ๋Œ€ 64๊ฐœ์˜ ์ธ๋ฑ์Šค
    • ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์œ„ํ•ด ์„ค๊ณ„๋จ
    • ๋กค๋ฐฑ, ์ปค๋ฐ‹, ์ด์ค‘ ์•”ํ˜ธ ์ง€์› ๋ณด์•ˆ
  • MySQL์˜ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„ ์•„ํ‚คํ…์ฒ˜
    • ๋ชจ๋“ˆ์‹ ์•„ํ‚คํ…์ฒ˜๋กœ ์‰ฝ๊ฒŒ ์Šคํ† ๋ฆฌ์ง€์—”์ง„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Œ
    • ๋ฐ์ดํ„ฐ ์›จ์–ดํ•˜์šฐ์ง•, ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ, ๊ณ ๊ฐ€์šฉ์„ฑ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
    • ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„ ์œ„์— ์ปค๋„ฅํ„ฐ API ๋ฐ ์„œ๋น„์Šค ๊ณ„์ธต์„ ํ†ตํ•ด MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์‰ฝ๊ฒŒ ์ƒํ˜ธ ์ž‘์šฉ ๊ฐ€๋Šฅ
  • ์ฟผ๋ฆฌ ์บ์‹œ ์ง€์›
    • ์ž…๋ ฅ๋œ ์ฟผ๋ฆฌ๋ฌธ์— ๋Œ€ํ•œ ์ „์ฒด ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์„ ์ €์žฅํ•จ
    • ์‚ฌ์šฉ์ž๊ฐ€ ์ž‘์„ฑํ•œ ์ฟผ๋ฆฌ๊ฐ€ ์บ์‹œ์— ์žˆ๋Š” ์ฟผ๋ฆฌ์™€ ๋™์ผํ•˜๋ฉด, ์„œ๋ฒ„๋Š” ๋‹จ์ˆœํžˆ ๊ตฌ๋ฌธ ๋ถ„์„, ์ตœ์ ํ™” ๋ฐ ์‹คํ–‰์„ ๊ฑด๋„ˆ๋›ฐ๊ณ  ์บ์‹œ์˜ ์ถœ๋ ฅ๋งŒ ํ‘œ์‹œํ•จ

4. PostgreSQL

  • MySQL ๋‹ค์Œ์œผ๋กœ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (์ธํ”„๋žฉ์—์„œ ์‚ฌ์šฉ)
  • ํŠน์ง•
    • ๋””์Šคํฌ ์กฐ๊ฐ์ด ์ฐจ์ง€ํ•˜๋Š” ์˜์—ญ ํšŒ์ˆ˜ํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์น˜(VACUUM) ์žˆ์Œ
    • ์ตœ๋Œ€ ํ…Œ์ด๋ธ” ํฌ๊ธฐ 32TB
    • SQL๋ฟ๋งŒ ์•„๋‹ˆ๋ผ JSON์„ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ฐ€๋Šฅ
    • ์ง€์ • ์‹œ๊ฐ„์— ๋ณต๊ตฌํ•˜๋Š” ๊ธฐ๋Šฅ
    • ๋กœ๊น…, ์ ‘๊ทผ์ œ์–ด, ์ข…ํ•ฉ๋œ ํŠธ๋žœ์žญ์…˜, ๋ฐฑ์—… ๊ฐ€๋Šฅ

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– JSON (JavaScript Object Notation)

  • ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ํ…์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ €์žฅ, ์ „์†ก, ๊ณต์œ ํ•˜๋Š” ํ‘œ์ค€ ํŒŒ์ผ ํ˜•์‹
  • JSON ํŒŒ์ผ์€ .json ํ™•์žฅ์ž๋กœ ์ €์žฅ
  • JavaScript์—์„œ ํŒŒ์ƒ๋˜์ง€๋งŒ, ์–ธ์–ด ๋…๋ฆฝ์ ์ธ ๋ฐ์ดํ„ฐ ํ˜•์‹

5. MongoDB

  • wiredtiger ์—”์ง„์ด ๊ธฐ๋ณธ์œผ๋กœ ์žฅ์ฐฉ๋œ ํ‚ค-๊ฐ’ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์—์„œ ํ™•์žฅ๋œ document ๊ธฐ๋ฐ˜์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
  • ํŠน์ง•
    • JSON์„ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ฐ€๋Šฅ (Binary JSON ํ˜•ํƒœ(BSON)๋กœ ์ €์žฅ๋จ)
    • ํ™•์žฅ์„ฑ์ด ๋›ฐ์–ด๋‚˜๊ณ , ๋น…๋ฐ์ดํ„ฐ ์ €์žฅ์‹œ ์„ฑ๋Šฅ์ด ์ข‹์Œ
    • ๊ณ ๊ฐ€์šฉ์„ฑ, ์ƒค๋”ฉ, ๋ ˆํ”Œ๋ฆฌ์นด์…‹ ์ง€์›
    • ์Šคํ‚ค๋งˆ๋ฅผ ์ •ํ•˜์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ ์‚ฝ์ž… ๊ฐ€๋Šฅ (๋‹ค์–‘ํ•œ ๋„๋ฉ”์ธ์˜ DB๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ถ„์„ ๋ฐ ๋กœ๊น… ๊ตฌํ˜„์‹œ ํŽธ๋ฆฌ)
    • document ์ƒ์„ฑํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค๋ฅธ ์ปฌ๋ ‰์…˜์—์„œ ์ค‘๋ณต๋œ ๊ฐ’์„ ๊ฐ–๊ธฐ ํž˜๋“  ObjectID ์ƒ์„ฑ๋จ
    • ObjectID(๊ธฐ๋ณธํ‚ค) : ์œ ๋‹‰์Šค ์‹œ๊ฐ„ ๊ธฐ๋ฐ˜์˜ ํƒ€์ž„์Šคํƒฌํ”„(4๋ฐ”์ดํŠธ). ๋žœ๋˜๊ฐ’(5๋ฐ”์ดํŠธ), ์นด์šดํ„ฐ(3๋ฐ”์ดํŠธ)๋กœ ๊ตฌ์„ฑ

5. MongoDB ํŠน์ง•

  • (1) Key์™€ value ํ˜•ํƒœ์˜ document

    • _id ํ˜•ํƒœ์˜ ๊ณ ์œ ํ•œ ์•„์ด๋””
    • key์˜ ๊ธธ์ด๋„ DB์— ์ €์žฅ
    • JSON ํ˜•ํƒœ๋กœ ์ฟผ๋ฆฌ ์ƒ์„ฑ ๋ฐ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„ BSONํ˜•ํƒœ๋กœ DB์— ์‚ฝ์ž…/์ถ”์ถœ ๊ฐ€๋Šฅ
    • type ๋ณ€ํ™˜ ์ผ์–ด๋‚˜์ง€ X (๋ฐ์ดํ„ฐ ์ฃผ๊ณ ๋ฐ›์„ ๋•Œ ์„ฑ๋Šฅ ํ–ฅ์ƒ)
  • (2) ์Šคํ‚ค๋งˆ ์—†์ด ์‚ฝ์ž… ๊ฐ€๋Šฅ

    • ์Šคํ‚ค๋งˆ ์—†์ด ๋ฐ์ดํ„ฐ ๋ชจ๋ธ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ณ , ์œ ์—ฐํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ ์‚ฝ์ž… ๊ฐ€๋Šฅ
    • document๋กœ ์นผ๋Ÿผ์ด๋ฆ„๋„ ๋ฐ”์ดํŠธ์— ์ถ”๊ฐ€๋จ (key-value ํ˜•ํƒœ๋ผ์„œ)
    • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : char[14] ๊น€์ˆ˜ํ˜„ or name:๊น€์ˆ˜ํ˜„ ์ €์žฅํ•  ๊ฒฝ์šฐ
      • RDBMS : 14๋ฐ”์ดํŠธ
      • MongoDB : 16๋ฐ”์ดํŠธ (comments : string)
  • (3) ๋ฐ์ดํ„ฐ์˜ ์กฐํ•ฉํ•จ์ˆ˜ ์ง€์›

    • ํ•จ์ˆ˜๋กœ ๋ฐ์ดํ„ฐ ์ถ”์ถœํ•˜๊ณ , ์กฐํ•ฉํ•˜์—ฌ ์••์ถ•๋œ ๊ฒฐ๊ณผ๊ฐ’ ์ƒ์„ฑ
    • ํ•จ์ˆ˜ ์˜ˆ์‹œ : min, max, aggregate, mapReduce
  • (4) ์ด์ค‘ํ™” ์ง€์›๊ณผ ์ƒค๋”ฉ

    • ์šด์˜์„œ๋ฒ„์˜ ๊ฒฝ์šฐ ๋ฉˆ์ถ”๋ฉด ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„ ์ด์ค‘ํ™” ํ•„์š” โžก๏ธ ReplicaSet ์ด์šฉํ•ด ์ด์ค‘ํ™”
    • ๋ฐ์ดํ„ฐ ์–‘์ด ๋งŽ์€ ๊ฒฝ์šฐ โžก๏ธ ์ƒค๋”ฉ์„ ํ†ตํ•ด collection ๋ถ„ํ• ํ•˜์—ฌ ๊ด€๋ฆฌ
  • (5) JSON ํ˜•ํƒœ์˜ Data

    • BSON ํ˜•ํƒœ๋กœ ์ €์žฅ
    • JSON ํ˜•ํƒœ๋กœ ๊ฐ’ ์ถ”์ถœ
    • JSON Object๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„ ์ €์žฅ
  • (6) 2์ฐจ์› ์ขŒํ‘œ ์ธ๋ฑ์‹ฑ

    • geoSpartial ์ธ๋ฑ์Šค ์‚ฌ์šฉํ•˜์—ฌ 2์ฐจ์› ์ขŒํ‘œ ์ธ๋ฑ์‹ฑ ๊ฐ€๋Šฅ
  • (7) collection join

    • $lookup์„ ํ†ตํ•œ collection join ๊ฐ€๋Šฅ
  • (8) B-tree๋ฅผ ์ ์šฉํ•œ ์ธ๋ฑ์‹ฑ

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– ์Šคํ‚ค๋งˆ

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์†์„ฑ, ๊ด€๊ณ„ ๋“ฑ ๋ฐ์ดํ„ฐ ๊ฐ’์ด ๊ฐ–๋Š” type์„ ๋ช…์‹œํ•œ ๊ฒƒ

6. redis

  • ์ธ๋ฉ”๋ชจ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ํ‚ค-๊ฐ’ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ ๊ธฐ๋ฐ˜์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
  • ํŠน์ง•
    • ๋ฐ์ดํ„ฐ ํƒ€์ž… : ๋ฌธ์ž์—ด(๊ธฐ๋ณธ, ์ตœ๋Œ€ 512MB๊นŒ์ง€ ์ €์žฅ), set, hash
    • pub/sub ๊ธฐ๋Šฅ
    • ์ฑ„ํŒ… ์‹œ์Šคํ…œ, ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์•ž๋‹จ์— ๋‘์–ด ์‚ฌ์šฉํ•˜๋Š” ์บ์‹ฑ ๊ณ„์ธต. ๋‹จ์ˆœํ•œ ํ‚ค ๊ฐ’์ด ํ•„์š”ํ•œ ์„ธ์…˜ ์ •๋ณด ๊ด€๋ฆฌ, ์ •๋ ฌ๋œ set ์ž๋ฃŒ ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•œ ์‹ค์‹œ๊ฐ„ ์ˆœ์œ„ํ‘œ ์„œ๋น„์Šค์— ์‚ฌ์šฉ

๐Ÿ“• ์Šคํ† ๋ฆฌ์ง€์—”์ง„ (= Database Engine)

1. Storage Engine ์ •์˜

  • DBMS๊ฐ€ DB์— ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…/์ถ”์ถœ/์—…๋ฐ์ดํŠธ/์‚ญ์ œ์‹œ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋ณธ ์†Œํ”„ํŠธ์›จ์–ด ์ปดํฌ๋„ŒํŠธ
  • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : MySQL์—์„œ ํ…Œ์ด๋ธ” ์ƒ์„ฑํ•˜๋ฉด, ์‹ค์ œ๋กœ ์„œ๋ฒ„์ƒ์—๋Š” .frm ํŒŒ์ผ ์ƒ์„ฑ๋จ
    • ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์ด.frm ํŒŒ์ผ์— ์ ‘๊ทผํ•˜๋Š” ์†์„ฑ ์„ค์ •ํ•จ
  • DBMS๋Š” ๋™์ผํ•œ DB ๋‚ด์— ๋‹ค์ค‘ ์ €์žฅ ์—”์ง„ ์ง€์›
    • ๋™์ผ DB์˜ ํ…Œ์ด๋ธ”๋งˆ๋‹ค ๋‹ค๋ฅด๊ฒŒ ์ง€์ • ๊ฐ€๋Šฅ (MyISAM or InnoDB)

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– Stroge Engine ์—ญํ• 

  • transaction manager : ํŠธ๋žœ์žญ์…˜ ์Šค์ผ€์ค„๋ง ๋ฐ DB ์ƒํƒœ์˜ ๋…ผ๋ฆฌ์  ์ผ๊ด€์„ฑ ๋ณด์žฅ
  • lock manager : ํŠธ๋žœ์žญ์…˜์—์„œ ์ ‘๊ทผํ•˜๋Š” DB ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ž ๊ธˆ ์ œ์–ด, ๋™์‹œ์„ฑ ์ œ์–ด (๋ฌด๊ฒฐ์„ฑ ๋ณด์žฅ)
  • access method : ๋””์Šคํฌ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ ‘๊ทผ ๋ฐ ์ €์žฅ ๋ฐฉ์‹ ์ •์˜ (ํž™ ํŒŒ์ผ/B-Tree/LSM ํŠธ๋ฆฌ ๋“ฑ ์ž๋ฃŒ๊ตฌ์กฐ ์‚ฌ์šฉ)
  • buffer manager : ๋ฐ์ดํ„ฐ ํŽ˜์ด์ง€๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์บ์‹œ
  • recovery manager : ๋กœ๊ทธ ์šฐ์ง€ ๊ด€๋ฆฌ, ์žฅ์•  ๋ฐœ์ƒ์‹œ ์‹œ์Šคํ…œ ๋ณต๊ตฌ

2. innoDB

  • ์™ธ๋ž˜ํ‚ค๋ฅผ ๊ฐ€์ง€๋Š” ํŠธ๋žœ์žญ์…˜ ์ง€์› ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„
  • MySQL8.0 ๊ธฐ๋ณธ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„ (MyISAM์œผ๋กœ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ)
  • ์žฅ์ 
    • ACID ํŠธ๋žœ์žญ์…˜ ์ง€์›
    • ํฐ ๊ฐ€์šฉ์„ฑ ์ œ๊ณต (๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํฌ๊ธฐ๊ฐ€ ํผ)
    • ํ–‰, ์ธ๋ฑ์Šค ์กฐํšŒ ์บ์‹ฑ : ์—”์ง„ ์ž์ฒด ๋‚ด์—์„œ ํ–‰ ์บ์‹œ์™€ ์ธ๋ฑ์Šค ์บ์‹œ ๊ฒฐํ•ฉํ•˜์—ฌ ์ˆ˜ํ–‰
    • ์ž ๊ธˆ ์ˆ˜์ค€ : ํ–‰ ์ˆ˜์ค€ ์ž ๊ธˆ ์‚ฌ์šฉ (๋†’์€ ๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ ๋ฐ ์•ˆ์ •์ )
    • ์ž๋™ ๋ฐ๋“œ๋ฝ ๊ฐ์ง€ (๊ฐ์ง€์‹œ ๋ณ€๊ฒฝ๋œ ๋ ˆ์ฝ”๋“œ๊ฐ€ ๊ฐ€์žฅ ์ž‘์€ ํŠธ๋žœ์žญ์…˜์„ rollbackํ•˜์—ฌ ๋ฐ๋“œ๋ฝ ํ’€๊ธฐ)
    • ์ž๋™ ์žฅ์•  ๋ณต๊ตฌ (์™„๋ฃŒํ•˜์ง€ ๋ชปํ•œ ํŠธ๋žœ์žญ์…˜์ด๋‚˜ ์†์ƒ๋œ ๋ฐ์ดํ„ฐ ํŽ˜์ด์ง€ ์ž๋™ ๋ณต๊ตฌ)
  • ๋‹จ์ 
    • ๋ฐ์ดํ„ฐ ์ €์žฅ ๋น„์œจ ๋‚ฎ๊ณ , ๋ฐ์ดํ„ฐ ๋กœ๋“œ ์†๋„ ๋Š๋ฆผ
  • ์‚ฌ์šฉ
    • ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ, ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ๋‹ค๋ฃฐ ๋•Œ ํŽธ๋ฆฌ
    • ๋ฐ์ดํ„ฐ ์ž…๋ ฅ ๋ฐ ์ˆ˜์ •์ด ์ž์ฃผ ์ผ์–ด๋‚˜๊ณ , ๋‹ค์ค‘ ์‚ฌ์šฉ์ž ๋ฐ ๋™์‹œ์„ฑ์ด ๋†’์€ OLTP ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ํ•ฉ

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– OLTP (์˜จ๋ผ์ธ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ)

  • ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์‹œ๊ฐ„์œผ๋กœ DB ๋ฐ์ดํ„ฐ ๊ฐฑ์‹ , ์กฐํšŒํ•˜๋Š” ๋‹จ์œ„์˜ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹
  • ๋™์‹œ์— ๋ฐœ์ƒํ•˜๋Š” ๋‹ค์ˆ˜์˜ ํŠธ๋žœ์žญ์…˜์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์œ ํ˜•
  • ์˜ˆ์‹œ : ์˜จ๋ผ์ธ ๋ฑ…ํ‚น, ์‡ผํ•‘, ์ฃผ๋ฌธ ์ž…๋ ฅ, ํ…์ŠคํŠธ ๋ฉ”์‹œ์ง€ ์ „์†ก

3. MyISAM

  • ํŠธ๋žœ์žญ์…˜์ด ์ง€์›ํ•˜์ง€ ์•Š๋Š” ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„
  • ์žฅ์ 
    • ๊ตฌ์กฐ ๋‹จ์ˆœ, ์กฐํšŒ(SELECT) ์ฟผ๋ฆฌ์‹œ ๋น ๋ฆ„ (ํ…Œ์ด๋ธ”์— ROW COUNT ์ €์žฅํ•จ)
    • ๋ฐ์ดํ„ฐ ์ €์žฅ์— ์‹ค์ œ ์ œํ•œ์ด ์—†๊ณ , ํšจ์œจ์ ์œผ๋กœ ์ €์žฅ๋จ
    • ํ–‰, ์ธ๋ฑ์Šค ์กฐํšŒ ์บ์‹ฑ : ํŒŒ์ผ ์‹œ์Šคํ…œ ๋ธ”๋ก ์บ์‹œ์— ์˜์กด
    • Full-text ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅ
  • ๋‹จ์ 
    • ์ž ๊ธˆ ์ˆ˜์ค€ : ํ…Œ์ด๋ธ” ์ˆ˜์ค€์˜ ์ž ๊ธˆ ์ œ๊ณต (ํŠน์ • ํ–‰ ์ˆ˜์ •ํ•  ๊ฒฝ์šฐ ํ…Œ์ด๋ธ” ์ „์ฒด์— Lock ๊ฑธ์–ด ๋‹ค๋ฅธ ์‚ฌ๋žŒ ์ž‘์—… ๋ชปํ•จ)
    • ํŠธ๋žœ์žญ์…˜์ด ์—†์–ด ์ž‘์—…๋„์ค‘ ๋ฌธ์ œ ์ƒ๊ฒจ๋„ DB์— ์ €์žฅ๋จ (๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ๋ณด์žฅX)
  • ์‚ฌ์šฉ
    • ํŠธ๋žœ์žญ์…˜ ํ•„์š” ์—†๊ณ , ์กฐํšŒ๊ธฐ๋Šฅ ๋งŽ์„ ๋•Œ ํŽธ๋ฆฌ
    • ์ •์ ์ธ ๋ฐ์ดํ„ฐ ์ €์žฅํ•˜๊ณ , ์ž์ฃผ ์ฝ๊ธฐ ์ž‘์—… ์ผ์–ด๋‚  ๊ฒฝ์šฐ ์ ํ•ฉ

4. wiredtiger

  • MongoDB์˜ ๊ธฐ๋ณธ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„
  • LSMTree(๋กœ๊ทธ ๊ธฐ๋ฐ˜ ๋ณ‘ํ•ฉํŠธ๋ฆฌ) ์ด์šฉ
  • ํŠน์ง•
    • ๋Š๋ฆฐ ์ฝ๊ธฐ ์„ฑ๋Šฅ (๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋ธ”๋ฃธ ํ•„ํ„ฐ ์‚ฌ์šฉ)
    • ์ €์žฅ ์„ฑ๋Šฅ ํ–ฅ์ƒ
    • ์ฒดํฌํฌ์ธํŠธ
      • 60์ดˆ ๊ฐ„๊ฒฉ์œผ๋กœ ์ƒ์„ฑ
      • ์ƒˆ๋กœ์šด ์ฒดํฌํฌ์ธํŠธ ์ž‘์„ฑํ•˜๋Š” ๋™์•ˆ ์˜ค๋ฅ˜ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ์ด์ „ ์ฒดํฌํฌ์ธํŠธ์—์„œ ๋ณต๊ตฌ ๊ฐ€๋Šฅ
    • ์ €๋„๋ง (๋กœ๊ทธ)
      • ์ฒดํฌํฌ์ธํŠธ ๊ฐ„์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์ˆ˜์ • ์‚ฌํ•ญ ์œ ์ง€
      • ์ฒดํฌํฌ์ธํŠธ ์‚ฌ์ด์— ์ข…๋ฃŒ๋˜๋ฉด ์ €๋„์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งˆ์ง€๋ง‰ ์ฒดํฌํฌ์ธํŠธ ์ดํ›„ ์ˆ˜์ •๋œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์žฌ์ƒ์‚ฐ ๊ฐ€๋Šฅ
    • ์••์ถ•
      • WiredTiger ํ†ตํ•ด ๋ชจ๋“  ์ปฌ๋ ‰์…˜ ๋ฐ ์ธ๋ฑ์Šค ์••์ถ• ์ง€์›
    • ๋ฉ”๋ชจ๋ฆฌ
      • ์•ฝ 50% ๋ฉ”๋ชจ๋ฆฌ ์ฐจ์ง€
      • RAM ์ตœ์†Œ 256MB ํ•„์š”
      • ๐Ÿ—’๏ธ ์˜ˆ์‹œ :4GM์˜ RAM์ด ์žˆ๋Š” ์‹œ์Šคํ…œ
      • WiredTiger ์บ์‹œ = 1.5GB ์‚ฌ์šฉ (0.5 * (4GB - 1GB) = 1.5GB)

๐Ÿ“• ์ธ๋ฑ์Šค

1. index ๊ฐœ๋…

  • ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ์žฅ์น˜
  • DBMS๋„ DB ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•ด์„œ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋น ๋ฅด๊ฒŒ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด, ์นผ๋Ÿผ์˜ ๊ฐ’๊ณผ ํ•ด๋‹น ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ €์žฅ๋œ ์ฃผ์†Œ๋ฅผ ํ‚ค์™€ ๊ฐ’์˜ ์Œ์œผ๋กœ ์ธ๋ฑ์Šค ์ƒ์„ฑ
  • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : ์ฑ…์˜ ๋งˆ์ง€๋ง‰ ์žฅ์— ์žˆ๋Š” ์ฐพ์•„๋ณด๊ธฐ
    • ์ฑ…์˜ ๋ณธ๋ฌธ ์†์— ์ฐพ๊ณ ์ž ํ•˜๋Š” ํ•ญ๋ชฉ ์„ ๋น ๋ฅด๊ฒŒ ์ฐพ์Œ
    • ์ธ๋ฑ์Šค๋ฅผ ์„ค์ •ํ•˜๋ฉด ํ…Œ์ด๋ธ” ์•ˆ์—์„œ ๋ฐ์ดํ„ฐ ๋น ๋ฅด๊ฒŒ ์ฐพ๊ธฐ ๊ฐ€๋Šฅ

2. index ๊ตฌ์กฐ

  • ๊ท ํ˜•์žกํžŒ B-Tree ๊ธฐ๋ฐ˜ ๊ตฌ์ถ•
    • (ํŠธ๋ฆฌ ์ƒ์„ฑ์‹œ) ๋Œ€์ˆ˜ํ™•์žฅ์„ฑ ํŠน์ง•์œผ๋กœ ๋น ๋ฅด๊ฒŒ ์ฐพ๊ธฐ ๊ฐ€๋Šฅ
  • ํƒ์ƒ‰ ์‹œ๊ฐ„ : ํ‰๊ท  O(log N)

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– ๋Œ€์ˆ˜ํ™•์žฅ์„ฑ

  • โœ๏ธ ๊ฐœ๋…
    • ํŠธ๋ฆฌ ๊นŠ์ด๊ฐ€ ๋ฆฌํ”„ ๋…ธ๋“œ ์ˆ˜์— ๋น„ํ•ด ๋งค์šฐ ๋Š๋ฆฌ๊ฒŒ ์„ฑ์žฅํ•จ
    • ์ธ๋ฑ์Šค๊ฐ€ 1 ๊นŠ์ด์”ฉ ์ฆ๊ฐ€ โžก๏ธ ์ตœ๋Œ€ ์ธ๋ฑ์Šค ํ•ญ๋ชฉ์˜์ˆ˜๋Š” 4๋ฐฐ์”ฉ ์ฆ๊ฐ€

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– ๊นŠ์ด

  • ๋ฃจํŠธ ๋…ธ๋“œ๋กœ๋ถ€ํ„ฐ ํŠน์ • ๋…ธ๋“œ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ
  • ํŠธ๋ฆฌ์—์„œ์˜ ๊นŠ์ด๋Š” ๋…ธ๋“œ๋งˆ๋‹ค ๋‹ค๋ฆ„

3. B-Tree

  • ์ด์ง„ ํŠธ๋ฆฌ๋ฅผ ํ™•์žฅํ•ด ํ•˜๋‚˜์˜ ๋…ธ๋“œ๊ฐ€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์ž์‹ ๋…ธ๋“œ์˜ ์ตœ๋Œ€ 2๋ณด๋‹ค ํฐ ํŠธ๋ฆฌ ๊ตฌ์กฐ (๊ท ํ˜• ์žกํžŒ ํŠธ๋ฆฌ)
  • ์นผ๋Ÿผ์˜ ๊ฐ’์„ ๋ณ€ํ˜•ํ•˜์ง€ ์•Š๊ณ , ์›๋ž˜์˜ ๊ฐ’์„ ์ด์šฉํ•˜์—ฌ ์ธ๋ฑ์‹ฑํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ๊ตฌ์„ฑ
    • ๋ฃจํŠธ ๋…ธ๋“œ
    • ๋ฆฌํ”„ ๋…ธ๋“œ
    • ๋ธŒ๋žœ์น˜ ๋…ธ๋“œ
  • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : E ์ฐพ์„ ๊ฒฝ์šฐ
    • ํ…Œ์ด๋ธ” ์ „์ฒด ํƒ์ƒ‰x
    • E๊ฐ€ ์žˆ์„ ๋ฒ•ํ•œ ๋ฆฌํ”„ ๋…ธ๋“œ๋ฅผ ํ†ตํ•ด ํƒ์ƒ‰
    • ๋…ธ๋“œ๋ฅผ ๋‚˜๋ˆ  5๋ฒˆ โžก๏ธ 2๋ฒˆ๋งŒ์— ํƒ์ƒ‰ ๊ฐ€๋Šฅ
  • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : ํ‚ค 57 ์ฐพ์„ ๊ฒฝ์šฐ
    • ๋ฃจํŠธ ๋…ธ๋“œ โžก๏ธ ๋ธŒ๋žœ์น˜ ๋…ธ๋“œ โžก๏ธ ๋ฆฌํ”„ ๋…ธ๋“œ ์ˆœ์œผ๋กœ ํƒ์ƒ‰
    • 57๋ณด๋‹ค ๊ฐ™๊ฑฐ๋‚˜ ํด ๋•Œ๊นŒ์ง€ <= ๊ธฐ๋ฐ˜ ๊ฒ€์ƒ‰
    • ๋งˆ์ง€๋ง‰ ๋ฆฌํ”„ ๋…ธ๋“œ์— ๋„๋‹ฌํ•˜์—ฌ 57 ๋ฐ์ดํ„ฐ ํฌ์ธํ„ฐ๋ฅผ ํ†ตํ•ด ๊ฒฐ๊ด๊ฐ’ ๋ฐ˜ํ™˜

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– Hash ์ธ๋ฑ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • ์นผ๋Ÿผ์˜ ๊ฐ’์œผ๋กœ ํ•ด์‹œ ๊ฐ’์„ ๊ณ„์‚ฐํ•ด์„œ ์ธ๋ฑ์‹ฑํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ (๊ฐ’์„ ๋ณ€ํ˜•)
  • ๋งค์šฐ ๋น ๋ฅธ ๊ฒ€์ƒ‰ ์ง€์›
  • ํŠน์ • ๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฐ’์œผ๋กœ ๊ฒ€์ƒ‰์„ ํ•˜๋Š” ์ „๋ฐฉ ์ผ์น˜ ๋“ฑ ๊ฐ’์˜ ์ผ๋ถ€๋งŒ ๊ฒ€์ƒ‰ํ•˜๊ณ ์ž ํ•  ๋•Œ๋Š” ์‚ฌ์šฉ ๋ถˆ๊ฐ€
  • ๋ฉ”๋ชจ๋ฆฌ ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋งŽ์ด ์‚ฌ์šฉ
  • ๋“ฑํ˜ธ(=)์—ฐ์‚ฐ์ด ์•„๋‹Œ ๋ถ€๋“ฑํ˜ธ ์—ฐ์‚ฐ์˜ ๊ฒฝ์šฐ ๋ฌธ์ œ ๋ฐœ์ƒ

4. ์ตœ์ ํ™” ๊ธฐ๋ฒ•

  • ์ตœ์ ํ™” ๊ธฐ๋ฒ•์€ DB๋งˆ๋‹ค ๋‹ค๋ฅด์ง€๋งŒ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋Š” ์œ ์‚ฌํ•จ (MongoDB ๊ธฐ์ค€์œผ๋กœ ์„ค๋ช…)

  • (1) ์ธ๋ฑ์Šค = ๋น„์šฉ

    • ์ธ๋ฑ์Šค๋Š” 2๋ฒˆ ํƒ์ƒ‰ํ•˜๋„๋ก ๊ฐ•์š”
    • index list โžก๏ธ collection ์ˆœ์œผ๋กœ ํƒ์ƒ‰ (๊ด€๋ จ ์ฝ๊ธฐ ๋น„์šฉ ๋ฐœ์ƒ)
    • โž• collection ์ˆ˜์ •์‹œ index๋„ ์ˆ˜์ • ํ•„์š”
    • โž• B-Tree ๋†’์ด ๊ท ํ˜• ์กฐ์ ˆ ๋น„์šฉ
    • collection ์–‘ ๋งŽ์„์ˆ˜๋ก ์ธ๋ฑ์Šค ์‚ฌ์šฉ์‹œ ๋น„ํšจ์œจ์ 
  • (2) ํ•ญ์ƒ ํ…Œ์ŠคํŒ… ํ•„์ˆ˜

    • ์ธ๋ฑ์Šค ์ตœ์ ํ™” ๊ธฐ๋ฒ•์€ ์„œ๋น„์Šค ํŠน์ง•(๊ฐ์ฒด์˜ ๊นŠ์ด, ํ…Œ์ด๋ธ”์˜ ์–‘ ๋“ฑ)์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง
    • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : MySQL ํ…Œ์ŠคํŒ… ๋ฐฉ๋ฒ•
    EXPLAIN
    SELE
  • (3) ๋ณตํ•ฉ ์ธ๋ฑ์Šค๋Š” ๊ฐ™์Œ > ์ •๋ ฌ > ๋‹ค์ค‘ ๊ฐ’ > ์นด๋””๋„๋ฆฌํ‹ฐ ์ˆœ์„œ

    • ์—ฌ๋Ÿฌ ํ•„๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์กฐํšŒ์‹œ ๋ณตํ•ฉ ์ธ๋ฑ์Šค ์ƒ์„ฑํ•˜๋Š”๋ฐ, ์ƒ์„ฑ ์ˆœ์„œ์— ๋”ฐ๋ผ ์ธ๋ฑ์Šค ์„ฑ๋Šฅ ๋‹ฌ๋ผ์ง
    • ๊ฐ™์Œ์„ ๋น„๊ต(== ํ˜น์€ equal)ํ•˜๋Š” ์ฟผ๋ฆฌ ๋จผ์ € ์ธ๋ฑ์Šค๋กœ ์„ค์ •
    • ์ •๋ ฌ์— ์“ฐ๋Š” ํ•„๋“œ ๊ทธ ๋‹ค์Œ ์ธ๋ฑ์Šค๋กœ ์„ค์ •
    • ๋‹ค์ค‘ ๊ฐ’ ์ถœ๋ ฅํ•ด์•ผ ํ•˜๋Š” ํ•„๋“œ(> ํ˜น์€ < ๋“ฑ ๋งŽ์€ ๊ฐ’ ์ถœ๋ ฅํ•ด์•ผ ํ•˜๋Š” ์ฟผ๋ฆฌ์— ์“ฐ๋Š” ํ•„๋“œ) ๋‚˜์ค‘์— ์ธ๋ฑ์Šค๋กœ ์„ค์ •
    • ์นด๋””๋„๋ฆฌํ‹ฐ ๋†’์€ ์ˆœ์„œ๋กœ ์ธ๋ฑ์Šค ์ƒ์„ฑ
      • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : age์™€ email ํ•„๋“œ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ
      • email ์นด๋””๋„๋ฆฌํ‹ฐ(๊ฐ’์˜ ์œ ๋‹ˆํฌํ•œ ์ •๋„) ๋†’์œผ๋‹ˆ ๋จผ์ € ์ธ๋ฑ์Šค ์ƒ์„ฑ

5. clustered index ์™€ non-clustered index ์ฐจ์ด

  • ํด๋Ÿฌ์Šคํ„ฐํ˜• ์ธ๋ฑ์Šค

    • ๊ธฐ๋ณธํ‚ค ๊ฐ’์ด ๋น„์Šทํ•œ ๋ ˆ์ฝ”๋“œ๋ผ๋ฆฌ ๋ฌถ์–ด์„œ ์ €์žฅํ•˜๋Š” ๊ฒƒ
      • ๊ธฐ๋ณธํ‚ค ๊ฐ’์— ์˜ํ•ด ๋ ˆ์ฝ”๋“œ ์ €์žฅ ์œ„์น˜๊ฐ€ ๊ฒฐ์ •
      • ๊ธฐ๋ณธํ‚ค ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋ ˆ์ฝ”๋“œ์˜ ๋ฌผ๋ฆฌ์ ์ธ ์ €์žฅ ์œ„์น˜ ๋˜ํ•œ ๋ณ€๊ฒฝ๋˜์–ด์•ผํ•จ
    • ๋ณดํ†ต ํ…Œ์ด๋ธ”์˜ ๊ธฐ๋ณธํ‚ค๋กœ ์„ค์ • (์œ ์ผ์„ฑ, ์ตœ์†Œ์„ฑ ๋งŒ์กฑ)
    • ํ…Œ์ด๋ธ”๋‹น 1๊ฐœ
    • ๋ฐ์ดํ„ฐํŽ˜์ด์ง€๊ฐ€ ์ •๋ ฌ๋˜์–ด ์ €์žฅ, ์ธ๋ฑ์Šค ํŽ˜์ด์ง€์˜ ๋ฆฌํ”„๋…ธ๋“œ์— "๋ฐ์ดํ„ฐ ํŽ˜์ด์ง€" ์ €์žฅ (ํƒ์ƒ‰ ๋น ๋ฆ„)
    • ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค ํ…Œ์ด๋ธ” ์ •๋ ฌ ํ•„์š” (์‚ฝ์ž…/์‚ญ์ œ/์ˆ˜์ • ๋Š๋ฆผ)
    • ์ธ๋ฑ์Šค์˜ ์ˆœ์„œ์™€ ๋ฐ์ดํ„ฐ ์ˆœ์„œ๊ฐ€ ์ผ์น˜ํ•จ
  • ํด๋Ÿฌ์Šคํ„ฐํ˜• ์ธ๋ฑ์Šค ์ƒ์„ฑ ๋ฐฉ๋ฒ•

    • primary key : ํด๋Ÿฌ์Šคํ„ฐํ˜• ์ธ๋ฑ์Šค
    • alter table add primary key
  • ๋ณด์กฐ์ธ๋ฑ์Šค

    • ์ธ๋ฑ์Šค๋กœ ์„ค์ •ํ•˜๋Š” ํ•„๋“œ์˜ ์†์„ฑ์ด ์ค‘์š”
      • title, author ์ˆœ์„œ๋กœ ์ธ๋ฑ์Šค ์„ค์ •ํ•  ๊ฒฝ์šฐ SELECT ์งˆ์˜์— ๋”ฐ๋ผ ์ƒ์„ฑ ํšจ๊ณผ ๋‹ฌ๋ผ์ง
      • title SEARCH์‹œ index ์ƒ์„ฑ ํšจ๊ณผ ์žˆ์ง€๋งŒ, author๋งŒ์œผ๋กœ SEARCH์‹œ index ํšจ๊ณผ ์—†์Œ
    • ํด๋Ÿฌ์Šคํ„ฐํ˜•ํ‚ค๊ฐ€ ๋ณตํ•ฉํ‚ค๊ฐ€ ๋  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ณดํ†ต ๋ณด์กฐ์ธ๋ฑ์Šค๋กœ ๋ณตํ•ฉํ‚ค ์‚ฌ์šฉ
    • ํ…Œ์ด๋ธ”๋‹น ์—ฌ๋Ÿฌ๊ฐœ
    • ์ธ๋ฑ์Šค ํŽ˜์ด์ง€ ๋ฆฌํ”„๋…ธ๋“œ์— ์‹ค์ œ ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹Œ ๋ฐ์ดํ„ฐ ํŽ˜์ด์ง€์— ๊ด€๋ จ๋œ ํฌ์ธํ„ฐ ์ €์žฅ
    • ์ •๋ ฌ๋˜์–ด ์žˆ์ง€ ์•Š์Œ (ํƒ์ƒ‰ ๋Š๋ฆฌ๊ณ , ์‚ฝ์ž…/์‚ญ์ œ/์ˆ˜์ • ๋น ๋ฆ„)
    • ์ธ๋ฑ์Šค์˜ ์ˆœ์„œ์™€ ๋ฐ์ดํ„ฐ ์ˆœ์„œ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์Œ
  • ๋ณด์กฐ ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•

    • ๋ฌด์กฐ๊ฑด primary key๋กœ ์„ค์ •ํ•œ๋‹ค๊ณ  ํ•ด์„œ ํด๋Ÿฌ์Šคํ„ฐํ˜• ์ธ๋ฑ์Šค๋กœ ์„ค์ •๋˜์ง€X
    • create index ..
      alter table add index

6. MongoDB, Node.js ์„ค์น˜

  • (1) MongoDB ์„ค์น˜

  • (2) Node.js ์„ค์น˜

  • (3) mongoose ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜ : Node.jsํ™˜๊ฒฝ์—์„œ MongoDB์— ์ ‘์†ํ•˜๊ธฐ ์œ„ํ•œ ์—ญํ• 

npm install mongoose
  • (4) ์‹คํ–‰
node mongo_index.js

๐Ÿ“• ์กฐ์ธ

1. join ๊ฐœ๋…

  • 2๊ฐœ ์ด์ƒ์˜ ํ…Œ์ด๋ธ”์„ ๋ฌถ์–ด ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ ์ถ”์ถœ

  • ์ข…๋ฅ˜

    • (1) ๋‚ด๋ถ€ ์กฐ์ธ (inner join)

      • ์™ผ์ชฝ/์˜ค๋ฅธ์ชฝ ์ผ์น˜ํ•˜๋Š” ํ–‰๋งŒ ํ‘œ๊ธฐ (๊ต์ง‘ํ•ฉ)
      • ๋‘ ํ…Œ์ด๋ธ”์— ๋ชจ๋‘ ์ง€์ •ํ•œ ์—ด์˜ ๋ฐ์ดํ„ฐ ์กด์žฌํ•ด์•ผ ํ•จ
        SELECT <์—ด ๋ชฉ๋ก>
        				 FROM <์ฒซ ๋ฒˆ์งธ ํ…Œ์ด๋ธ”>
        		INNER JOIN <๋‘ ๋ฒˆ์งธ ํ…Œ์ด๋ธ”>
        ON <์กฐ์ธ ์กฐ๊ฑด>
        				[WHERE ๊ฒ€์ƒ‰ ์กฐ๊ฑด]
        				#INNER JOIN์„ JOIN์ด๋ผ๊ณ ๋งŒ ์จ๋„ INNER JOIN์œผ๋กœ ์ธ์‹ํ•ฉ๋‹ˆ๋‹ค.
    • (2) ์™ผ์ชฝ ์กฐ์ธ (left outer join)

      • ์™ผ์ชฝ ํ…Œ์ด๋ธ” ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ” ์ผ์น˜ํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๋กœ ์ง‘ํ•ฉ ์ƒ์„ฑ
      • ์˜ค๋ฅธ์ชฝ์— ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์ด ์—†์„ ๊ฒฝ์šฐ null
    • (3) ์˜ค๋ฅธ์ชฝ ์กฐ์ธ (right outer join)

      • ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ” ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ ํ…Œ์ด๋ธ” ์ผ์น˜ํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๋กœ ์ง‘ํ•ฉ ์ƒ์„ฑ
      • ์™ผ์ชฝ์— ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์ด ์—†์„ ๊ฒฝ์šฐ null
    • (4) ํ•ฉ์ง‘ํ•ฉ ์กฐ์ธ (full outer join)

      • ์–‘์ชฝ ํ…Œ์ด๋ธ”์—์„œ ์ผ์น˜ํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๋กœ ์ง‘ํ•ฉ ์ƒ์„ฑ
      • ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์ด ์—†์„ ๊ฒฝ์šฐ ๋ˆ„๋ฝ๋œ ์ชฝ์— null ๊ฐ’ ํฌํ•จ๋˜์–ด ์ถœ๋ ฅ
    • ์™ธ๋ถ€ ์กฐ์ธ (outer join)

      • ๋‘ ํ…Œ์ด๋ธ”์„ ์กฐ์ธํ•  ๋•Œ, 1๊ฐœ์˜ ํ…Œ์ด๋ธ”์—๋งŒ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์–ด๋„ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ด
      			SELECT <์—ด ๋ชฉ๋ก>
      			FROM <์ฒซ ๋ฒˆ์งธ ํ…Œ์ด๋ธ”(LEFT ํ…Œ์ด๋ธ”)>
       <LEFT | RIGHT | FULL> OUTER JOIN <๋‘ ๋ฒˆ์งธ ํ…Œ์ด๋ธ”(RIGHT ํ…Œ์ด๋ธ”)>
        ON <์กฐ์ธ ์กฐ๊ฑด>
      			[WHERE ๊ฒ€์ƒ‰ ์กฐ๊ฑด]
    • ์ƒํ˜ธ ์กฐ์ธ (cross join)

      • ํ•œ ์ชฝ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ํ–‰๊ณผ ๋‹ค๋ฅธ ์ชฝ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ํ–‰์„ ์กฐ์ธ
      SELECT *
      			FROM <์ฒซ ๋ฒˆ์งธ ํ…Œ์ด๋ธ”>
      CROSS JOIN <๋‘ ๋ฒˆ์งธ ํ…Œ์ด๋ธ”>
    • ์ž์ฒด ์กฐ์ธ (self join)

      • ์ž์‹ ์ด ์ž์‹ ๊ณผ ์กฐ์ธํ•œ ์˜๋ฏธ๋กœ, 1๊ฐœ์˜ ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•จ
      SELECT <์—ด ๋ชฉ๋ก>
      			FROM <ํ…Œ์ด๋ธ”> ๋ณ„์นญA
      INNER JOIN <ํ…Œ์ด๋ธ”> ๋ณ„์นญB
      			[WHERE ๊ฒ€์ƒ‰ ์กฐ๊ฑด]

  • SQL Join Visualizer ์ด์šฉํ•˜์—ฌ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‹คํ–‰ ๊ฐ€๋Šฅ

2. ์ค‘์ฒฉ ๋ฃจํ”„ ์กฐ์ธ, ์ •๋ ฌ ๋ณ‘ํ•ฉ ์กฐ์ธ, ํ•ด์‹œ ์กฐ์ธ ์ฐจ์ด์ 

  • ์ค‘์ฒฉ ๋ฃจํ”„ ์กฐ์ธ (NLJ, Nested Loop Join)
    • ์ค‘์ฒฉ for๋ฌธ๊ฐ™์€ ์›๋ฆฌ๋กœ ์กฐ์ธ
    • ๋žœ๋ค ์ ‘๊ทผ์— ๋Œ€ํ•œ ๋น„์šฉ ์ฆ๊ฐ€ (๋Œ€์šฉ๋Ÿ‰ ํ…Œ์ด๋ธ”์—์„œ ์‚ฌ์šฉX)
    • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : t1, t2 ํ…Œ์ด๋ธ” ์กฐ์ธํ•  ๊ฒฝ์šฐ
      • ์ฒซ ๋ฒˆ์งธ ํ…Œ์ด๋ธ”์—์„œ ํ–‰์„ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์”ฉ ์ฝ๊ณ ,
      • ๊ทธ ๋‹ค์Œ ํ…Œ์ด๋ธ”์—์„œ๋„ ํ–‰์„ ํ•˜๋‚˜์”ฉ ์ฝ์€ ํ›„
      • ์กฐ๊ฑด์— ๋งž๋Š” ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฐพ์•„ ๊ฒฐ๊ณผ๊ฐ’ ๋ฐ˜ํ™˜
    • ๋ธ”๋ก ์ค‘์ฒฉ ๋ฃจํ”„ ์กฐ์ธ (BNL, Block Neted Loop) : ์กฐ์ธํ•  ํ…Œ์ด๋ธ”์„ ์ž‘์€ ๋ธ”๋ก์œผ๋กœ ๋‚˜๋ˆ  ๋ธ”๋ก ํ•˜๋‚˜์”ฉ ์กฐ์ธ
  • ์ •๋ ฌ ๋ณ‘ํ•ฉ ์กฐ์ธ
    • ๊ฐ ํ…Œ์ด๋ธ”์„ ์กฐ์ธํ•  ํ•„๋“œ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ ํ›„ ์กฐ์ธ ์ž‘์—… ์ˆ˜ํ–‰
    • ์กฐ์ธํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ ์ ˆํ•œ ์ธ๋ฑ์Šค๊ฐ€ ์—†์„ ๊ฒฝ์šฐ, ๋Œ€์šฉ๋Ÿ‰ ํ…Œ์ด๋ธ” ์กฐ์ธํ•  ๊ฒฝ์šฐ ์‚ฌ์šฉ
    • <, > ์กฐ๊ฑด์— ๋งŽ์ด ์“ฐ์ž„
  • ํ•ด์‹œ ์กฐ์ธ
    • ํ•ด์‹œ ํ…Œ์ด๋ธ” ๊ธฐ๋ฐ˜์œผ๋กœ ์กฐ์ธ
    • 2๊ฐœ ํ…Œ์ด๋ธ” ์กฐ์ธ์‹œ 1๊ฐœ์˜ ํ…Œ์ด๋ธ”์ด ๋ฉ”๋ชจ๋ฆฌ์— ์˜จ์ „ํžˆ ๋“ค์–ด๊ฐ€๋ฉด ์ค‘์ฒฉ ๋ฃจํ”„ ์กฐ์ธ๋ณด๋‹ค ํšจ์œจ์ 
    • 2๊ฐœ ํ…Œ์ด๋ธ” ์กฐ์ธ์‹œ ๋ฐ”์ดํŠธ์ƒ ๋” ์ž‘์€ ํ…Œ์ด๋ธ”์„ ํ•ด์‹œํ…Œ์ด๋ธ”๋กœ ๋งŒ๋“ค์–ด ์กฐ์ธ
    • == ์กฐ๊ฑด(๋™๋“ฑ ์กฐ๊ฑด)์—๋งŒ ์‚ฌ์šฉ
    • MySQL์˜ ํ•ด์‹œ ์กฐ์ธ ๋‹จ๊ณ„ : ๋นŒ๋“œ ๋‹จ๊ณ„ / ํ”„๋กœ๋ธŒ ๋‹จ๊ณ„๋กœ ๋‚˜๋‰จ
      • ๋นŒ๋“œ ๋‹จ๊ณ„ : ์ž…๋ ฅ ํ…Œ์ด๋ธ” ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด ํ•ด์‹œ ํ…Œ์ด๋ธ” ๋นŒ๋“œํ•จ (์กฐ์ธ์— ์‚ฌ์šฉ๋˜๋Š” ํ•„๋“œ๊ฐ€ ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ํ‚ค๋กœ ์‚ฌ์šฉ๋จ)
      • ํ”„๋กœ๋ธŒ ๋‹จ๊ณ„ : ๋ ˆ์ฝ”๋“œ ์ฝ๊ธฐ ์‹œ์ž‘ํ•˜๊ณ , ์ผ์น˜ํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฐพ์•„ ๊ฒฐ๊ณผ๊ฐ’์œผ๋กœ ๋ฐ˜ํ™˜ (ํ•ด์‹œ ํ•จ์ˆ˜ > ํ•ด์‹œ๊ฐ’ > ๋งค์นญ๋ ˆ์ฝ”๋“œ)

๐Ÿ“• ๋ฐ๋“œ๋ฝ

1. deadlock ๊ฐœ๋…

  • DB์—์„œ ๊ต์ฐฉ ์ƒํƒœ : 2๊ฐœ ์ด์ƒ์˜ ํŠธ๋žœ์žญ์…˜์ด ์„œ๋กœ ์ž ๊ธˆ์„ ํฌ๊ธฐํ•˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ƒํƒœ

  • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : accountsํ…Œ์ด๋ธ”๊ณผ orderํ…Œ์ด๋ธ”์ด ์žˆ์„ ๊ฒฝ์šฐ

    • transaction A : accountsํ…Œ์ด๋ธ”์˜ ์ผ๋ถ€ ํ–‰์— ์ž ๊ธˆ์„ ๊ฑด ์ƒํƒœ๋กœ orderํ…Œ์ด๋ธ” ์ผ๋ถ€ ํ–‰์„ ์—…๋ฐ์ดํŠธํ•˜๋ฉด ์™„๋ฃŒ
    • transaction B : orderํ…Œ์ด๋ธ” ์ž ๊ธˆํ•œ ์ƒํƒœ๋กœ accountsํ…Œ์ด๋ธ”ํ•ญ๋ชฉ์ด ํ•„์š”
    • ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ค‘๋‹จํ•˜์ง€ ์•Š๋Š” ํ•œ ๋ชจ๋“  ํ™œ๋™ ์ค‘๋‹จ๋˜๋Š” ์ƒํƒœ

2. ๊ต์ฐฉ์ƒํƒœ ๊ฐ์ง€

  • ๋Œ€๊ทœ๋ชจ DB์˜ ๊ฒฝ์šฐ ๊ฐ์ง€ํ•  ๊ฒฝ์šฐ ๋น„์šฉ ๋งŽ์ด ๋ฐœ์ƒ -> ๊ต์ฐฉ์ƒํƒœ ๋ฐฉ์ง€ ์‚ฌ์šฉ

  • (1) ๊ต์ฐฉ์ƒํƒœ ๊ฐ์ง€ ๋ฐ timeout

    • ์ผ์ • ์‹œ๊ฐ„(timeout)์ดํ›„ ํŠธ๋žœ์žญ์…˜์ด ์‹คํ–‰๋˜์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ ๋กค๋ฐฑ
  • (2) ๊ทธ๋ž˜ํ”„ ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ์ดํด ํƒ์ƒ‰

    • ๊ทธ๋ž˜ํ”„ ๋‚ด์— ์‚ฌ์ดํด ํ˜•์„ฑ๋  ๊ฒฝ์šฐ ๊ต์ฐฉ์ƒํƒœ ๋ฐœ์ƒ ๊ฐ€๋Šฅ

3. ๊ต์ฐฉ์ƒํƒœ ๋ฐฉ์ง€

  • ์ตœ๋Œ€ํ•œ ๊ต์ฐฉ์ƒํƒœ๊ฐ€ ์ผ์–ด๋‚˜์ง€ ์•Š๋„๋ก ๋ฐฉ์ง€

  • (1) ๊ฒฉ๋ฆฌ์ˆ˜์ค€ ๋ณ€๊ฒฝ

    • ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์„ ํ–‰ ์ˆ˜์ค€ ์ž ๊ธˆ ๋˜๋Š” ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์„ ์กฐ์ •ํ•จ
    • serializable์ด ์•„๋‹Œ ์ด์ƒ ๋ชจ๋“  ๊ต์ฐฉ์ƒํ…Œ ์™„์ „ํžˆ ์ œ๊ฑฐ ๋ถˆ๊ฐ€
  • (2) ์„œ๋น„์Šค์˜ ๋กœ์ง์„ ๊ต์ฐจ๋˜์ง€ ์•Š๊ฒŒ ์ˆ˜์ •

    • ์„œ๋น„์Šค์˜ ๋…ผ๋ฆฌ ๊ตฌ์กฐ ๋ณ€๊ฒฝ
    • accounts > order ์ฒ˜๋Ÿผ ์„œ๋กœ ๊ต์ฐจ๋˜์ง€ ์•Š๊ณ  ์ผ๊ด€์„ฑ ์žˆ๋„๋ก ๋ณ€๊ฒฝ
  • (3) wait-die ๋˜๋Š” wound wait ๋ฐฉ๋ฒ•

    • ํƒ€์ž„์Šคํƒฌํ”„ ๊ธฐ๋ฐ˜์œผ๋กœ ํŠธ๋žœ์žญ์…˜์„ ๋Œ€๊ธฐ/์„ ์ /์ข…๋ฃŒํ•˜๋Š” ๋ฐฉ์‹
    • Wait-Die ๋ฐฉ์‹ (ํŠธ๋žœ์žญ์…˜ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•œ ๋น„์„ ์ ๊ธฐ๋ฒ•)
    • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : ํŠธ๋žœ์žญ์…˜ T5, T10, T15์— ๊ฐ๊ฐ ํƒ€์ž„์Šคํƒฌํ”„ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •
      • T5 -> T10 ๋ณด์œ ํ•œ ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ ์š”์ฒญ์‹œ : T5 ๋Œ€๊ธฐ
      • T15 -> T10 ๋ณด์œ ํ•œ ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ ์š”์ฒญ์‹œ : T15 ์ฃฝ์Œ
    • Wound-Wait (๊ต์ฐฉ์ƒํƒœ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•œ ์„ ์  ๊ธฐ๋ฒ•)
    • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : ํŠธ๋žœ์žญ์…˜ T5, T10, T15์— ๊ฐ๊ฐ ํƒ€์ž„์Šคํƒฌํ”„ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •
      • T5 -> T10 ๋ณด์œ ํ•œ ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ ์š”์ฒญ์‹œ : T10 (๊ฐ•์ œ) ์„ ์  ๋ฐ ์ผ์‹œ ์ค‘๋‹จ
      • T15 -> T10 ๋ณด์œ ํ•œ ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ ์š”์ฒญ์‹œ : T15 ๋Œ€๊ธฐ

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– TIMESTAMP

  • ํƒ€์ž„์Šคํƒฌํ”„ ๊ฐ’์€ 1970-01-01 00:00:01 UTC ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ์ดˆ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋ƒ„

๐Ÿ“• ์ •๊ทœํ™”

1. ์ •๊ทœํ™” ๊ณผ์ •

  • ๋ฆด๋ ˆ์ด์…˜ ๊ฐ„์˜ ์ž˜๋ชป๋œ ํ•จ์ˆ˜์ข…์† ๊ด€๊ณ„๋กœ ์ธํ•ด ์ƒ๊ธด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด์ƒ ํ˜„์ƒ์„ ํ•ด๊ฒฐํ•˜๋Š” ๊ณผ์ •
  • ์ €์žฅ ๊ณต๊ฐ„์„ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋ฆด๋ ˆ์ด์…˜ ๋ถ„๋ฆฌํ•˜๋Š” ๊ณผ์ •

2. ์ด์ƒํ˜„์ƒ (anomaly)

  • ์›์ธ : ๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ์ค‘๋ณต ๋ฐœ์ƒ

  • ๊ฐœ๋… : ๋ฆด๋ ˆ์ด์…˜์— ๋ฐ์ดํ„ฐ ์‚ฝ์ž…, ๊ฐฑ์‹ , ์‚ญ์ œ ์—ฐ์‚ฐ ์ˆ˜ํ–‰์‹œ ๋ถ€์ž‘์šฉ ๋ฐœ์ƒ

  • (1) ์‚ฝ์ž… ์ด์ƒ

    • ๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋„ ๊ฐ™์ด ์‚ฝ์ž…ํ•ด์•ผํ•จ
  • (2) ๊ฐฑ์‹  ์ด์ƒ

    • ์ค‘๋ณต ๋ ˆ์ฝ”๋“œ๊ฐ€ ์žˆ๊ณ , ์ผ๋ถ€๋งŒ ๋ณ€๊ฒฝํ•ด ๋ฐ์ดํ„ฐ ์ž์ฒด๊ฐ€ ๋ถˆ์ผ์น˜๋˜๋Š” ๋ฌธ์ œ
  • (3) ์‚ญ์ œ ์ด์ƒ

    • ๋ ˆ์ฝ”๋“œ ์‚ญ์ œ์‹œ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๊นŒ์ง€ ํ•จ๊ป˜ ์‚ญ์ œ๋จ

3. ํ•จ์ˆ˜์  ์ข…์†์„ฑ (Functional Dependency)

  • ๋ฆด๋ ˆ์ด์…˜๊ฐ„์˜ ๊ด€๋ จ์„ฑ์„ ํ•จ์ˆ˜ ์ข…์†์„ฑ์„ ํ†ตํ•ด ํŒŒ์•…ํ•˜๊ณ , ์ด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฆด๋ ˆ์ด์…˜ ๋ถ„๋ฆฌ(์ •๊ทœํ™”) ํ•„์š”ํ•จ
  • ์–ด๋–ค ๋ฆด๋ ˆ์ด์…˜์„ ๊ตฌ์„ฑํ•˜๋Š” ์†์„ฑ์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์ด X, Y์ผ ๋•Œ,
    • ํ•˜๋‚˜์˜ X์— ๋Œ€ํ•ด Y๊ฐ€ ํ•˜๋‚˜๋ผ๋ฉด,
    • X๊ฐ€ Y๋ฅผ ํ•จ์ˆ˜์ ์œผ๋กœ ๊ฒฐ์ •ํ•œ๋‹ค (Y๊ฐ€ X์— ํ•จ์ˆ˜์ ์œผ๋กœ ์ข…์†๋˜์–ด ์žˆ๋‹ค)
    • X : ๊ฒฐ์ •์ž, Y : ์ข…์†์ž
  • ๋ฆด๋ ˆ์ด์…˜์˜ ์†์„ฑ ๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฒฐ์ •ํ•˜๋ฉด ์•ˆ๋˜๊ณ , ์†์„ฑ ์ž์ฒด์˜ ํŠน์„ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฒฐ์ •ํ•จ
  • X->Y ๊ด€๊ณ„์—์„œ ๊ฒฐ์ •์ž X๋Š” ๊ธฐ๋ณธํ‚ค, ํ›„๋ณดํ‚ค๊ฐ€ ์•„๋‹ ์ˆ˜ ์žˆ์Œ
  • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : ์ด๋ฆ„๊ณผ ๋“ฑ๊ธ‰์€ ์•„์ด๋””์— ํ•จ์ˆ˜์  ์ข…์†์„ฑ์„ ๊ฐ–๋Š” ๊ฒฝ์šฐ
    • ์•„์ด๋”” -> ์ด๋ฆ„, ์•„์ด๋”” -> ๋“ฑ๊ธ‰
    • ์•„์ด๋”” -> {์ด๋ฆ„, ๋“ฑ๊ธ‰}
  • ์ข…๋ฅ˜
    • ์™„์ „ํ•จ์ˆ˜์ข…์† : Y๊ฐ€ X ์ „์ฒด์— ์ข…์†๋จ
    • ๋ถ€๋ถ„ํ•จ์ˆ˜์ข…์† : Y๊ฐ€ X ์ผ๋ถ€์— ์ข…์†๋จ

4. ์ œ1์ •๊ทœํ˜•

  • ๋ฆด๋ ˆ์ด์…˜์˜ ๋ชจ๋“  ๋„๋ฉ”์ธ์ด ๋”์ด์ƒ ๋ถ„ํ•ด๋  ์ˆ˜ ์—†๋Š” ์›์ž๊ฐ’๋งŒ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด์•ผ ํ•œ๋‹ค.
  • ๋ฆด๋ ˆ์ด์…˜์˜ ์†์„ฑ ๊ฐ’ ์ค‘์—์„œ 1๊ฐœ์˜ ๊ธฐ๋ณธํ‚ค์— ๋Œ€ํ•ด 2๊ฐœ ์ด์ƒ์˜ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ๋ฐ˜๋ณต ์ง‘ํ•ฉ์ด ์žˆ๋‹ค๋ฉด ์ œ๊ฑฐ
  • ๐Ÿ—’๏ธ ์˜ˆ์‹œ
  • ๐Ÿ“Œ ๋ฐœ์ƒ ์ด์ƒ ํ˜„์ƒ
    • ์‚ฝ์ž… ์ด์ƒ : ํ•™์ƒ์ด ์ƒˆ ๊ณผ๋ชฉ ์ˆ˜๊ฐ•์‹ ์ฒญ์‹œ, ๋ฐ˜๋“œ์‹œ ํ•™๊ณผ์™€ ์ง€๋„๊ต์ˆ˜ ํ•„์š” (๋ถˆํ•„์š”ํ•œ ์ •๋ณด ์‚ฝ์ž…)
    • ์‚ญ์ œ ์ด์ƒ : 300๋ฒˆ ํ•™์ƒ์ด C400 ๊ณผ๋ชฉ ์ทจ์†Œ์‹œ ํ•ด๋‹น ๊ณผ๋ชฉ ์ •๋ณด ๋ชจ๋‘ ์‚ญ์ œ
    • ๊ฐฑ์‹  ์ด์ƒ : 100๋ฒˆ ํ•™์ƒ์ด ์ง€๋„๊ต์ˆ˜ ๋ณ€๊ฒฝ์‹œ P1 ํ–‰์„ ์ฐพ์•„ ๋ชจ๋‘ ๋ณ€๊ฒฝ ํ•„์š”
  • ๐Ÿ“Œ ์ด์ƒํ˜„์ƒ ๋ฐœ์ƒ ์ด์œ 
    • ๊ธฐ๋ณธํ‚ค๊ฐ€ ์•„๋‹Œ ์†์„ฑ๋“ค์ด ์™„์ „ ํ•จ์ˆ˜ ์ข…์†๋˜์ง€ ๋ชปํ•˜๊ณ , ๋ถ€๋ถ„ํ•จ์ˆ˜ ์ข…์†๋จ
    • ๊ธฐ๋ณธํ‚ค : {ํ•™๋ฒˆ, ๊ณผ๋ชฉ๋ฒˆํ˜ธ}, ์ง€๋„๊ต์ˆ˜์™€ ํ•™๊ณผ๊ฐ€ ๋ถ€๋ถ„ํ•จ์ˆ˜ ์ข…์†

5. ์ œ2์ •๊ทœํ˜•

  • ๋ฆด๋ ˆ์ด์…˜์ด ์ œ1์ •๊ทœํ˜•์ด๋ฉฐ, ๊ธฐ๋ณธํ‚ค๊ฐ€ ์•„๋‹Œ ๋ชจ๋“  ์†์„ฑ์ด ๊ธฐ๋ณธํ‚ค์— ์™„์ „ ํ•จ์ˆ˜ ์ข…์†๋˜์–ด์žˆ๋‹ค.

  • ๊ฐ ์†์„ฑ๋“ค์ด ์™„์ „ํ•จ์ˆ˜ ์ข…์†๋˜๋„๋ก ๋ฆด๋ ˆ์ด์…˜ ๋ถ„๋ฆฌ

    • ๋ถ„ํ•ดํ•œ ๋ฆด๋ ˆ์ด์…˜์€ ์กฐ์ธ์ด ๊ฐ€๋Šฅํ•ด์•ผํ•จ
    • ์กฐ์ธ๋˜์—ˆ์„ ๋•Œ ๋ถ„ํ•ด ์ „์˜ ๋ฆด๋ ˆ์ด์…˜๋“ค๋กœ ๋ณต์›์ด ๊ฐ€๋Šฅํ•ด์•ผํ•จ (๋ฌด์†์‹ค ๋ถ„ํ•ด)
    • ๐Ÿ—’๏ธ ์˜ˆ์‹œ
  • ๐Ÿ“Œ ๋ฐœ์ƒ ์ด์ƒ ํ˜„์ƒ

    • ์‚ฝ์ž… ์ด์ƒ : ์ง€๋„๊ต์ˆ˜๊ฐ€ ํ•™๊ณผ์— ์†Œ์†๋˜์–ด ์žˆ์Œ์„ ์ถ”๊ฐ€ํ•  ๋•Œ ๋ฐ˜๋“œ์‹œ ์ง€๋„ํ•™์ƒ ํ•„์š” (๋ถˆํ•„์š”ํ•œ ์ •๋ณด ์‚ฝ์ž…)
    • ์‚ญ์ œ ์ด์ƒ : 300๋ฒˆ ํ•™์ƒ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ, P3 ๊ต์ˆ˜์˜ ํ•™๊ณผ ์ •๋ณด ์‚ญ์ œ
    • ๊ฐฑ์‹  ์ด์ƒ : ์ง€๋„๊ต์ˆ˜์˜ ํ•™๊ณผ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ ๋ชจ๋‘ ์ฐพ์•„์„œ ๋ณ€๊ฒฝ ํ•„์š”
  • ๐Ÿ“Œ ์ด์ƒํ˜„์ƒ ๋ฐœ์ƒ ์ด์œ 

    • ์ดํ–‰์  ํ•จ์ˆ˜ ์ข…์† (transitive functional dependency)
      • A -> B์ด๊ณ , B -> C์ผ ๋•Œ, โžก A -> C์ผ ๊ฒฝ์šฐ ์ดํ–‰์  ํ•จ์ˆ˜ ์ข…์†
      • ํ•™๋ฒˆ -> ์ง€๋„๊ต์ˆ˜, ์ง€๋„๊ต์ˆ˜ -> ํ•™๊ณผ โžก ํ•™๋ฒˆ -> ํ•™๊ณผ

6. ์ œ3์ •๊ทœํ˜•

  • ๋ฆด๋ ˆ์ด์…˜์ด ์ œ2์ •๊ทœํ˜•์ด๋ฉฐ, ๊ธฐ๋ณธํ‚ค๊ฐ€ ์•„๋‹Œ ๋ชจ๋“  ์†์„ฑ์ด ๊ธฐ๋ณธํ‚ค์— ์ดํ–‰์  ํ•จ์ˆ˜ ์ข…์†์„ ๋งŒ์กฑํ•˜์ง€ ์•Š๋Š” ์ƒํƒœ์ด๋‹ค.

  • ์ดํ–‰์  ํ•จ์ˆ˜ ์ข…์† ๊ด€๊ณ„์— ์žˆ๋Š” ์†์„ฑ์„ ๋ถ„๋ฆฌ

    • ๊ธฐ๋ณธํ‚ค ์ด์™ธ์˜ ์†์„ฑ์ด ๋‹ค๋ฅธ ์†์„ฑ ๊ฒฐ์ •ํ•  ์ˆ˜ ์—†์Œ
    • ๐Ÿ—’๏ธ ์˜ˆ์‹œ

  • ๐Ÿ“Œ ๋ฐœ์ƒ ์ด์ƒ ํ˜„์ƒ

    • ์‚ฝ์ž… ์ด์ƒ : ์ƒˆ๋กœ์šด ๊ต์ˆ˜๊ฐ€ ํŠน์ • ๊ณผ๋ชฉ์„ ๋‹ด๋‹นํ•˜๋Š” ์ •๋ณด ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด, ์ ์–ด๋„ ํ•œ ๋ช… ์ด์ƒ์˜ ์ˆ˜๊ฐ• ํ•™์ƒ ํ•„์š” (๋ถˆํ•„์š”ํ•œ ์ •๋ณด ์‚ฝ์ž…)
    • ์‚ญ์ œ ์ด์ƒ : ํ•™๋ฒˆ 100์ด C234 ๊ณผ๋ชฉ์„ ์ทจ์†Œํ•˜๋ ค๋ฉด, P2๊ฐ€ C234 ๊ณผ๋ชฉ์„ ๋‹ด๋‹นํ•˜๋Š” ์ •๋ณด๋„ ์‚ญ์ œ๋จ
    • ๊ฐฑ์‹  ์ด์ƒ : P1 ๊ณผ๋ชฉ์ด ๋ณ€๊ฒฝ๋˜๋ฉด, P1์ธ ํ–‰์„ ์ฐพ์•„์„œ ๋ณ€๊ฒฝํ•ด์•ผ ํ•จ
  • ๐Ÿ“Œ ์ด์ƒํ˜„์ƒ ๋ฐœ์ƒ ์ด์œ 

    • ๊ฒฐ์ •์ž๊ฐ€ ํ›„๋ณดํ‚ค๋กœ ์ทจ๊ธ‰๋˜์ง€ ์•Š์Œ
    • ํ›„๋ณดํ‚ค๋Š” ์ด ๋ฆด๋ ˆ์ด์…˜์—์„œ {ํ•™๋ฒˆ, ๊ณผ๋ชฉ๋ช…}, {ํ•™๋ฒˆ, ๋‹ด๋‹น๊ต์ˆ˜}
    • ๋‹ด๋™๊ต์ˆ˜๋งŒ์œผ๋กœ ํ›„๋ณดํ‚ค ์•ˆ๋จ (ํ›„๋ณดํ‚ค๊ฐ€ ์•„๋‹Œ๋ฐ ๊ณผ๋ชฉ๋ช… ๊ฒฐ์ • ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ, ๊ฒฐ์ •์ž์— ์†ํ•จ)

7. ๋ณด์ด์Šค/์ฝ”๋“œ ์ •๊ทœํ˜• (BCNF)

  • ๋ฆด๋ ˆ์ด์…˜์ด ์ œ3์ •๊ทœํ˜•์ด๊ณ , ๋ชจ๋“  ๊ฒฐ์ •์ž๊ฐ€ ํ›„๋ณดํ‚ค์ธ ์ƒํƒœ์ด๋‹ค.
    • ๋ณดํ†ต ํ•˜๋‚˜์˜ ๋ฆด๋ ˆ์ด์…˜์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ›„๋ณดํ‚ค๊ฐ€ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ œ3์ •๊ทœํ˜•๋ณด๋‹ค ์—„๊ฒฉํ•จ
  • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : ๊ฐ•์‚ฌ๋Š” ํ›„๋ณดํ‚ค๊ฐ€ ์•„๋‹˜์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ˆ˜๊ฐ•๋ช…์„ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒฐ์ •์ž ์—ญํ• ์„ ํ•จ
    • ๋‹ด๋‹น ๊ต์ˆ˜๊ฐ€ ํ›„๋ณดํ‚ค๊ฐ€ ๋˜๋„๋ก ๋ฆด๋ ˆ์ด์…˜ ๋ถ„ํ•ด
    • ๊ธฐ๋ณธํ‚ค : {ํ•™๋ฒˆ, ๋‹ด๋‹น๊ต์ˆ˜} ๋‹ด๋‹น๊ต์ˆ˜ -> ๊ณผ๋ชฉ๋ช…

8. ์ •๊ทœํ™” ๊ณผ์ • ํ•„์š”์„ฑ

  • ๋‹จ์ 
    • ๋ฆด๋ ˆ์ด์…˜(ํ…Œ์ด๋ธ”)์„ ๋‚˜๋ˆ„๋Š” ๊ณผ์ •์—์„œ ์„ฑ๋Šฅโฌ‡๏ธ
    • ์กฐ์ธ์ด ๋งŽ์ด ํ•„์š”ํ•˜๋Š” ์ฟผ๋ฆฌ์ผ ๊ฒฝ์šฐ, ๋น„์ •๊ทœํ™” ํ•„์š”
  • ์žฅ์ 
    • ์ค‘๋ณต ๋ฐ์ดํ„ฐ๊ฐ€ ์ œ๊ฑฐ๋จ์— ๋”ฐ๋ผ ์Šคํ† ๋ฆฌ์ง€์— ๋Œ€ํ•œ ์ „์ฒด ๋ฉ”๋ชจ๋ฆฌ ์š”๊ตฌ๋Ÿ‰โฌ‡๏ธ
    • ํ…Œ์ด๋ธ” ์˜ค๋ฅ˜ ๊ฐ€๋Šฅ์„ฑโฌ‡๏ธ
profile
Notion์œผ๋กœ ์ด๋™ (https://24tngus.notion.site/3a6883f0f47041fe8045ef330a147da3?v=973a0b5ec78a4462bac8010e3b4cd5c0&pvs=4)

0๊ฐœ์˜ ๋Œ“๊ธ€