데이터중심 애플리케이션 설계 #2 - 데이터 모델과 질의 언어
본문 바로가기


Programmer/hadoop

데이터중심 애플리케이션 설계 #2 - 데이터 모델과 질의 언어

이 장에서는 데이터 저장과 질의를 위한 다양한 범용 데이터 모델을 살펴본다. 특히 관계형 모델과 문서모델, 그리고 몇 가지 그래프 기반 데이터 모델을 비교한다. 또한, 다양한 질의 언어를 살펴보고 사용 사례도 비교한다.

관계형 모델과 문서 모델

오늘날 가장 잘 알려진 데이터 모델은 1970년 에드가 코드가 제안한 관계형 모델을 기반으로 한 SQL이다. 데이터는 (SQL에서는 테이블이라 불리는) 관계(relation)로 구성되고, 각 관계는 순서 없는 튜플(tuple)(SQL에서 로우(row)) 모음이다.

관계형 데이터베이스의 근원은 1960년대와 1970년대에 메인프레임 컴퓨터에서 수행된 비즈니스 데이터 처리에 있다. 이 사용 사례는 보통 트랜잭션 처리와 일괄처리였다. 관계형 모델의 목표는 정리된 인터페이스 뒤로 구현 세부 사항을 숨기는 것이다.

NoSQL의 탄생

Not only SQL으로, 관계형 모델의 우위를 뒤집으려는 가장 최신 시도다. 아래와 같은 원동력들이 있다.

  • 대규모 데이터셋이나 매우 높은 쓰기 처리량 달성을 관계형 데이터베이스보다 쉽게 할 수 있는 뛰어난 확장성의 필요
  • 상용 데이터베이스 제품보다 무료 오픈소스 소프트웨어에 대한 선호도 확산
  • 관계형 모델에서 지원하지 않는 특수 질의 동작
  • 더욱 동적이고 표현력이 풍부한 데이터 모델에 대한 바람

애플리케이션은 저마다의 요구사항이 다르다. 각 사용 사례에 맞는 최적의 여러가지 기술 선택이 있을 수 있다. 가까운 미래에는 관계형 데이터베이스가 폭넓은 다양함을 가진 비관계형 데이터스토어와 함께 사용될 것이다. 이러한 개념을 다중 저장소 지속성이라고 한다.

  • 임피던스 불일치: 데이터를 관계형 테이블에 저장하려면 애플리케이션 코드와 데이터베이스 모델 객체 사이에 거추장스러운 전환 계층이 필요하다. 이런 모델 사이의 분리가 이것이다.

데이터 베이스의 역사

  • 1970년대:
    • 계층모델: 문서데이터베이스에서 사용하는 JSON 모델과 비슷. 일대다 관계에서는 잘 동작하지만 다대다 관계표현이 어려움
    • 관계형 모델: SQL의 전신, 모든 데이터를 배치하고 query optimizer가 질의어가 요청한 데이터 형테의 데이터를 출력
    • 네트워크 모델: 코다실이라고 불리는 위원회에서 표준화. 코다실 모델. 계층 모델을 일반화. n차원 데이터 공간을 항해하는 것
  • 1980년대:
    • SQL 개발
  • 1990년대:
    • 객체형 데이터베이스
  • 2000 년대
    • XML 데이터베이스: 문서형 데이터베이스는 저장소 지역성ㅇ 성능 이점이 있다.
  • 2010년대
    • NoSQL: 문서 모델으로, 다대다 관계에는 성능이 좋지 않다. 읽기 스키마를 사용하므로 스키마다 유연하다.

데이터를 위한 질의 언어

선언형 질의 언어

SQL이나 관계 대수 같은 선언형 질의 언어에서는 목표를 달성하기 위한 방법이 아니라 알고자 하는 데이터의 패턴, 즉 결과가 충족해야 하는 조건과 데이터를 어떻게 변환할지를 지정하기만 하면 된다.

일반적으로 명령형 API보다 더 간결하고 쉽게 작업할 수 있다. 게다가 데이터베이스 상세 구현이 숨겨져 있어 질의를 변경하지 않고도 데이터베이스 시스템의 성능을 향상시킬 수 있다는 점이다.

그리고 종종 병렬 실행에 적합하다. 

