본문 바로가기
C.W.K.
Stream
Lesson 03 of 10 · published

관계형, 문서형, 키-값 모델

~14 min · foundations, models

Level 0스키마 새싹
0 XP0/86 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

옷장을 정리하는 세 방식

관계형 모델은 이름표가 붙은 서랍장과 닮았어. 양말과 셔츠를 제자리에 나누어 두고 서로의 관계를 기록하니 “이 셔츠와 어울리는 바지는 무엇인가?” 같은 질문에 답할 수 있지. 문서형 모델은 한 벌을 통째로 상자 하나에 담아 두는 방식이야. 한 사람의 옷은 빨리 꺼내지만 모든 상자를 가로질러 빨간 셔츠만 찾는 일은 불리해. 키-값 모델은 이름표 하나에 물건 하나를 곧장 연결해. 그 밖의 구조는 0에 가까워.

모델을 고르는 기준

데이터 사이의 관계가 중요하고 데이터베이스가 그 규칙을 지켜야 한다면 관계형 모델이 맞아. 기록마다 모양이 크게 다르고 대부분 한 문서 단위로 읽는다면 문서형이 편해. 정확한 키 하나로 값을 최대한 빠르게 찾는 일만 필요하다면 키-값 모델이 강하지. 익숙한 제품 이름보다 데이터가 실제로 어떻게 읽히고 바뀌는지를 먼저 봐야 해.

PostgreSQL은 셋을 함께 품는다

PostgreSQL은 관계형 모델을 중심에 두면서 나머지 두 방식도 실용적으로 제공해. JSONB 열에는 문서를 저장하고 색인까지 만들 수 있고, hstore는 단순한 키-값 구조를 제공해. 그래서 “MongoDB가 꼭 필요한가?”라는 질문에는 먼저 PostgreSQL 안에서 관계형 열과 JSONB를 함께 쓸 수 없는지 살펴보라는 답이 자주 맞아.

Code

관계형 모델: 서로 참조하는 테이블·sql
SELECT customers.name, orders.total
FROM   customers
JOIN   orders ON orders.customer_id = customers.id
WHERE  orders.total > 100;
문서형 모델: PostgreSQL의 JSONB·sql
CREATE TABLE customer_orders (
    id        INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    customer  TEXT NOT NULL,
    payload   JSONB NOT NULL
);

INSERT INTO customer_orders (customer, payload) VALUES
('Alice', '{"orders":[{"product":"Widget","total":150},
                     {"product":"Gadget","total":45}]}');

-- JSON document 안 쿼리
SELECT customer,
       jsonb_array_elements(payload->'orders') ->> 'product' AS product
FROM   customer_orders;
키-값 모델: Redis식 조회·text
SET   user:42:session  "abc123"
GET   user:42:session
"abc123"

External links

Exercise

“Alice의 $100 넘는 주문을 모두 찾아라”라는 요청을 세 방식으로 적어봐. 두 테이블을 JOIN하는 순수 관계형 SQL, 한 테이블의 JSONB, Redis 명령을 흉내 낸 키-값 방식이야. 어느 표현이 가장 읽기 쉽고 어떤 모델을 먼저 고를지 비교해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.