Hamutaro - Hamtaro 4

Database/Engineering 5

[DE] ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ ์„ค๊ณ„ ์›์น™

๋ฉฑ๋“ฑ์„ฑ (Idempotency)๊ฐ™์€ ํŒŒ์ดํ”„๋ผ์ธ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ์‹คํ–‰ํ•ด๋„ ๊ฒฐ๊ณผ๊ฐ€ ํ•ญ์ƒ ๊ฐ™์•„์•ผ ํ•œ๋‹ค.์™œ ํ•„์š”ํ• ๊นŒ? ํŒŒ์ดํ”„๋ผ์ธ์€ ์–ธ์ œ๋“  ์‹คํŒจํ•  ์ˆ˜ ์žˆ๋‹ค.์ƒˆ๋ฒฝ 2์‹œ ํŒŒ์ดํ”„๋ผ์ธ ์‹คํ–‰-> ์ ˆ๋ฐ˜์ฏค ์‹คํ–‰๋˜๋‹ค๊ฐ€ ์„œ๋ฒ„ ์žฅ์• ๋กœ ์‹คํŒจ-> ์ƒˆ๋ฒฝ 3์‹œ ์žฌ์‹คํ–‰-> ๋ฐ์ดํ„ฐ๊ฐ€ ๋‘ ๋ฒˆ ๋“ค์–ด๊ฐ€๋ฉด?๋ฉฑ๋“ฑ์„ฑ์ด ์—†์œผ๋ฉด ์žฌ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ๋ฐ์ดํ„ฐ๊ฐ€ ์ค‘๋ณต๋œ๋‹ค.1. ๋‚˜์œ ์˜ˆ์‹œ - ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ๋ฐ์ดํ„ฐ๊ฐ€ ์Œ“์ž„INSERT INTO fct_ordersSELECT * FROM stg_ordersWHERE date = '2024-01-01'; 2. ์ข‹์€ ์˜ˆ์‹œ - ๋จผ์ € ์ง€์šฐ๊ณ  ๋‹ค์‹œ ๋„ฃ์ŒDELETE FROM fct_orders WHERE date = '2024-01-01';INSERT INTO fct_ordersSELECT * FROM stg_ordersWEHRE dat..

[DE] ๋ฐฐ์น˜ vs ์ŠคํŠธ๋ฆฌ๋ฐ

๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์„ ์„ค๊ณ„ํ•  ๋•Œ ๊ฐ€์žฅ ๋จผ์ € ๊ฒฐ์ •ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด ์žˆ๋‹ค.๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ์•„์„œ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ธ๊ฐ€?์ƒ๊ธฐ๋Š” ์ฆ‰์‹œ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ธ๊ฐ€? ๋ฐฐ์น˜ (Batch)๋ฐ์ดํ„ฐ๋ฅผ ์ผ์ • ์ฃผ๊ธฐ๋กœ ๋ชจ์•„๋’€๋‹ค๊ฐ€ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ž์ • 00:00 → ํ•˜๋ฃจ์น˜ ์ฃผ๋ฌธ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘00:10 → ๋ณ€ํ™˜ (dbt run)00:30 → ์›จ์–ดํ•˜์šฐ์Šค ์ ์žฌ ์™„๋ฃŒ09:00 → ๋ถ„์„๊ฐ€๊ฐ€ ๋Œ€์‹œ๋ณด๋“œ ํ™•์ธ ํ•ญ๋ชฉ๋‚ด์šฉ์ฒ˜๋ฆฌ ์ฃผ๊ธฐ์‹œ๊ฐ„ / ์ผ / ์ฃผ ๋‹จ์œ„์ง€์—ฐ๋†’์Œ (๋ช‡ ์‹œ๊ฐ„ ~ ํ•˜๋ฃจ)๊ตฌํ˜„ ๋‚œ์ด๋„๋‚ฎ์Œ๋น„์šฉ์ €๋ ด๋Œ€ํ‘œ ๋„๊ตฌAirflow + dbt, Spark ๋ฐฐ์น˜๊ฐ€ ์ ํ•ฉํ•œ ๊ฒฝ์šฐ ์ผ๋ณ„ ๋งค์ถœ ๋ฆฌํฌํŠธ์›”๋ณ„ ์ •์‚ฐ๋จธ์‹ ๋Ÿฌ๋‹ ํ•™์Šต ๋ฐ์ดํ„ฐ ์ค€๋น„๋Œ€๋ถ€๋ถ„์˜ BI ๋Œ€์‹œ๋ณด๋“œ ์ŠคํŠธ๋ฆฌ๋ฐ (Streaming)๋ฐ์ดํ„ฐ๊ฐ€ ์ƒ๊ธฐ๋Š” ์ฆ‰์‹œ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ฃผ๋ฌธ ๋ฐœ์ƒ → 0.1์ดˆ ์•ˆ์— ..

[DE] dbt(data build tool) - SQL์„ ์ฝ”๋“œ์ฒ˜๋Ÿผ ๊ด€๋ฆฌํ•˜๋Š” ๋„๊ตฌ

