집합적 데이터 모델

‘빅데이터 세상으로 떠나는 간결한 안내서 NoSQL’를 읽고 정리하고자함


요점 정리

  • 집합은 상호작용할 때 단위로 사용하는 NoSQL의 데이터 모음
  • 집합은 데이터베스의 ACID 연산에 대한 경계를 형성
  • 키-값, 문서, 칼럼-패밀리 데이터베이슨느 모두 ‘집합-지향 데이터베이스’로 볼 수 있음
  • 집합을 사용하면 클러스터에서 데이터 저장소를 관리하기 쉬어짐
  • 집합-지향 데이터베이는 모든 데이터 상호작용이 같은 집합으로 이루어질 때 가장 좋음
  • 상호작용에 여러 가지 다른 형태로 조직된 데이터가 사용된다면 집합 무지 데이터베이스가 나

1. 집합적 데이터 모델이란?

  • 데이터 모델
    • 데이터를 인식하고 조작하는데 사용되는 모델
    • 애플리케이션에서 특정 데이터의 모델
    • 데이터베이스가 데이터를 구조화하는 모델 ( = 메타모델 )
  • 20여 년간 지배적인 데이터모델은 ‘관계형 데이터 모델’, 즉 테이블 집합
    • 각 테이블은 행을 라지며, 각 행에는 개체(entity)를 표현
    • 개체는 여러 개의 칼럼으로 기술하며, 각 칼럼은 하나의 값을 가짐
    • 칼럼은 같은 테이블이나 다른 테이블에 있는 행을 참조할 수 있고, 각 개체 간 관계가 설정 (관계, 튜플)
  • NoSQL의 가장 명확한 변화는 ‘관계형 모델’에서부터 멀어진 데이터 모델을 사용
  • NoSQL 솔루선들은 각각 다른 모델을 사용하지만, NoSQL의 생태계에서 4가지의 분류의 데이터 모델을 사용함
    1. 키-값
    2. 문서
    3. 칼럼 패밀리
    4. 그래프
    1. 키-값 , 2.문서 , 3.칼럼 패밀리는 ‘집합-지향 (aggregate orientation)’이라는 특징을 공유함

2. 집합

  • 관계형 모델의 특징
    • 관계형 모델에서는 저장하고자 하는 정보를 튜플(행)으로 나눔
    • 이 튜플은 제한적인 데이터구조로, 여러개의 단순한 값을 모아놓은 것으로, 한 튜플을 다른 튜플에 넣어 중첩 레코드를 만들 수 없음
    • 모든 연산은 튜플에 적용하고 튜플을 리턴하는 것으로 생각하는 단순성이 관계형 모델을 뒷받침함
  • 집합 지향 모델의 특
    • 튜플의 집합보다 더 복잡한 구조를 데이터의 단어로 다루고 싶어함
    • 리스트나, 중첩된 레코드를 허용하는 복잡한 레코드로 생각하는 것이 편함
    • 키-값, 문서, 칼럼 패밀리 모두 복잡한 레코드을 사용하며, 이 것을 ‘집합’이라고 정의함
  • 집합이란?
    • 도메인 주도 개발에서는 집합은 ‘단위로 다루고 싶은 객체의 무리’를 뜻함
    • 집합은 데이터 조작과 일관성 관리의 단위
    • 원자적 연산으로 집합을 업데이트하고, 데이터 저장소와도 집합 단위로 통신
    • 집합은 복제나 샤딩에서의 단위가 되므로 클러스터에서 처리하는 것도 쉬어짐
    • 애플리케이션에서도 데이터를 집합 구조로 조작하는 경우가 많으므로, 작업하기에도 더 쉬움
    • 집합의 경계는 데이터를 조작하는 방식에 따라 완전히 달리짐
  • 관계형 데이터베이스는 데이터 모델에 집합개념이 없어 ‘집합 무지(aggregate ignorant)’라고도 불를 수 있음
    • 그래프 데이터베이스도 ‘집합 무지’
  • 집합 무지가 나쁜 것이 아니며, 데이터를 보기가 쉽고 다양한 데이터 조작 방법이 필요한 경우라면 집합 무지 모델이 더 좋은 선택일 수 있음

  • 집합 지향이 중요한 이유는 ‘클러스터에서 동작’하기 좋기 떄문임
    • NoSQL이 각광받는 핵심 요인
  • 관계형 데이터베이스의 ACID 트랙잭션
    • 관계형 데이터베이스에서는 단일 트랙잭션(ACID)안에서 어떤 테이블의 어떤 행이든 조합해 조작할 수 있음
    • 원자적(Atomic), 일관성을 유지하고(Consistent), 격리되어 있으며(Isolated), 영속적(Durable)
    • 가장 중요한 요인은 ‘원자성’으로, 여러 데이블에 있는 많은 행이 하나의 연산으로 업데이트되며, 이 연산은 전체가 성공하거나 실패하며, 동시적 연산은 서로 격리되어 일부만 갱신된 정보를 볼 수 없음
  • NoSQL의 ACID 트랜잭션
    • 사실상, ACID 트랙잭션을 제공하지 않아, 데이터의 일광성을 희생하는 것이라고 흔히 말함
    • 보통, 집합 지향 데이터베이스는 여러 집합을 포괄하는 트랙잭션을 지원하지 않는 대신 ‘한 번에 한 집합에 대한 원자적 조작’은 지원함
    • 즉, 집합 여러 개를 원자적 방법으로 조작해야한다면, 애플리케이션 코드내에서 처리를 해야함
    • 실제로 원자성이 필요한 범위를 한 집합 내로 한정할 수 있는 경우가 대부분이며, 가장 중요하게 고민해야할 것은 ‘데이터를 집합으로 어떻게 나눌 것인가’

