////
Search

2장 - 데이터 모델과 질의 언어

Date
2022/12/14 07:02
Tags

1. 데이터 모델

데이터 모델은 소프트웨어 개발에서 제일 중요한 부분이다.
데이터 모델은 소프트웨어가 어떻게 작성됐는지, 해결하려는 문제를 어떻게 생각해야 하는지에 대해서도 지대한 영향을 미치기 때문이다.

2. 관계형 모델과 문서 모델

2.1 관계형 모델

오늘날 가장 잘 알려진 데이터 모델
1970년 에드가 코드가 제안한 관계형 모델
데이터는 관계(relation)와 순서 없는 튜플(tuple)의 모음으로 구성된다.
1960-1970년대에 비즈니스 데이터 처리를 하기 위한 것이 근원
트랜잭션 처리(영업, 은행 거래, 항공 예약, 창고 재고 보관) + 일괄 처리(고객 송장 작성, 급여 지불, 보고)

2.2 NoSQL

2010년대에 관계형 모델의 우위를 뒤집으려는 가장 최신시도
Not Only SQL
대규모 데이터셋이나 매우 높은 쓰기 처리량 달성을 관계형 데이터베이스보다 쉽게 할 수 있는 뛰어난 확장성이 필요해짐
상용 데이터베이스 제품보다 무료 오픈소스 소프트웨어에 대한 선호도 확산
관계형 모델에서 지원하지 않는 특수 질의 동작
관계형 스키마의 제한에 대한 불만과 더욱 동적이고 표현력이 풍부한 데이터 모델에 대한 바람

2.3 객체 관계형 불일치

오늘날 대부분의 애플리케이션은 객체지향 프로그래밍 언어로 개발됨
이는 SQL 데이터 모델과 애플리케이션 사이에 거추장 스러운 전환 계층이 필요함
모델 사이의 분리를 임피던스 불일치라고 부름
액티브레코드나 하이버네이트같은 ORM 으로 boilerplate code 를 줄이지만, 여전히 두 모델의 차이가 완벽히 숨길 수 없다.
이력서와 같은 문서는 JSON표현이 더 적합하다.
임피던스 불일치 감소, 스키마 유연성, 더 나은 지역성(locality)
일대다(1:N) 관계 (데이터 트리 구조)

2.4 다대일 다디대 관계

ID나 텍스트 문자열의 저장 여부는 중복의 문제
ID를 사용할 경우 = 참조하는 ID를 한곳에서 관리
ID를 사용하게 된다면 ID 자체의 값은 아무런 의미가 없어야지 변경가능성에 벗어날 수 있다.
의미를 가지게 된다면 ID를 변경해야 하는데 ID의 정보가 중복돼 있으면 모든 중복을 변경해야 한다.
이러한 중복을 제거하는 일이 데이터베이스 정규화의 핵심이다.
텍스트를 사용할 경우 = 중복 저장
사용자 인터페이스에 자유 텍스트 필드가 있다면 평문 저장이 나을 수 있다.

2.4.1 N대 1관계

지역명이나 학교명을 평문으로 저장하게되면, 나중에 이름이 바뀌었을 때 갱신하기 어려워진다.
unique id 로 저장하게 된다면, id 자체는 아무런 의미가 없기때문에 변경할 필요가 없어진다.
id가 의미를 갖게되면, 미래에 언젠가 id를 변경해야할 수도 있다.
이러한 중복된 데이터(N대 1)를 정규화하는 것은 관계형 모델에선 쉽지만, 문서 지향에선 어렵다.
DBMS가 join을 지원해주지 않으면, 어플리케이션에서 다중 질의를 해서 join을 흉내내야 한다.
지금은 join이 필요없게 만들더라도, 비즈니스가 확장되가며, 데이터는 점차 상호 연결되는 경향이 있다.

2.4.2 N대 M관계

2.5 문서 데이터베이스는 역사를 반복하고 있나?

1970년대 비즈니스 데이터 처리를 위해 가장 많이 사용한 DB는 IBM의 IMS(Information Management System) 이다
IMS의 데이터 설계는 계층 모델이라 부르고 이것은 JSON 구조와 비슷하게 중첩된 레코드 트리로 표현한다
문서 DB 처럼 IMS에서도 일대다 관계는 잘 동작하지만 다대다 표현이 어려웠고 조인을 지원하지 않는다
다대다 표현이 어렵기 때문에 데이터를 중복으로 표현할지? 참조를 수동으로 해결할지 결정해야 했다
이러한 어려움을 해결하기 위한 해결책은 관계형 모델과 네트워크 모델이 있다

2.5.1 네트워크 모델 (코다실 모델)