에서도 선언형 질의를 사용한다. HTML과 CSS가 있다.

명령형 질의 언어

IMS와 코다실에서 사용하는 질의 언어로, 프로그래밍 언어와 비슷하다.

명령어를 특정 순서로 수행하게끔 지정하기 때문에 다중 코어나 다중 장비에서 병렬 처리가 어렵다.

맵리듀스 질의

맵리듀스는 많은 컴퓨터에서 대량의 데이터를 처리하기 위한 프로그래밍 모델이다. 선언형 질의 언어도 완전한 명령어 질의 API도 아닌 그 중간 정도에 있다. 질의 로직은 처리 프레임워크가 반복적으로 호출하는 조각 코드로 표현한다. 맵리듀스는 여러 함수형 프로그래밍 언어에 있는 map과 reduce 함수를 기반으로 한다.

몽고 DB에서 맵리듀스 질의를 사용하는데, 해당 함수들이 순수함수여야 하고 연계된 자바스크립트 함수 두 개를 신중하게 작성해야한다는 점등이 질의를 작성하는데 허들이 된다. 이런 이유로 몽고DB 2.2는 집계 파이프라인이라 부르는 선언형 질의 언어 지원을 추가했다.

그래프형 데이터 모델

데이터에서 다대다 관계가 매우 일반적일 때 사용하면 좋은 모델이다. 그래프는 두 유형의 객체로 이뤄진다. 정점(vertex)(노드나 엔티티라고도 한다)과 간선(edge)(관계나 arc(호)라고도 한다)이다. 

그래프형 데이터 모델에도 속성 그래프 모델, 트리플 저장소 모델처럼 나눠질 수 있다. 데이터를 구조화하고 질의하는 몇 가지 다른 방법에 따라 분리된다.

속성 그래프 모델

각 정점은 고유한 식별자, outgoing(유출) 간선 집합, incoming(유입) 간선 집합, 속성 컬렉션(키-값 쌍) 요소로 구성되고,
각 간선은 고유한 식별자, 간선이 시작하는 정점, 간선이 끝나는 정점, 두 정점 간 관계 유형을 설명하는 레이블, 속성 컬렉션(키-값 쌍) 요소로 구성된다.

속성 그래프 모델 중 Neo4j 그래프 DB에는 사이퍼(Cypher)라는 속성 그래프를 위한 선언형 질의 언어를 사용한다.

SQL으로는 어려울까? 만들수는 있지만 약간 어렵다. 몇개의 간선을 순회해야하는지 알 수 없기 때문이다. 재귀 공통 테이블 식(With Recursive문)을 사용해서 표현할 수 있지만, 사이퍼와 비교하면 문법이 매우 어렵다.

트리플 저장소 모델

트리플 저장소 모델은 속성 그래프 모델과 거의 동등하다. 같은 개념을 다른 용어로 설명하는 모델이다.

트리플 저장소는 모든 정보를 매우 간단한 세 구문 형식으로 저장한다. (주어, 서술어, 목적어 처럼) Notation3(N3)의 부분 집합인 Turtle 형식으로 데이터의 구조를 작성할 수도 있다.

트리플 저장소 모델의 스파클 질의 언어

SPARQL은 RDF 데이터 모델을 사용한 트리플 저장소 질의 언어다. RDF 데이터 모델은 자원 기술 프레임워크(Resource Description Framework)로, 서로 다른 웹 사이트가 일관된 형식으로 데이터를 게시하기 위한 방법을 제안한다. 서로 다른 웹 사이트의 데이터가 데이터 웹에 자동으로 결합할 수 있도록.

스파클이 사이퍼보다 먼저 만들어졌고, 스파클이 사이퍼의 패턴 매칭을 차용했으므로, 매우 유사하게 보인다.

참고: 데이터로그

데이터로그(Datalog)는 스파클이나 사이퍼보다 훨씬 오래된 1980년대에 연구된 언어로 질의 언어의 초석을 제공한다. 트리플 저장소 모델처럼 (주어, 서술어, 목적어)로 트리플을 작성하는 대신 서술어(주어, 목적어)로 작성한다. 

데이터로그의 접근 방식은 다른 질의의 규칙을 결합하거나 재사용할 수 있기 때문에 매우 강력한 접근 방식이다.