3. 키-값 모델과 문서 데이터 모델

  • 두 가지 모두, 집합 지향적이며 많은 집합으로 구성되어 있고 각 집합은 데이터를 얻는데 사용하는 key나 id를 가짐

키-값 데이터베이스

  • 집합 구조가 불투명, 대부분 의미 없는 바이너리 데이터 처럼 취급
    • 이로 인해, 집합 안에 무엇이든 저장할 수 있다는 장점이 있음
  • 키를 통해서만 집합에 접근할 수 있음

문서 데이터베이스

  • 집합 구조가 투명, 집합의 구조를 볼 수 있음
    • 이로 인해, 집합에 허용되는 구조와 타입을 정의해 그 안에 들어갈 수 있는 것을 제한
  • 집합의 필드를 이용해, 집합의 전체 또는 일부를 조회할 수 있으며, 집합의 내용을 이용해 인덱스를 만들 수 있음

  • 사실상 두 데이터베이스의 구분이 모호해졌음
  • 키-값 형태로 검색하려고 문서 데이터베이스에 ID 필드를 넣기도 함
  • 키-값 데이터베이스는 불투명한 집합 이상의 데이터 구조 정의를 허용함
    • 리악은 인덱스 생성이나 집합간 연결을 위해 메타데이터 추가를 허용
    • 레디스(Redis)는 집합을 리스트나, set으로 분해하는 것을 허용
  • solr 같은 검색 도구를 통합해 쿼리를 지원할 수 있으며, 리악은 JSON이나 XML 구조로 저장된 집합에 솔라와 비슷한 방식으로 검색을 실행하는 기능도 포함되어 있음

  • 모호할 수 있지만, 일반적인 구분은 다음과 같다
    1. 키-값 데이터베이스에서는 키를 통해 집합을 찾음
    2. 문서 데이터베이스는 문서 내부 구조를 기초하여 어떤 형태의 쿼리를 실행함
      • 키를 사용할 수 있지만 대부분의 경우 다른 것을 사용

