Skip to content

[๐Ÿš€ DB - ์‹ค์Šต] ํด๋ผ์šฐ๋”” ๋ฏธ์…˜ ์ œ์ถœํ•ฉ๋‹ˆ๋‹ค.#133

Open
bel1c10ud wants to merge 1 commit into
woowacourse:mainfrom
bel1c10ud:bel1c10ud
Open

[๐Ÿš€ DB - ์‹ค์Šต] ํด๋ผ์šฐ๋”” ๋ฏธ์…˜ ์ œ์ถœํ•ฉ๋‹ˆ๋‹ค.#133
bel1c10ud wants to merge 1 commit into
woowacourse:mainfrom
bel1c10ud:bel1c10ud

Conversation

@bel1c10ud

Copy link
Copy Markdown

3์›” 18์ผ ์˜ˆ๋น„๊ตฐ ํ›ˆ๋ จ์œผ๋กœ ์ธํ•ด ์ถœ์„ํ•˜์ง€ ๋ชปํ•ด PR์ด ์—†์–ด, ๋ณ„๋„๋กœ PR์„ ์ƒ์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๐Ÿค” ์ƒ๊ฐํ•ด ๋ณด๊ธฐ

SQL ์‹ค์Šต ๊ด€๋ จ

  1. ๊ธฐ๋ณธํ‚ค๋ž€ ๋ฌด์—‡์ด๊ณ  ์™œ ํ•„์š”ํ•œ๊ฐ€?

๊ธฐ๋ณธํ‚ค๋Š” ๊ฐํ–‰์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ณ ์œ ํ•œ ์‹๋ณ„์ž
๊ธฐ๋ณธํ‚ค๊ฐ€ ์—†๋‹ค๋ฉด ๊ฐ™์€ ๊ฐ’์œผ๋กœ ๊ตฌ์„ฑ๋œ ํ–‰์ด ์—ฌ๋Ÿฟ ์žˆ์„๋•Œ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์—†๋‹ค.

  1. MySQL์—์„œ ์‚ฌ์šฉ๋˜๋Š” AUTO_INCREMENT๋Š” ์™œ ํ•„์š”ํ• ๊นŒ?

๋งค๋ฒˆ ์ง์ ‘ ID๋ฅผ ์ง€์ •ํ•˜๋‹ค๋ณด๋ฉด ํœด๋จผ ์—๋Ÿฌ๊ฐ€ ์ผ์–ด๋‚  ์ˆ˜ ๋„ ์žˆ๊ณ , ์œ ๋‹ˆํฌํ•œ ID๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ ์ฟผ๋ฆฌ๊ฐ€ ์š”๊ตฌ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—

  1. ํ•™์ƒ์ด ๋“ฑ๊ต๋Š” ํ–ˆ์ง€๋งŒ ํ•˜๊ต ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด์ง€ ์•Š์•˜์„ ๋•Œ, end_time์— NULL์ด ์ €์žฅ๋œ๋‹ค. NULL ๊ฐ’์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์ฃผ์˜ํ•  ์ ์€?

๋น„๊ต ์—ฐ์‚ฐ์œผ๋กœ NULL์„ ํŒ๋ณ„ํ•  ์ˆ˜ ์—†๋‹ค.
์ง‘๊ณ„ ํ•จ์ˆ˜์—์„œ NULL์ด ๋ฌด์‹œ๋œ๋‹ค.
์‚ฐ์ˆ  ์—ฐ์‚ฐ์‹œ ๊ฒฐ๊ณผ๊ฐ€ NULL์ด ๋œ๋‹ค.
ํ”„๋ก ํŠธ์—”๋“œ์—์„œ NULL์ด ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅ๋˜์ง€ ์•Š๊ณ  "๋ฏธํ•˜๊ต"์™€ ๊ฐ™์ด ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ๋„๋ก ๋ณ„๋„์˜ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

  1. crew์™€ attendance ํ…Œ์ด๋ธ”์˜ ๊ด€๊ณ„๋ฅผ ER ๋‹ค์ด์–ด๊ทธ๋žจ์œผ๋กœ ์‹œ๊ฐํ™”ํ•ด๋ณด์ž. ์ด ๊ด€๊ณ„๋ฅผ ์ผ์ƒ ์ƒํ™œ์˜ ์˜ˆ์‹œ๋กœ ๋น„์œ ํ•œ๋‹ค๋ฉด ์–ด๋–ค ๊ฒƒ์ด ์žˆ์„๊นŒ?
