Skip to content

NoSQL 데이터 모델링 해설

문서, 키-값, 와이드 컬럼, 그래프, 벡터 스토어의 모델링 패턴 — 임베드, 참조, 비정규화, 시간 버킷화를 적용할 때.

NoSQL 스토어는 고정 스키마와 조인을 수평 확장과 맞바꾼다. 각 계열은 관계를 자기 방식으로 모델링하므로 구조를 정하는 것은 정규형이 아니라 접근 패턴이다.

참조 표 · 28 항목
28 of 28 rows
문서
중첩된 서브문서가 별도 테이블이 아니라 하나의 부모 문서 안에 담긴다.함께 읽는 일대소수 관계. 품목을 품은 주문. 주소 세 개를 가진 사용자.
데이터가 아니라 외래 id를 저장한다. 두 번째 읽기나 $lookup으로 해소한다.크거나 공유되거나 독립적으로 갱신되는 서브 엔티티. 컬렉션 간 다대다 링크.
부모가 짧은 자식 배열을 내장한다. 전체 집합이 하나의 문서로 들어맞고 한 번에 로드된다.프로필의 몇 개 전화번호나 설정. 한 번의 읽기가 부모와 자식을 함께 반환.
자식은 자체 컬렉션에 살고 각자 부모 id를 지니거나, 부모가 상한 있는 id 배열을 유지한다.내장하기엔 너무 크거나 독립적인 집합. 부모 id로 자식을 조회.
자식이 부모 id를 저장하고 부모는 자식을 나열하지 않는다. 집합이 무한히 자라기 때문.호스트나 사용자에 묶인 이벤트, 로그, 투표. 부모 id로 걸러 페이지네이션.
서로 다른 엔티티 타입의 문서가 하나의 컬렉션을 공유하며 type 필드로 구별된다.여러 종류의 부모에 붙는 댓글이나 알림을 한 가지 방식으로 조회.
소수의 극단적 엔티티를 공유 형태에서 분리해 크기나 트래픽이 나머지를 왜곡하지 않게 한다.팔로워 목록이나 카운터가 일반 문서를 초과 성장시킬 유명 계정.
각 리비전은 같은 id와 커지는 버전 번호를 가진 새 문서다. 쿼리가 최신을 고른다.이전 리비전이 계속 조회 가능해야 하는 감사 추적과 편집 이력.
파생값을 쓰기 시점에 계산해 요약 대상 데이터 옆에 저장한다.매 읽기마다 집계가 돌았을 합계, 평점, top-N.
키-값 & 와이드 컬럼
DynamoDB 설계 용어: 오버로드된 파티션·정렬 키로 여러 엔티티 타입을 한 테이블에 압축한다.조인 없이 한 쿼리로 이기종 항목을 가져온다.
하나의 키 속성이 여러 엔티티 타입을 담당하며 USER#, ORDER# 같은 접두사로 표시된다.단일 테이블 설계. 관련 항목을 한 파티션 아래 모아 한 쿼리로 가져온다.
파티션 키가 행을 노드에 분산하고 정렬 키가 각 파티션을 정렬한다.Cassandra와 DynamoDB. 범위 스캔, 정렬된 로그, 계층형 복합 키.
여러 속성을 구분자로 잇붙인 하나의 정렬 키 — country#region#city — 로 접두사 일치가 계층을 타고 내려간다.계층과 다면 필터. 정렬된 범위 쿼리 하나가 수많은 인덱스 조회를 대체한다.
이벤트를 고정 창 — 시간, 일, 월 — 단위로 전용 파티션이나 테이블 아래 묶는다.메트릭, 로그, IoT 텔레메트리. 파티션 크기를 묶고 콜드 데이터를 만료시킨다.
읽기가 잦은 필드를 레코드들에 복제해 쿼리가 두 번째 조회를 쫓지 않게 한다.결과적 일관성이 감내되고 저장이 값싼 읽기 중심 워크로드.
일부 항목만 가진 속성 위에 세운 보조 인덱스. 값 없는 항목은 인덱스에 들어오지 않는다.대체 접근 경로. 전체 스캔 없이 스파스 부분집합 — 미완료 주문, 미출고 항목 — 을 찾는다.
정확한 쿼리를 먼저 적는다. 테이블 배치는 엔티티나 정규형이 아니라 쿼리에서 도출한다.Cassandra와 DynamoDB 스키마 작업. 쿼리 계열마다 테이블 하나. 데이터 모델이 질문을 베낀다.
맞는 키가 없어 쿼리가 수많은 파티션·노드를 병렬로 때려야 하는 상황.목표가 아니라 설계로 걷어낼 악취. 흔한 쿼리가 한 파티션에 떨어지도록 키를 다시 짓는다.
쓰기 시점에 각 독자 뷰로 복제본을 밀어내거나, 읽기 시점에 모아 병합한다.피드와 타임라인. 작은 오디언스엔 쓰기 시점, 거대한 오디언스엔 읽기 시점.
미리 만들어 둔 쿼리 결과를 자체 테이블로 저장하고 베이스 변화에 맞춰 최신을 유지한다.하나의 쓰기 경로 위의 대체 읽기 형태. 베이스 테이블이 답 못 하는 쿼리를 응답한다.
그래프
각 간선이 출발 노드에서 도착 노드를 가리키는 행이나 튜플이다.그래프·속성 스토어. 친구의 친구 탐색, 라우팅, 추천.
각 관계가 자체 컬렉션의 문서 하나로, from/to id와 링크 속성을 담는다.문서 스토어의 그래프. 링크 자체의 속성 — 평점, 역할, 타임스탬프.
모든 노드가 깊이 우선 순회의 좌·우 카운터를 저장하고 서브트리는 부모 범위 안에 산다.읽기 중심 트리. BETWEEN 쿼리 하나가 서브트리를 반환. 삽입은 순회 번호를 다시 매긴다.
전용 테이블이 깊이 0의 자기 자신을 포함해 모든 조상-자손 쌍을 기록한다.임의 깊이의 전체 브랜치 쿼리. 단순한 조인, 비용은 저장소와 유지보수.
속성 그래프는 노드와 간선에 키-값 속성을 붙이고, RDF는 모든 것을 주어-서술어-목적어 트리플로 서술한다.풍부한 순회에는 속성 그래프(Neo4j), 링크드 오픈 데이터와 온톨로지 교환에는 RDF.
벡터
고차원 float 배열이 메타데이터 옆에 앉는다. ANN 인덱스가 최근접 이웃을 찾는다.시맨틱 검색, RAG 검색, 추천, 비정형 콘텐츠 유사도.
원본 문서를 — 크기, 겹침, 구조 기준으로 — 나눈 뒤 각 조각을 따로 임베딩한다.RAG 검색 품질. 청크 크기는 정밀도와 재현율을 맞바꾼다. 겹침은 잘린 문장을 보호한다.
밀집 벡터 유사도가 키워드 매칭과 나란히 돌고, 두 순위 목록이 하나의 결과로 융합된다.정확한 용어와 의미를 동시에 필요로 하고 메타데이터 필터를 얹는 쿼리.