4. 칼럼 패밀리 저장소

  • 구글의 빅 테이블은 초창기부터 많은 영향을 미친 NoSQL 데이터베이스 중 하나 (Hbase, Cassandra에 영향을 줌 )
  • 테이블의 구조 보다는, 두단계로 된 Map 형태로 생각하는 것이 더 편함
  • 빅 테이블 형식의 데이터 모델을 가진 데이터베이스는 흔힌 ‘칼럼 저장소’라고 부름
  • 대다수 데이터베이스는 행을 저장 단위로 다뤄 ‘쓰기’ 성능에 도음을 줌
  • 그러나 쓰기는 거의 없지만 많은 행에 대해 몇개의 칼럼만 한꺼번에 읽어야하는 경우에는 ‘모든 행에 대한 칼럼 그룹(칼럼 패밀리)를 저장 단위로 사용하는 편’이 더 나음
  • 이런 이유로, 이런 데이터베이스를 ‘칼럼 저장소’라고 부른 것

  • 칼럼 패밀리 저장소의 데이터 모델
    • 두단계로 된 Map 형태
      1. 첫번째 키는 보통 행의 ID로, 관심 집합을 찾는데 사용
      2. 두 번째 단계의 값을 칼럼으로 부르고, 행 전체에 접근하는 것 뿐아니라, 특정 칼럼만 고를 수 있음
        • 다른 집합 저장소와 칼럼 패밀리 구조의 다른 점은 행 집합 자체가 좀 더 구체적인 값의 Map으로 되어 있다는 점
  • 칼럼-패밀리 데이터베이스는 ‘칼럼을 칼럼 패밀리로 구조화’
  • 특정 칼럼 패밀리에 대한 데이터는 보통 함께 접급된다는 가정하에, 각 칼럼은 칼럼 패밀리의 일부가 되어야하고 칼럼은 접근 단위로 동작

  • 데이터 구조화에 대한 방법
    1. 행-지향
      • 각 행은 집합이고, 칼럼 패밀리는 그 집합안의 유용한 데이터 덩어리를 표현 e.g) 집합=(id가 1234인 고객), 칼럼 패밀리=(프로파일,주문내역)
  1. 열-지향 (칼럼-지향)
    • 각 칼럼 패밀리는 각 레코드의 행으로 레코드 타입을 정의 ( 레코드 타입 =(고객의 프로파일) )
    • 행은 모든 칼럼 패밀리의 레코드를 연결한 것으로 생각할 수 있음
    • 칼럼-패밀리 데이터베이스의 칼럼적 특성을 반영ㄹ한 것
    • 데이터베이스가 데이터의 공통 그룹에 대해 알고 있으므로, 데이터를 저장하거나 접급할 때 이 정보를 이용할 수 있음
    • 문서 데이터에비으소도 어떤 구조를 선언하지만, 각 문서는 한 단위로 보지만, 칼럼 패밀리 데이터베이스는 칼럼 패밀리에 2차원적 특징을 부여
  • 행에 새로운 칼럼을 추가하는 것은 데이터베이스에 접근해 쉽게 처리할 수 있음
  • 하지만, 새로운 칼럼 패밀리를 정의하는 것은 드물긴하지만 데이터베이스를 정지해야할 수 도 있음

  • 칼럼을 자유롭게 추가할 수 있으므로, 목록의 각 항목을 별도의 칼럼으로 만드는 식으로 목록 모델을 만슬 수 있음
  • 행을 ‘집합’ 이라고 생각하고, Cassandra는 ‘넓은’,’좁은’ 용어를 사용함

1.좁은 행

  • 많은 행에 결쳐 몇 개 안되는 동일한 컬럼을 사용
  • 이 경우는, 칼럼 패밀리는 레코트 타입을 정의하며 각 행은 레코드가 되고 각 칼럼은 필드가 된다
  1. 넓은 행
    • 많은 (수천개) 칼럼을 가지며, 행마다 아주 다른 컬럼을 가진다
    • 넓은 칼럼 패밀리는 리스트 모델을 만드는데, 각 칼럼은 리스트의 요소가 된다
    • 칼럼 패밀리가 칼럼 정렬 순서를 정의 할 수 있으며, 키, 범위에 접근할 수 있음
  • 칼럼 패밀리를 넓은, 좁은 특징으로 구분하는 것은 유용하지만, 컬럼패밀리가 필드 형식 칼럼과 리스트 형식의 칼럼을 모두 포함하지 못할 기술적 이유가 없음

5. 집합 지향 데이터베이스 요약

  • 세가지 모두 ‘집합’ 이라는 개념을 공유함
  • 이 집합은 검색할 수 있도록 key로 색인되어 있음
  • 집합은 클러스터에서 실행되는데 가장 중요한 개념으로, 한 집합으로 구성된 데이터는 모두 한 노드에 저장됨을 데이터베이스가 보장함
  • 집합은 또한 업데이트에 대한 원자적 단위로 동작해, 제한적이지만 유용한 정도의 트랙잭션 제어를 제공

  • 집합 지향 데이터베이스에서의 ‘집합’의 정의
  • 키-값
    • 집합은 불투명한 덩어리로 취급하며, 집합을 키로만 찾을 수 있음. 집합의 일부를 질의하거나 꺼내올 수 없음
  • 문서
    • 집합이 데이터베이스에 투명하고, 집합의 일부로 쿼리를 하고 일부만 가져올 수 있음,
    • 하지만 문서는 스키마가 없어서 데이터베이스가 집합의 일부를 저장하거나 꺼내올 때 문서 구조를 최적화할 수 잇는게 별로 없음
  • 칼럼 패밀리
    • 집합을 칼럼 패밀로 나누어, 데이터베이스가 칼럼 패밀리를 행 집합 내 단위로 다룸
    • 집합에 구조를 강제하지만, 데이터베이스가 이 구조 정보를 이용해 접근성을 향상시킬 수 있음