image

๊ณ ๊ฐ๊ณผ ์ฃผ๋ฌธ
๊ณ ๊ฐ ํ•œ ๋ช…์ด ์ฃผ๋ฌธ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ํ•  ์ˆ˜ ์žˆ๊ณ , ๊ณ ๊ฐ ์ •๋ณด๋Š” ๊ณ ๊ฐ ํ…Œ์ด๋ธ” ํ•œ ๊ณณ์—์„œ ๊ด€๋ฆฌ๋œ๋‹ค.

2026 ๊ณตํ†ต๊ฐ•์˜ - DB ๊ฐœ๋… ์—ฐ๊ฒฐ

  1. ์ถœ์„ ์‹œ์Šคํ…œ์—์„œ ๋™์‹œ์— 100๋ช…์ด ๋“ฑ๊ต ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅธ๋‹ค๋ฉด ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚ ๊นŒ? ์ด ๋ฌธ์ œ๋ฅผ 2026 ๊ณตํ†ต๊ฐ•์˜ - DB์—์„œ ๋ฐฐ์šด ํŠธ๋žœ์žญ์…˜๊ณผ ACID ์†์„ฑ์œผ๋กœ ์„ค๋ช…ํ•ด๋ณด์ž

100๊ฐœ์˜ INSERT ํŠธ๋žœ์žญ์…˜์ด ๋™์‹œ์— DB์— ๋„์ฐฉ
์›์ž์„ฑ์œผ๋กœ ๊ฐ INSERT๊ฐ€ ์™„์ „ํžˆ ์„ฑ๊ณตํ•˜๊ฑฐ๋‚˜ ์‹คํŒจ
๊ฒฉ๋ฆฌ์„ฑ์œผ๋กœ ํŠธ๋žœ์žญ์…˜๋ผ๋ฆฌ ๊ฐ„์„ญํ•˜์ง€ ์•Š์Œ
์ผ๊ด€์„ฑ๊ณผ ์ง€์†์„ฑ์œผ๋กœ ์ œ์•ฝ์กฐ๊ฑด๊ณผ ์˜๊ตฌ ์ €์žฅ์ด ๋ณด์žฅ

  1. ์ถœ์„ ๋ฐ์ดํ„ฐ๊ฐ€ ํŒŒ์ผ(CSV)์ด ์•„๋‹Œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ? ํŒŒ์ผ ์‹œ์Šคํ…œ์œผ๋กœ ์ถœ์„์„ ๊ด€๋ฆฌํ–ˆ๋‹ค๋ฉด ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ๊นŒ?

CSV๋กœ ๊ด€๋ฆฌํ•˜๋ฉด ๋‹‰๋„ค์ž„ ๊ฐ™์€ ํฌ๋ฃจ ์ •๋ณด๊ฐ€ ์ถœ์„ ๊ธฐ๋ก๋งˆ๋‹ค ์ค‘๋ณต ์ €์žฅ๋จ ์ˆ˜ ์•˜์Œ
100๋ช…์ด ๋™์‹œ์— ํŒŒ์ผ์— ์“ฐ๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฎ์–ด์”Œ์›Œ์ง€๊ฑฐ๋‚˜ ๊นจ์งˆ ์ˆ˜ ์žˆ์Œ

  1. ์ถœ์„ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๊ณ„ํ˜• DB๊ฐ€ ์•„๋‹Œ NoSQL(์˜ˆ: MongoDB)๋กœ ์ €์žฅํ•œ๋‹ค๋ฉด ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋‹ฌ๋ผ์งˆ๊นŒ? ์–ด๋–ค ์žฅ๋‹จ์ ์ด ์žˆ์„๊นŒ?
{
  "crew_id": 1,
  "nickname": "๊ฒ€ํ”„",
  "attendance": [
    { "date": "2025-03-04", "start_time": "09:45", "end_time": "18:10" },
    { "date": "2025-03-05", "start_time": "09:50", "end_time": "18:05" }
  ]
}

