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';
- 아니면 batch 형식의 application를 활용하는 방법? Full Scan이 필요함.
- Full Scan with Cassandra :
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 |