지난주 Cassandra 에 관하여 간단히 소개를 한 바 있다. 요약하자면 BigData의 컬럼 기반 모델과 Dynamo의 분산 모델을 기반으로 Facebook 에서 만든 NoSQL 중 하나이다.

이번에는 Cassandra 의 데이터 모델에 대하여 좀더 소개하려고 한다.

 

1. Column

Cassandra 에 저장되는 데이터의 최소 단위인 Column 은 가장 기본적으로 name, value 로 구성되어 있다. name 은 미리 정의되어 있을 수도 있고 애플리케이션에서 동적으로 생성할 수도 있다. 또한 반드시 존재해야 하는 것이 아니라서, 경우에 따라 name 이 비어있을 수도 있다. 

RDB 에서의 column 은 운영 중에 거의 변경될 일이 없다. 또한 DBMS 에 따라 그 갯수도 제한될 수 있다. 그러나 Cassandra 에서의 Column 은 저장되는 데이터 그 자체로 그 Column name 은 데이터의 속성을 나타내는 태깅 용도와 식별자 용도 정도이다. 

timestamp 는 가장 최근 업데이트된 시간이 기록된다. 여러 세션이 동시에 column 에 접근하여 업데이트하려고 할 때 이 timestamp 를 활용한다.

Column 마다 선택적으로 소멸 시점을 알려주는 TTL (time to live) 정보를 가질 수 있다. 

Super Column 은 Column 을 그룹핑한 것이다. (아래에서 설명할 Column Family 를 사용할 수도 있지만 비정규화를 통한 검색의 효율을 높이기 위하여 Super Column 을 사용한다)

 

2. Column Family

Column Family 는 이름 처럼 Column 의 집합으로 Column 과  Row 로 구성되어 있다. RDB 의 테이블과 비슷하다고 생각할 수 있겠지만 다소 차이점이 존재한다.

RDB : 테이블 설계 시점에 column 이름과 속성을 정의한다. 따라서 애플리케이션에서는 그 정의를 따라야만 한다.

Cassandra : Column Family 는 메타 데이터만 가지고 있으며, 애플리케이션에 의하여 만들어진다. 따라서 각 Row 마다 다른 column 을 가질 수 있게 된다.

Column Family 는 크게 Static Column Family 와 Dynamic Column Family 로 나눌 수 있다.

- Static Column Family : RDB 와 같이 미리 column 이 정의되어 있다. RDB 와의 차이점은 모든 column 을 사용하지 않아도 된다는 점이다.

- Dynamic Column Family : 애플리케이션에서 컬럼을 생성한다. 

모든 Column Family 에는 각 Row 별로 유일한 값인 Row Key 가 있는데 RDB 의 Primary Key 와 유사한 것이다. Column Family 는 이 Row Key 를 기준으로 파티션되며, Row Key 는 항상 인덱싱되어 있다.

 

 

3. Keyspace

Cassandra 의 Keyspace 는 RDB 의 스키마 개념과 유사하다. 일반적으로 Column Family 의 집합으로 블로그의 예를 들 수 있다. 하나의 블로그 게시물이 Column Family 라고 하면 이 게시물들의 모음을 Keyspace 라고 할 수 있다.

 

정리하자면 Cassandra 의 데이터 모델은 다음과 같다.

Column -> (Super Column) -> Row -> Column Family -> Keyspace