계층 모델을 일반화
계층 모델의 트리구조에서 모든 레코드는 정확하게 하나의 부모가 있지만 네트워크 모델에서는 다중 부모가 있을 수 있다
원하는 레코드에 접근하는 유일한 방법은 최상위 레코드(root)부터 순차적으로 찾는 것이다 이를 접근 경로라고 한다
가장 간단한 경우 접근 경로가 연결 목록의 순회와 같을 때이다
루트부터 순차적으로 시작하여 원하는 것을 찾을때까지 한번에 하나씩 순회하는 방식
다대다 관계에서는 다양한 경로가 어떤 레코드에 도달할 수 있다(다중 부모가 있는 경우)
이렇게 다양한 경로인 경우에 모든 경로를 추적 해야한다
단점
질의와 갱신을 위한 코드가 복잡하여 유연하지 못한 문제
원하는 데이터 경로가 없다면 수많은 DB 질의 코드를 살펴봐야하고 새로운 접근 경로를 다루기 위해 코드를 재작성

2.5.2 관계형 모델

테이블, 로우의 컬렉션이 전부
네트워크 모델과 달리 개발자가 접근 경로를 생각할 필요가 없다
접근 경로를 query optimizer가 대신 작성한다.
네트워크 모델에 비해 유지보수가 쉽다

2.5.3 문서 데이터베이스와의 비교

한 가지 측면에서 계층 모델로 되돌아감
테이블이 아닌 상위 레코드 내에 중첩된 레코드를 저장
다대일, 다대다 표현 시 근본적으로 관계형 데이터베이스와 다르지 않다
서로를 고유한 식별자로서 참조하는데 관계형 모델에서는 외래키, 문서 모델에서는 문서참조(document reference)라고 부른다
이 식별자들은 조인이나 후속 질의를 사용해 읽기 시점에 확인한다

2.6 관계형 데이터베이스와 오늘날의 문서 데이터베이스

2.6.1 어떤 데이터 모델이 애플리케이션 코드를 더 간단하게 할까?

문서와 비슷한 구조(1대N, 트리 구조로 한번에 전체 트리를 적재)라면 문서 모델
상호 연결이 많은 데이터일 수록 문서 모델은 곤란, 관계형 모델은 무난, 그래프 모델은 매우 자연스럽다.

2.6.2 문서 모델에서의 스키마 유연성

사실 스키마가 완전히 없다고 볼 수는 없다.
쓰기 스키마는 없지만, 읽기 스키마가 암묵적으로 존재하기 때문이다.
쓰기 스키마 : 정적 타입 확인, RDB의 방식
이게 없다면 임의의 키와 값을 자유롭게 추가
읽기 스키마 : 동적 타입 확인, 문서DB의 방식
이게 없다면 필드의 존재여부가 보장되지 않음
즉 어플리케이션은 데이터를 읽는 코드가 있으므로 읽기 스키마를 어느정도 가정하고 사용한다.
데이터 타입 변경 예시
문서형의 경우 쓰기의 경우 새로운 필드를 가진 문서를 작성하면 됨, 읽기의 경우 이전 문서 처리에 대한 추가코드를 추가해줘야 함
DB는 마이크레이션이 필요하고 중단시간이 필요함

2.6.3 질의를 위한 데이터 지역성

관련 데이터를 함께 그룹화하는 개념
문서는 json, xml 로 부호화된 문자열이나 BSON 같은 바이너리로 저장된다.
문서 중 일부만을 접근경로로 꺼내서 사용하지 않고, 전체를 잘 사용한다면 지역성의 이점을 누렸다고 볼 수 있다.
전체를 찾아야한다면 RDB는 multi table 을 join 해야하므로 이런 지역성 관점에선 좋지않다.

2.7 데이터를 위한 질의 언어

SQL은 선언형 질의 언어인 반면 IMS와 코다실은 명령형 코드를 사용하여 데이터베이스의 질의한다
명령형 코드
순서대로 어떤 연산을 수행하게끔 컴퓨터에 지시함
명령어를 특정 순서로 수행하게끔 지정하기 떄문에 병렬 처리가 어렵다
선언형 질의
알고자 하는 데이터 패턴에 해당하는 조건, 데이터를 어떻게 변환(정렬, 그룹화, 집계) 할지를 지정함
어떤 색인(index) 어떤 조인(join) 함수를 사용하고 어떤 순서로 실행할지는 질의 최적화기(query optimizer)가 결정함
결과를 결정하기 위한 알고리즘을 지정하는게 아니라 결과의 패턴만 지정하기 때문에 병렬 실행으로 성능이 좋아질 가능성이 크다

2.7.1 맵리듀스 질의

