Database/Cassandra

Cassandra Model Design Examples

BUST 2018. 2. 10. 21:24

Cassandra Model Design Examples

https://www.datastax.com/dev/blog/basic-rules-of-cassandra-data-modeling

  • NoSQL 특성상 RDMS의 기능중 하나인 index를 활용하기가 힘들다.
  • 데이터 중복을 허용하고 Partiton Key, Sort Key 를 이용하여 데이터를 핸들링할수 잇도록 한다.
  • 다양한 조건에 맞는 데이터 찾기, group by 기능, order by 기능

Example

Index, Look-up Table

  • user table
  • user에 대한 lookup 테이블 만들기
  • username으로 검색이 필요하다, email로 검색이 필요하다 등

CREATE TABLE users (
    id uuid PRIMARY KEY,
    username text,
    email text,
    age int
)
// Lookup Table
CREATE TABLE users_by_username (
    username text PRIMARY KEY,
    id uuid
)

// Lookup Table
CREATE TABLE users_by_email (
    email text PRIMARY KEY,
    id uuid
)

Group by, salt

  • 1:N (group - users)
  • 기존과 동일하게 lookup table 형식처럼 디자인해도 괜찮다. group를 필요한 key를 Partiton Key를 잡고 새로운 테이블을 만든다.
  • 하나의 group에 user가 많아지면 아래와 같이 hash 값을 이용하는 방법이 좋다.
  • salt(소금)을 쳐서 partiton이 뭉치지 않게 되도록하는 것이 key point (여러 파티션의 데이터를 분산시키기 위한 목)

CREATE TABLE groups (
    groupname text,
    username text,
    email text,
    age int,
    PRIMARY KEY (groupname, username)
)

CREATE TABLE groups (
    groupname text,
    username text,
    email text,
    age int,
    hash_prefix int,
    PRIMARY KEY ((groupname, hash_prefix), username)
)
  • 또 다른 방법으로 lookup table 만들기

CREATE TABLE users (
    id uuid PRIMARY KEY,
    username text,
    email text,
    age int
)

// 데이터의 양이 기존보다 적기 때문에 partiton 데이터가 뭉쳐도 문제가 없을 것이다
CREATE TABLE groups (
    groupname text,
    user_id uuid,
    PRIMARY KEY (groupname, user_id)
)

Order by

  • Sort Key를 활용한다.

CREATE TABLE group_join_dates (
    groupname text,
    joined timeuuid,
    username text,
    email text,
    age int,
    PRIMARY KEY (groupname, joined)
)

SELECT * FROM group_join_dates
    WHERE groupname = ?
    ORDER BY joined DESC
    LIMIT ?

Tip? or Thinking

  • 기존이 있는 테이블에서 기능(group by, order by, lookup) 등을 구현하기 위해 새로운 테이블을 만들때 아래와 같이 데이터를 옮기는 방식이 있을수 있다.

COPY keyspace.columnfamily1 (column1, column2,...) TO 'temp.csv';
COPY keyspace.columnfamily2 (column1, column2,...) FROM 'temp.csv';

select id/*primary key*/, ..., token(id)
  from mytable
  where token(id) >= -9223372036854775808
  limit 10000;


'Database > Cassandra' 카테고리의 다른 글

Apache Cassandra  (0) 2018.09.17
Cassandra Install  (0) 2018.07.28