์žฅ์ : ๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ๋‹ค, JOIN ์—†์ด ์ฝ์„ ์ˆ˜ ์žˆ์–ด ๋น ๋ฅด๋‹ค
๋‹จ์ : ๊ตฌ์กฐ๊ฐ€ ๋ถˆ๋ณ‘ํ™•ํ•˜๊ณ , ์ง‘๊ณ„ ์ฟผ๋ฆฌ๊ฐ€ ๋ณต์žกํ•ด์ง„๋‹ค.

๐Ÿง ๋” ์ƒ๊ฐํ•ด ๋ณด๊ธฐ (์‹ฌํ™”)

  1. ์™œ crew ํ…Œ์ด๋ธ”์—์„œ nickname์„ ๊ธฐ๋ณธํ‚ค๋กœ ํ•˜์ง€ ์•Š์€ ๊ฑธ๊นŒ? attendance ํ…Œ์ด๋ธ”์— attendance_id๊ฐ€ ์กด์žฌํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ?

์˜๋ฏธ๊ฐ€ ์žˆ๋Š” ๊ฐ’๊ณผ ์ˆ˜์ •๋  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์„ ํ‚ค๋ณธํ‚ค๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ ์ ˆ์น˜ ์•Š๋‹ค
nickname์„ ์ธ๋ฑ์Šค ํƒ์ƒ‰์— ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ํšจ์œจ์ ์ด์ง€ ์•Š๋‹ค
๊ฐ ํ–‰์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ณ ์œ ํ•œ ์‹๋ณ„์ž๊ฐ€ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์—

  1. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ œ์•ฝ ์กฐ๊ฑด ์ค‘ RESTRICT, CASCADE๋Š” ๋ฌด์—‡์ธ๊ฐ€?

RESTRICT: ๋ถ€๋ชจ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •/์‚ญ์ œํ• ๋•Œ ์ž์‹ ํ…Œ์ด๋ธ”์— ์ฐธ์กฐํ•˜๋Š” ํ–‰์ด ์žˆ๋‹ค๋ฉด ์ด๋ฅผ ๊ฑฐ๋ถ€ํ•œ๋‹ค
CASCADE: ๋ถ€๋ชจ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ˆ˜์ •/์‚ญ์ œ๋˜๋ฉด ์ž์‹ ๋ ˆ์ฝ”๋“œ๋„ ๊ฐ™์ด ์‚ญ์ œ๋จ

  1. ๋‹ค์Œ ๋‘ ์ฟผ๋ฆฌ๋Š” ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ ์„ฑ๋Šฅ์— ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค. ์–ด๋–ค ์ฐจ์ด๊ฐ€ ์žˆ์œผ๋ฉฐ, ์–ด๋–ค ์ƒํ™ฉ์—์„œ ๊ฐ๊ฐ ์œ ๋ฆฌํ• ๊นŒ?
-- ์ฟผ๋ฆฌ 1: ์„œ๋ธŒ์ฟผ๋ฆฌ ์‚ฌ์šฉ
SELECT * FROM attendance WHERE crew_id IN (SELECT crew_id FROM crew WHERE nickname LIKE '๋„ค%');

-- ์ฟผ๋ฆฌ 2: JOIN ์‚ฌ์šฉ
SELECT a.* FROM attendance a JOIN crew c ON a.crew_id = c.crew_id WHERE c.nickname LIKE '๋„ค%';

