SQL Struct: ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์ฑ ์ฅ์ฒ๋ผ ์๊ฐํ๋ ๋ฒ์ ๋ฐฐ์ธ ๋
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊ฑฐ๋ํ ๋์๊ด์ด๋ผ๊ณ ์๊ฐํด๋ณด์. ์ง๊ธ๊น์ง ์์ญ ๋ ๋์, ์ฐ๋ฆฌ๋ ์ ํต์ ์ธ ๋์๊ด ๋ชฉ๋ก ์์คํ ์ฒ๋ผ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฆฌํด์๋ค. ๋ชจ๋ ์ฑ ์ ์ ๋ณด๋ฅผ ๊ฐ๊ฐ ๋ค๋ฅธ ์นด๋์ ์ ์ด์ ๋ณ๋์ ์๋์ ๋ณด๊ดํ๋ ๋ฐฉ์ ๋ง์ด๋ค. ์ ๋ชฉ ์นด๋๋ ์ฌ๊ธฐ, ์ ์ ์นด๋๋ ์ ๊ธฐ, ์ถํ์ฐ๋๋ ๋ ๋ค๋ฅธ ๊ณณ์. ์ด๊ฒ ๋ฐ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋งํ๋ **์ ๊ทํ(normalization)**๋ค.
๊ทธ๋ฐ๋ฐ ๋ง์ฝ ๋์๊ด์ด ์ฑ ์ ๋ชจ๋ ์ ๋ณด๋ฅผ ํ๋์ ๋๋ํ ๋ดํฌ์ ๋ด์ ์ ์๋ค๋ฉด ์ด๋จ๊น? ์ ๋ชฉ, ์ ์, ์ถํ ์ ๋ณด, ์ฌ์ง์ด ๋ฆฌ๋ทฐ๊น์ง ๋ชจ๋ ๊น๋ํ๊ฒ ํ ๊ณณ์ ๋ชจ์๋ ์ ์๋ค๋ฉด? ์ด๊ฒ ๋ฐ๋ก ํ๋ SQL ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ struct๊ฐ ํด์ฃผ๋ ์ผ์ด๋ค.
Struct๊ฐ ๋ญ์ง ์ ํํ ์์๋ณด์
Struct๋ ๋ฐ์ดํฐ๊ณ์ ์ค์์ค ์๋ฏธ ๋์ดํ ๊ฐ์ ์กด์ฌ๋ค. ๊ด๋ จ๋ ์ ๋ณด๋ค์ ์ต์ง๋ก ์ฌ๋ฌ ํ ์ด๋ธ์ ๋๋ ๋ด์ง ์๊ณ (๋์๊ด ์นด๋ ์์คํ ์ฒ๋ผ), ์ฐ๊ด๋ ํ๋๋ค์ ํ๋๋ก ๋ฌถ์ด์ ๋ ผ๋ฆฌ์ ์ธ ๋ฉ์ด๋ฆฌ๋ก ๋ง๋ค์ด์ค๋ค.
-- ๊ธฐ์กด ๋ฐฉ์: ํ
์ด๋ธ ์ฌ๋ฌ ๊ฐ
-- books: book_id, title
-- authors: book_id, author_name
-- publishers: book_id, publisher_name, year
-- Struct ๋ฐฉ์: ๊ด๋ จ ๋ฐ์ดํฐ๋ฅผ ํ ํ
์ด๋ธ์ ๋ญ์ณ๋๊ธฐ
CREATE TABLE books (
book_id INT64,
info STRUCT<
title STRING,
author STRING,
publisher STRING,
year INT64
>
)
ํ์ผ๋ง ์บ๋น๋(๊ธฐ์กด ํ ์ด๋ธ๋ค)๊ณผ ์ ์ ๋ฆฌ๋ ์๋ฅ๊ฐ๋ฐฉ(struct)์ ์ฐจ์ด๋ผ๊ณ ๋ณด๋ฉด ๋๋ค. ๋ ๋ค ์๋ฅ๋ฅผ ๋ณด๊ดํ ์ ์์ง๋ง, ์๋ฅ๊ฐ๋ฐฉ์ ๊ด๋ จ ์๋ ๊ฒ๋ค๋ผ๋ฆฌ ๊ตฌ์ญ์ ๋๋ ์ ํจ๊ป ๋ฃ์ด๋๋ค.
Array of Structs์ ๋ง๋ฒ
์ฌ๊ธฐ์๋ถํฐ ์ง์ง ์ฌ๋ฐ์ด์ง๋ค. ์ฐ๋ฆฌ ์ฑ ๋ดํฌ๊ฐ ์ฌ๋ฌ ๊ถ์ ๋ด์ ์ ์๋ค๋ฉด? ์ด๊ฒ ๋ฐ๋ก array of structs๋ค. ์์ ํ ์ฑ ์ ๋ณด ์ฌ๋ฌ ๊ฐ๋ฅผ ๋ด์ ์ ์๋ ํ์ฅํ ํด๋ ๊ฐ์ ๊ฑฐ๋ค.
-- ๊ณ ๊ฐ์ ๋
์ ๊ธฐ๋ก
CREATE TABLE customers (
customer_id INT64,
name STRING,
reading_history ARRAY<STRUCT<
book_title STRING,
genre STRING,
rating INT64,
date_read DATE
>>
)
๋ฏผ์ง๋ผ๋ ๊ณ ๊ฐ์ ๋ ์ ๊ธฐ๋ก์ด ์ด๋ฐ ์์ผ๋ก ์ ์ฅ๋๋ค๊ณ ์๊ฐํด๋ณด์:
๋ฏผ์ง์ ๋
์ ๊ธฐ๋ก:
๐ [
{title: "ํด๋ฆฌํฌํฐ", genre: "ํํ์ง", rating: 5, date_read: "2025-01-15"},
{title: "๋ฏธ์๋ฐ์ ์ฉ๊ธฐ", genre: "์๊ธฐ๊ณ๋ฐ", rating: 4, date_read: "2025-02-20"},
{title: "๋", genre: "์์ค", rating: 5, date_read: "2025-03-10"}
]
๋ฏผ์ง์ ๋ชจ๋ ๋ ์ ๊ธฐ๋ก์ด ํ ๊ณณ์ ๋ฑ ๋ค์ด์๋ค. ๊ณ ๊ฐ ์ ๋ณด์ ํจ๊ป ๋ค๋๋ ๊ฐ์ธ ๋ ์ ๋ค์ด์ด๋ฆฌ ๊ฐ์ ๋๋์ด๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค๊ณ์ ์์ํ ๋ก๋ฐฅ
์ด์ฏค ๋๋ฉด ๋ฐ์ดํฐ ์์ง๋์ด๋ง์์ ๊ฐ์ฅ ๋จ๊ฑฐ์ด ๋ ผ์๊ฑฐ๋ฆฌ๊ฐ ๋์จ๋ค: ๋ฐ์ดํฐ๋ฅผ ๋์๊ด ๋ชฉ๋ก์ฒ๋ผ ๊น๋ํ๊ฒ ๋๋ ๋์ ๊ฑฐ๋(์ ๊ทํ), ์๋๋ฉด ๊ฐ์ธ ํ์ผํจ์ฒ๋ผ ๋ญ์ณ ๋์ ๊ฑฐ๋(struct ์ด ๋น์ ๊ทํ)?
๋์๊ด ๋ชฉ๋ก ์คํ์ผ (์ ๊ทํ)
- ์ข์ ์ : ์ค๋ณต ์์ด ๊น๋, ํ๋๋ง ๊ณ ์น๋ฉด ๋
- ์์ฌ์ด ์ : ์ ์ฒด ์ ๋ณด ๋ณด๋ ค๋ฉด ์ฌ๊ธฐ์ ๊ธฐ ๋ค์ ธ์ผ ํจ
- ์ธ์ ์ฐ๋: ๊ฐ๋ณ ์ ๋ณด๋ฅผ ์์ฃผ ์์ ํ ๋
๊ฐ์ธ ํ์ผํจ ์คํ์ผ (Structs)
- ์ข์ ์ : ๊ด๋ จ ์ ๋ณด๊ฐ ๋ค ํ ๊ณณ์, ๋น ๋ฅด๊ฒ ์กฐํ ๊ฐ๋ฅ
- ์์ฌ์ด ์ : ํ๋ ๊ณ ์น๋ ค๋ฉด ํต์งธ๋ก ๋ค์ ์จ์ผ ํจ
- ์ธ์ ์ฐ๋: ์ฃผ๋ก ์ฝ๊ธฐ๋ง ํ๊ณ ์์ ์ ๋ณ๋ก ์ ํ ๋
Struct๊ฐ ์์ฃผ ์ ๋ฐ์ดํธํ๋ ๊ฑธ ์ซ์ดํ๋ ์ด์
์์์ ์ํฉ์ ์๊ฐํด๋ณด์. ์๋นํ๋ ์ ์ฅ์์:
๊ธฐ์กด ํ ์ด๋ธ ๋ฐฉ์ (์ ๊ทํ): ์ฃผ๋ฌธ ํญ๋ชฉ๋ง๋ค ๋ฐ๋ก ์ ํ๋ฅผ ์ด๋ค. ์๋์ด ํ๋ ๋ฐ๊พธ๊ณ ์ถ๋ค๊ณ ํ๋ฉด ๊ทธ ์ ํ๋ง ๋ฒ๋ฆฌ๊ณ ์๋ก ์ฐ๋ฉด ๋๋ค.
Struct ๋ฐฉ์: ์ ์ฒด ์ฃผ๋ฌธ์ ํ๋์ ํฐ ์ ํ์ ๋ค ์ ๋๋ค. ์๋์ด ํ๋๋ง ๋ฐ๊พธ๊ณ ์ถ์ด๋ ์ ์ฒด ์ ํ๋ฅผ ์ง์ฐ๊ณ ์ฒ์๋ถํฐ ๋ค์ ์จ์ผ ํ๋ค.
-- ์ ๊ทํ๋ ํ
์ด๋ธ: ๊ฐ๋จํ ์
๋ฐ์ดํธ
UPDATE order_items SET quantity = 3 WHERE order_id = 123 AND item = 'ํผ์';
-- Struct: ๋ณต์กํ ์
๋ฐ์ดํธ - ๋ฐฐ์ด ์ ์ฒด๋ฅผ ๋ค์ ์จ์ผํจ
UPDATE orders
SET items = ARRAY(
SELECT CASE
WHEN item.name = 'ํผ์'
THEN STRUCT(item.name, 3 as quantity, item.price)
ELSE item
END
FROM UNNEST(items) as item
)
WHERE order_id = 123;
๊ทธ๋์ struct๋ ๋ถ์์ฉ(์ฃผ๋ก ์ฝ๊ธฐ)์๋ ์งฑ์ด์ง๋ง, ์ค์๊ฐ์ผ๋ก ๋ง ์ ๋ฐ์ดํธํ๋ ์์คํ ์๋ ๊ณจ์น ์ํ ์กด์ฌ๊ฐ ๋ ์ ์๋ค.
๋ฐ์ดํฐ ์์ง๋์ด์ Struct ์์กด๋ฒ
1. ์คํค๋ง ๋ณํ: ์ฑ์ฅํต์ ํผํ ์ ์๋ค
Struct๋ ์ฌ์ถ๊ธฐ ์ ๋ค ๊ฐ๋ค. ์๋ผ๋ฉด์ ๋ณํ๋ ๊ฑด ๋น์ฐํ๋ฐ, ํญ์ ์์๊ฒ ๋ณํ์ง๋ ์๋๋ค. ์ ํ๋ ์ถ๊ฐ๋ ๋ณดํต ๊ด์ฐฎ์ง๋ง, ๊ธฐ์กด ๊ฑธ ์์ ๊ฑฐ๋ ์ด๋ฆ ๋ฐ๊พธ๋ ๊ฑด ๋ค์ชฝ ์์คํ ๋ค์ ๋ค ํฐํธ๋ฆด ์ ์๋ค.
2. ์ ์ฅ ์ฉ๋: ํฌ๊ธฐ๊ฐ ๋ค ํ๋ ๊ฑฐ ์๋๋ค
Struct๋ฅผ ์ฌํ ์ง ์ธ๊ธฐ๋ผ๊ณ ์๊ฐํด๋ณด์. ์ ์ ๋ฆฌ๋ struct๋ ํ ํธ๋ฆฌ์ค ๊ณ ์๊ฐ ์ผ ์บ๋ฆฌ์ด ๊ฐ๋ค. ๋ชจ๋ ๊ฒ ๋ฑ๋ฑ ๋ง์๋จ์ด์ง๋ค. ํ์ง๋ง ๋น ๊ณต๊ฐ ํฌ์ฑ์ด์ธ struct๋ ์คํฐ๋กํผ๋ง ์๋ฉ ๋ค์ด์๋ ํ๋ฐฐ์์ ๊ฐ๋ค. ๊ณต๊ฐ ๋ญ๋น์ ๋ํ์์ด๋ค.
3. ์ฑ๋ฅ ํจํด: ๊ณ ์๋๋ก vs ๊ณจ๋ชฉ๊ธธ ํํ
- ์ ๋๋ ๊ฒ: ๊ด๋ จ ๋ฐ์ดํฐ ํต์งธ๋ก ๊ฐ์ ธ์ค๊ธฐ (๊ณ ์๋๋ก ์ฉ์ฉ)
- ์ ๋๋ ๊ฒ: ํน์ ์ค์ฒฉ๊ฐ ์ฐพ๊ธฐ (๊ณจ๋ชฉ๊ธธ ํค๋งค๊ธฐ)
4. ํ๋ซํผ ํธํ์ฑ: ๊ฐ์ ๋ค๋ฅธ ์ธ์ด ์ฐ๋ ๋๋
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ง๋ค struct ์ง์์ด ์ ๊ฐ๊ฐ์ด๋ค. BigQuery๋ struct ๋ง๋์๊ณ , Spark๋ ์ ์๋ค. ํ์ง๋ง ๊ตฌํ ์์คํ ๋ค์ ํต์ญ์ฌ๊ฐ ํ์ํ๊ฑฐ๋ ์์ ๋ชป ์์๋ฃ๋๋ค.
5. ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ: ๋งํธ๋ฃ์์นด ์ธํ ํจ๊ณผ
Struct ๋ฐฐ์ด์ ๋ฉ๋ชจ๋ฆฌ์์ ํ์ดํค์น๋ฉด ๋ฌ์์ ์ธํ ๊น๋ ๊ฒ ๊ฐ๋ค. ์ฒ์์ ํ๋์๋๋ฐ ๊ฐ์๊ธฐ ๊ฐ๋ณ ์กฐ๊ฐ๋ค์ด ์ฐ๋ฅด๋ฅด ์์์ ธ ๋์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ค ์ฐจ์งํ๋ค.
ํํ Struct ํจ์ ๋ค (๊ทธ๋ฆฌ๊ณ ํผํ๋ ๋ฒ)
“์ธ์ ์ ” ๋ณ
Struct๋ฅผ ๋๋ฌด ๊น๊ฒ ์ค์ฒฉํ์ง ๋ง์. ์์ ์์ ์์ ์์ ์๋ ์์ ์ฐฝ๊ณ ์์ ๋ญ๊ฐ๋ฅผ ์ฐพ๋ ๊ฑฐ๋ ๋ง์ฐฌ๊ฐ์ง๋ค. ๋์ค์ ์๋ฌด๋ ๋ญ๊ฐ ์ด๋ ์๋์ง ๊ธฐ์ต ๋ชปํ๋ค.
“๋ง๋ฅ ์ฃผ๋จธ๋” ์ฆํ๊ตฐ
struct์ ๋ญ๋ ๋ฃ์ ์ ์๋ค๊ณ ํด์ ๋ค ๋ฃ์ผ๋ฉด ์ ๋๋ค. ๋์ ๋ถํฐ ์์์ฆ๊น์ง ๋ค ๋ค์ด์๋ ์ง๊ฐ ๊ฐ์ ๊ผด์ด ๋๋ค. ๊ธฐ์ ์ ์ผ๋ก ๊ฐ๋ฅํ์ง๋ง ํ์ค์ ์ผ๋ก ์ง์ฅ์ด๋ค.
“์ ๋ฐ์ดํธ ์ง์ฅ”
์์ฃผ ๋ฐ๋๋ ๋ฐ์ดํฐ์ struct ์ฐ๋ ๊ฑด ์ฝํ ๋ ๋ฉ๋ดํ ๊ฐ๋ค. ๊ฐ๊ฒฉ ํ๋ ๋ฐ๋ ๋๋ง๋ค ํต์งธ๋ก ์๋ก ๋ง๋ค์ด์ผ ํ๋ค.
์ธ์ Struct ์ธ์ง ๋ง์ง ์ ํ๊ธฐ
์ด๋ด ๋๋ Struct ๊ณ ๊ณ :
- ์๋๋ถํฐ ์ค์ฒฉ๋ ํํ์ ๋ฐ์ดํฐ์ผ ๋ (์ฃผ์, ์ํ ์ ๋ณด, ํ๋กํ ๊ฐ์ ๊ฒ๋ค)
- ์ฃผ๋ก ์ฝ๊ธฐ๋ง ํ๊ณ ๊ฐ๋ณ ์์ ์ ๊ฑฐ์ ์ ํ ๋
- ์ค์ฒฉ๋ ํ๋๋ค ์ฌ์ด์ ๊ด๊ณ๋ฅผ ๋ถ์ํด์ผ ํ ๋
- ๋ถ์์ด๋ ๋ฆฌํฌํ ์์คํ ๋ง๋ค ๋
์ด๋ด ๋๋ Struct ํผํ๊ธฐ:
- ๊ฐ๋ณ ๋ฐ์ดํฐ๋ฅผ ์์ฃผ ์์ ํ ๋
- ํน์ ์ค์ฒฉ๊ฐ์ ๊ณ์ ๊ฒ์ํ๊ฑฐ๋ ์ธ๋ฑ์ฑํด์ผ ํ ๋
- ๋์์ ์ ๋ง์ ์ค์๊ฐ ์์คํ ๋ง๋ค ๋
- ํ์ด ๋ณต์กํ ๊ฑธ ๊ฐ๋นํ๊ธฐ ์ด๋ ค์ธ ๋
์ ๋ฆฌํ์๋ฉด
Struct๋ ๋ฐ์ดํฐ๋ฅผ ์ํ ๋๋ํ ๋น์ ๊ฐ์ ์กด์ฌ๋ค. ๊ด๋ จ ์ ๋ณด๋ค์ ์์๊ฒ ์ ๋ฆฌํด์ฃผ๊ณ ํน์ ์์ ๋ค์ ํจ์ฌ ์ฝ๊ฒ ๋ง๋ค์ด์ค๋ค. ํ์ง๋ง ๋ชจ๋ ๋น์๊ฐ ๊ทธ๋ ๋ฏ์ด, ์ ์ฌ์ ์์ ์จ์ผ ํ๋ค. ๊ธฐ์กด์ ์ข์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๊ณ ์์น๋ค์ ๋์ฒดํ๋ ๊ฒ ์๋๋ผ, ๋๊ตฌ์์์ ํ๋ ๋ ์ถ๊ฐ๋ ๊ฑฐ๋ค.
ํต์ฌ์ ์ธ์ ํ์ผ๋ง ์บ๋น๋(๊ธฐ์กด ํ ์ด๋ธ)์ ์ธ์ง, ์ธ์ ์ ๋ฆฌ๋ ์๋ฅ๊ฐ๋ฐฉ(struct)์ ์ธ์ง ์๋ ๊ฒ์ด๋ค. ๋ ๋ค ๋ฐ์ดํฐ ์์ง๋์ด ์ธ๊ณ์์ ๊ฐ์ ์ญํ ์ด ์๊ณ , ์ต๊ณ ์ ์๋ฃจ์ ์ ๋ณดํต ๋์ ์ ๋ต์ ์ผ๋ก ์์ด ์ฐ๋ ๊ฑฐ๋ค.
๊ธฐ์ตํ์: struct๋ “ํ ์ด๋ธ๊ณผ ํ"์ผ๋ก ์๊ฐํ๋ ๊ฑธ “๋ฌธ์์ ๊ฐ์ฒด"๋ก ์๊ฐํ๊ฒ ๋ฐ๊พธ๋ ๋ณํ๋ค. ์ด๋ฐ ํจ๋ฌ๋ค์ ์ ํ์ ๋ฐ์๋ค์ด๋, ์์ญ ๋ ๊ฐ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐฐ์ด ๊ฒ๋ค์ ๋ฒ๋ฆฌ์ง ๋ง์. ๋ฐ์ดํฐ ์์ง๋์ด๋ง์ ๋ฏธ๋๋ ํ๋๋ฅผ ์ ํํ๋ ๊ฒ ์๋๋ผ, ๊ฐ ๋๊ตฌ๋ฅผ ์ธ์ ์ ๋๋ก ์ธ์ง ์๋ ๋ฐ ์๋ค.