많은 컴퓨터에서 대량의 데이터를 처리하기 위한 프로그래밍 모델
여러 함수형 프로그래밍 언어에 있는 map(collect) 과 reduce(fold or inject) 함수를 기반으로 함
몽고 DB는 집계 파이프라인 Aggregation pipeline이라 부르는 선언형 질의 언어지원을 추가함.
맵리듀스는 연계된 자바스크립트 함수 두 개를 신중하게 작성해야 한다.
질의 최적화기가 질의 성능을 높일 수 있는 기회도 제공

2.8 그래프형 데이터 모델

N대M 관계가 일반적일 때 사용
그래프 = 정점(=노드, 엔티티, vertex) + 간선(관계, 호, edge)
단일 노드에서 사용 예제
소셜 그래프 : vertex = 사람 , edge = 사람들이 서로 알고 있음
웹 그래프 : vertex = 웹페이지 , edge = 다른 페이지로의 링크
ex) pagerank : 웹페이지의 인기와 검색 결과에서 순위 결정
교통 네트워크 : vertex = 교차로 , edge = 교차로 간 도로, 철도
ex) 네비게이션 : 최단 경로 탐색
복합 노드에서 사용 예제
페이스북 : vertex = 사람, 장소, 이벤트, 댓글 등 , edge = 친구여부, 체크인 위치, 이벤트 참석, 포스트 댓글 등
그래프 모델
속성 그래프 모델 : Neo4j, Titan, InfiniteGraph
트리플 저장소 모델 : Datomic, AllegroGraph
그래프 질의 언어
선언형 질의 언어 : 사이퍼(Cypher), 스파클(SPARQL), Datalog
명령형 질의 언어 : 그렘린(Gremlin)
그래프 처리 프레임워크 : 프리글(Pregel)

2.8.1 속성 그래프 모델

정점의 구성 요소
id
유출(outgoing) 간선 집합
유입(incoming) 간선 집합
속성 컬렉션 (키-값 쌍)
간선의 구성 요소
id
간선이 시작하는 정점(tail vertex)
간선이 끝나는 정점(head vertex)
두 정점 간 관계 유형을 설명하는 레이블
속성 컬렉션 (키-값 쌍)
특징
정점은 다른 정점과 간선으로 연결됨 (특정 유형 제한 스키마 x)
일련의 정점을 따라 앞뒤 방향으로 순회
다른 유형의 관계에 서로 다른 레이블 사용 (=> 깔끔한 모델 유지)

2.8.2 사이퍼 질의 언어

사이퍼 (Cypher)
속성 그래프를 위한 선언형 질의 언어
Neo4j 그래프 데이터베이스용으로 제작

2.9 스파클 질의 언어

스파클(SPARQL)은 RDF 데이터 모델을 사용한 트리플 저장서 질의 언어

2.9.1 그래프 데이터베이스와 네트워크 모델의 비교

코다실 데이터베이스는 다른 레ㅁ코드 타입과 중첩 가능한 레코드 타입을 지정하는 스키마가 있다.
그래프 데이터베이스에는 이런 제한이 없다.
코다실에서 특정 레코드에 도달하는 유일한 방법은 레코드 접근 경로 중 하나를 탐색하는 방식
그래프 데이터베이스는 고유id를 가지고 임의 정점을 직접 참조하거나 색인을 사용해 특정 값을 가진 정점을 빠르게 찾는다.

2.10 데이터로그

데이터로그는 스파클이나 사이퍼보다 훨씬 오래된 언어로 1980년대 학계에서 광범위하게 연구됨
질의 언어의 기반이 되는 초석을 제공했음
데이터로그의 모델은 트리플 저장소 모델과 유사하지만 조금 더 일반화됐다.
(주어, 서술어, 목적어)로 트리플 작성하는 대신 서술어(주어, 목적어)로 작성한다.

2.10.1 질의 방법

새로운 서술어를 데이터베이스에 전달하는 규칙을 정의한다.
서술어는 데이터나 다른 규칙으로부터 파생된다.
시스템이 :- 연산자의 오른편에 있는 모든 서술어의 대응을 찾으면 규칙이 적용된다.
규칙이 적용될때 :-의 왼편이 데이터베이스에 추가된다.

정리

역사적으로 데이터를 하나의 큰 트리로 표현하려고 노력했지만 다대다 관계를 표현하기에는 트리 구조가 적절하지 않았음
이 문제를 해결하기 위해 관계형 모델이 고안됨
최근에는 관계형 모델도 적합하지 않은 애플리케이션이 있다고 발견되어 새롭게 NoSQL이 등장함
문서 데이터베이스는 데이터가 문제 자체에 포함돼 있으며 하나의 문서와 다른 문서간 관계가 거의 없는 사용 사례
그래프 데이터베이스는 문서 데이터베이스와는 정반대로 모든 것이 잠재적으로 관련 있다는 사용 사례