์„œ๋ธŒ ์ฟผ๋ฆฌ: ์ฟผ๋ฆฌ๋ฅผ ์ฝ๊ธฐ ์‰ฝ๊ฒŒ ํ‘œํ˜„ํ•˜๊ณ  ์‹ถ์„ ๋•Œ
JOIN: ๋‘ ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ์„ ํ•จ๊ป˜ SELECTํ•ด์•ผ ํ•  ๋•Œ

  1. attendance ํ…Œ์ด๋ธ”์„ ์™„์ „ํžˆ ์ •๊ทœํ™”ํ•˜๋ฉด ์–ด๋–ค ์žฅ์ ์ด ์žˆ์„๊นŒ? ๋ฐ˜๋Œ€๋กœ ์ผ๋ถ€ ๋น„์ •๊ทœํ™”๋ฅผ ์ ์šฉํ•œ๋‹ค๋ฉด ์–ด๋–ค ์ฟผ๋ฆฌ ์„ฑ๋Šฅ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์„๊นŒ?

์ •๊ทœํ™”: ํฌ๋ฃจ ์ •๋ณด๊ฐ€ ์ˆ˜์ •๋˜๋Š” ๊ฒฝ์šฐ attendance ํ…Œ์ด๋ธ”์— ๊ธฐ๋ก๋œ ํ•ด๋‹น ํฌ๋ฃจ์˜ ์ถœ์„ ์ •๋ณด๋ฅผ ๋ชจ๋‘ ์ˆ˜์ •ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
๋น„์ •๊ทœํ™”: ์ถœ์„ ๊ธฐ๋ก์—์„œ ํฌ๋ฃจ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด crew ํ…Œ์ด๋ธ”์„ ๊ฐ€์ ธ์˜ฌ ํ•„์š”๊ฐ€ ์—†๋‹ค.

  1. ์ถœ์„ ์‹œ์Šคํ…œ์ด ์ˆ˜๋ฐฑ ๋ช…์˜ ์‚ฌ์šฉ์ž์— ์˜ํ•ด ๋™์‹œ์— ์ ‘๊ทผ๋œ๋‹ค๋ฉด, ์—ฐ๊ฒฐ ํ’€๋ง(connection pooling)์€ ๋ฌด์—‡์ด๊ณ  ์™œ ํ•„์š”ํ•œ๊ฐ€?

๋งŽ์€ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋“œ๋Š” ์—ฐ๊ฒฐ์„ ๋งบ๊ณ  ๋Š๋Š” ๊ณผ์ •์„ ์ƒ๋žตํ•˜๊ณ  ๋ฏธ๋ฆฌ ์—ฐ๊ฒฐ์„ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด๋†“๊ณ  ์—ด์–ด๋†“๋Š” ๊ฐœ๋…

  1. ์‹ค์Šต์—์„œ ์ˆ˜ํ–‰ํ•œ INSERT, UPDATE, DELETE๋ฅผ ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๋ฌถ๋Š”๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์„๊นŒ? ๋งŒ์•ฝ DELETE ๋„์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์•ž์„œ ์ˆ˜ํ–‰ํ•œ INSERT์™€ UPDATE๋Š” ์–ด๋–ป๊ฒŒ ๋˜์–ด์•ผ ํ• ๊นŒ?
START TRANSACTION;

INSERT INTO attendance (crew_id, nickname, attendance_date, start_time, end_time)
VALUES (ํฌ๋ฃจ ID, ๋‹‰๋„ค์ž„, ์ถœ์„ ๋‚ ์งœ, ๋“ฑ๊ต ์‹œ๊ฐ„, ํ•˜๊ต ์‹œ๊ฐ„);

UPDATE attendance
SET start_time = ๋“ฑ๊ต ์‹œ๊ฐ„
WHERE crew_id = ํฌ๋ฃจ ID AND attendance_date = ์ถœ์„ ๋‚ ์งœ;

DELETE FROM attendance
WHERE crew_id = ํฌ๋ฃจ ID AND attendance_date = ์ถœ์„ ๋‚ ์งœ;

COMMIT;

ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๋ฌถ์ธ ๋ชจ๋“  ์ž‘์—…์ด ๋กค๋ฐฑ๋œ๋‹ค.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant