# 2장 데이터 모델과 쿼리 언어
데이터 중심 애플리케이션 구축(Designing Data-Intensive Application, 2017) 책을 읽고 정리하였습니다.
아래 블로그에 정리가 잘 되어있어서 필요한 부분만 추가로 작성하였습니다.
1. 위 블로그 요약
3가지 데이터모델 설명 - 문서, 관계형, 그래프
one-to-many(일대다) - 트리구조 데이
문서 데이터 모델형인 JSON으로 표현하는 것이 매우 적합
관계형 모델에서 사용하는 다중 테이블 스키마보다 더 나은 locality를 가집니다.
many-to-one(다대일)
관계형 모델이 적합
문서 데이터베이스는 조인에 대한 지원이 약해서 다대일 관계를 처리하는데 어려움이 있다.
many-to-many(다대다)
관계형 모델도 간단한 다대다 관계를 사용할 수 있지만 연결관계가 복잡해진니다. 이때는, 그래프형 데이터 모델을 고려해봐야 합.니다 다
하나의 모델이 다른 모델을 흉내는 낼 수 있지만 대체할 수 없다.
2. 그래프 모델만 다시정리
그래프 구성
vertices (= 노드)
edges (= 관계 )
데이터를 구조화하고 쿼리하는 몇 가지 다른 방법
프로퍼티 그래프 (property graph model) - Neo4j, Titan, and InfiniteGraph
트리플-저장 모델 (triple-store model) - Datomic, AllegroGraph

이런 구조는 관계형으로 구현하기 힘듭니다.
2.1 프로퍼티 그래프 (property graph model)
2.1.1 VERTEX와 EDGE의 구성요소들
VERTEX(노드)
고유한 식별자
outgoing edge 집합
incoming edge 집합
속성 컬렉션(키-값 쌍)
EDGE(관계)
고유한 식별자
관계가 시작하는 정노드(tail vertex)
관계가 끝나는 노드(head vertex)
두 노드 간 관계 유형을 설명하는 레이블
속성 컬렉션(키-값 쌍)
모든 정점은 다른 VERTEX(노드)과 연결되는 EDGE(관계)를 가질 수 있다. 연관관을 가능하게 또는 가능하지 않게 제한하는 스키마는 없다.
어떤 VERTEX이 주어지면, incoming EDGE와 outgoing EDGE를 모두 효율적으로 찾아 그래프를 가로 지르는 (즉, VERTEX 체인을 통과하는 경로를 따라) 앞뒤로 이동할 수 있다. 따라서 예 2-2에 tail_vertex 및 head_vertex 컬럼 모두에 대한 색인이 있다.
서로 다른 종류의 관계에 서로 다른 레이블을 사용하면 깨끗한 데이터 모델을 유지하면서 여러 종류의 정보를 하나의 그래프에 저장할 수 있다.
2.1.2 사이퍼(Cypher) 질의 언어
프로퍼티 그래프들을 위한 선언형 질의 언어 (Neo4j를 위해 개발되었다.)
그림 1의 아내 Lucy를 사이퍼를 통해 생성 해보자.
관계형 데이터베이스에서 구현한다면...
적절 모델을 사경우에 따라 사용하자.
2.2 트리플-저장 모델 (triple-store model)
비록 속성 모델과 대부분 같지만, 많은 툴과 언어들을 제공하기 때문에 애플리케이션 만드는데 유용하기 때문에 설명한다.
모든 정보는 주어, 동사, 목적어(subject, predicate, object) 형태로 저장된다.
subject는 속성그래프의 노드와 동일하다.
predicate와 object
lucy, age, 33 동사가 없이 숫자, 문자인 경우
predicate = 키 object = 값
lucy, marriedTo, alain 경우
lucy = 꼬리 노드, marriedTo = 동, alain = 머리 노드
트리플-저장은 시멘틱웹에 완전히 독립적이다?
RDF - 동일한 포맷으로 데이타들을 퍼블리싱하기 위해 개발되었다. 사이트끼리 공유가능하다.
Apache Jena를 사용하면 쉽게 RDF 포맷을 변경할 수 있다.
정리
NoSQL이 나오게된 요소
매우 큰 데이터 세트 또는 높은 쓰기 처리량을 포함하여 쉽게 확장
상용 데이터베이스 제품보다 무료 및 오픈 소스 소프트웨어에 대한 선호
관계형 모델에서 잘 지원되지 않는 특수한 쿼리 작업
역동적이고 표현적인 데이터 모델에 대한 요구
객체-관계형 불일치
객체지향과 관계형DB 임피던스 불일치 -> ORM 등장
JSON이 해결한 대안이라 생각했지만...
JSON은 멀티-테이블 스키마보다 지역성이 강하다.
IBM의 IMS(hierarchical model) -> 다대다 관계, 조인 표현 불가
비정규화하여 데이터 중복을 허용해야 하는가 고민(60,70년대)
계층형 모델 제한을 해결하기 위해 관계형, 네트워크형 등장하였으나 네트워크형은 into obscurity.
네트워크형 = CODASYL 모델
외래키를 사용하지않고 프로그래밍 같은 포인터를 사용(저장은 디스크에 했음)
traversal하는 연결리스트랑 비슷
tape drives와 같은 저 사양에서 효율적으로 사용된다.
Summary
역사적으로, 데이터는 하나의 큰나무(계층적 모델)로 표현되었었다.
하지만 다대다 관계들을 표현하기에는 충분하지 못했고 대안으로 관계형모델이 개발되었다.
요즘에는, 이 관계형 데이터베이스가 항상 회사에 서비스 특성에 따라 최적의 데이터모델이 되지 못하였고 새로운 비관계형인 NoSQL(문서지향, 그래프 DB)이 필요하게 되었다.
오늘날 데이터모델로 문서, 관계형, 그래프( document, relational, and graph )가 가장 많이 사용된다. 이 3가지가 각각의 도메인에서 역할을 톡톡히 해주고 있다.
one-size-fits-all 해결법이란 존재하지 않기에 다양한 모델이 나왔다.
document와 graph의 공통점은 저장되는 데이터를 위한 스키마를 강요하지 않는다는 것이다. 이로써, 변화하는 요구사항을 잘 반영할 수 있다.
각 데이터모델은 각자의 질의언어나 프레임워크가 있다.
Last updated