๋ฐ์ดํ„ฐ ์›จ์–ดํ•˜์šฐ์Šค์— ๋ฐ์ดํ„ฐ๋ฅผ ์Œ“๋Š” ๊ฒƒ๋ณด๋‹ค ์–ด๋ ค์šด ๊ฒƒ์€ ์Œ“์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.dbt๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ๋„๊ตฌ์ด๋‹ค. dbt๊ฐ€ ์ƒ๊ธด ์ด์œ dbt ์ด์ „์˜ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ ์ž‘์—…SQL ํŒŒ์ผ์ด ์ˆ˜๋ฐฑ ๊ฐœ๊ฐ€ ๋˜๋ฉด ๊ด€๋ฆฌ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.์–ด๋–ค ์ˆœ์„œ๋กœ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์—†๋‹ค.๋ˆ„๊ฐ€ ์–ธ์ œ ์ˆ˜์ •ํ–ˆ๋Š”์ง€ ์ถ”์ ์ด ์•ˆ๋œ๋‹ค.ํ…Œ์ŠคํŠธ๊ฐ€ ์—†์–ด์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ๊นจ์ ธ๋„ ํ•œ์ฐธ ๋’ค์— ์•Œ๊ฒŒ ๋œ๋‹ค.๊ฐ™์€ ๋กœ์ง์„ ์—ฌ๋Ÿฌ ํŒŒ์ผ์—์„œ ์ค‘๋ณต์œผ๋กœ ์ž‘์„ฑํ•œ๋‹ค.transformation_v1.sqltransformation_v1_final.sqltransformation_v1_final_์ง„์งœ์ตœ์ข….sqltransformation_v2_์ˆ˜์ •.sql dbt๋Š” ์ด ๋ฌธ์ œ๋“ค์„ ํ•œ ๋ฒˆ์— ํ•ด๊ฒฐํ•œ๋‹ค. ํ•ต์‹ฌ ๊ฐœ๋… 1 - ๋ ˆ์ด์–ด ๊ตฌ์กฐdbt๋Š” SQL ํŒŒ์ผ์„ ์—ญ..

[DE] ๋ฐ์ดํ„ฐ์›จ์–ดํ•˜์šฐ์Šค ๋ชจ๋ธ๋ง ๊ธฐ๋ณธ - Star Schema

OLAP DB์— ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์„ ๋•Œ ๋ถ„์„ํ•˜๊ธฐ ์ข‹์€ ๊ตฌ์กฐ๋กœ ์„ค๊ณ„ํ•ด์•ผ ํ•œ๋‹ค.๊ทธ ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ๋ฒ•์ด Star Schema๋‹ค. Fact ํ…Œ์ด๋ธ” + Dimension ํ…Œ์ด๋ธ”Star Schema๋Š” ๋‘ ์ข…๋ฅ˜์˜ ํ…Œ์ด๋ธ”๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.๊ตฌ๋ถ„Fact ํ…Œ์ด๋ธ” Dimension ํ…Œ์ด๋ธ”์˜๋ฏธ์‹ค์ œ๋กœ ์ผ์–ด๋‚œ ์ด๋ฒคํŠธ์ด๋ฒคํŠธ์˜ ๋ถ€๊ฐ€ ์ •๋ณด์ค‘์‹ฌ์ˆซ์ž(์ธก์ •๊ฐ’)ํ…์ŠคํŠธ/์†์„ฑ์˜ˆ์‹œ์ฃผ๋ฌธ, ํด๋ฆญ, ๊ฒฐ์ œ๊ณ ๊ฐ, ์ƒํ’ˆ, ๋‚ ์งœ, ์ง€์—ญ -> ๊ฐ€์šด๋ฐ Fact ํ…Œ์ด๋ธ”์„ ์ค‘์‹ฌ์œผ๋กœ Dimension ํ…Œ์ด๋ธ”๋“ค์ด ๋ณ„์ฒ˜๋Ÿผ ๋ถ™์–ด์žˆ๋Š” ๊ตฌ์กฐ๋ผ Star Schema๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ์„ค๊ณ„ ์˜ˆ์‹œ [dim_customer] [dim_product]โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”โ”‚ custome..

[DE] OLTP vs OLAP

์™œ ๋ถ„์„์šฉ DB๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•˜์ง€? ์ด ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต์ด ๋ฐ”๋กœ OLTP์™€ OLAP์˜ ์ฐจ์ด๋‹ค. OLTP - ์„œ๋น„์Šค๋ฅผ ์œ„ํ•œ DBOLTP(Online Transaction Processing)๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ฐœ๋ฐœํ•  ๋•Œ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” DBMySQL, PostgreSQL* ๋Œ€ํ‘œ์ ์ธ OLTP ์งˆ๋ฌธ๋“ค- ์ฃผ๋ฌธ #1234์˜ ํ˜„์žฌ ์ƒํƒœ๋Š”?- ๊น€์ฒ ์ˆ˜์˜ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ์ƒํ’ˆ ์ถ”๊ฐ€ํ–‰(Row) ๋‹จ์œ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์“ด๋‹ค.์ •๊ทœํ™”๊ฐ€ ์ž˜ ๋˜์–ด ์žˆ๋‹ค.์†Œ๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•œ๋‹ค.์‹ค์‹œ๊ฐ„ ์ฝ๊ธฐ/์“ฐ๊ธฐ๊ฐ€ ๋งŽ๋‹ค. OLAP - ๋ถ„์„์„ ์œ„ํ•œ DBOLAP(Online Analytical Processing)๋Š” ๋ถ„์„ ์ „์šฉ DBBigQuery, Snowflake, Redshift* ๋Œ€ํ‘œ์ ์ธ OLAP ์งˆ๋ฌธ๋“ค- ์ง€๋‚œ 3๊ฐœ์›” ์ง€์—ญ๋ณ„ ๋งค์ถœ ํ•ฉ๊ณ„- ์ƒํ’ˆ ์นดํ…Œ๊ณ ..