카산드라 데이터 모델은 query-driven design을 해야 한다. 자유로운 join/where 연산이 없기 때문이다. 카산드라는 읽기가 아닌 쓰기 성능을 최대화하기 위해 설계되었다. 그래서 데이터를 저장할 때 RDB와 같이 풍부한 인덱싱을 제공하는 B-Tree를 사용하지 않고 순차 쓰기 방식을 적용하는 LSM Tree 기반의 SSTable을 사용하기 때문에 읽기 성능이 떨어져 자유롭게 join/where 연산을 하지 못하도록 한다.
그렇기 때문에 데이터를 모델링할 때 RDB와 다른 방식을 적용해야 한다. 바로, query-driven design 이다. 데이터를 설계할 때 어떤 쿼리를 원하는 지 미리 결정을 하고 그 쿼리에 가장 효율적인 데이터 모델링을 해야 한다. 이를 위해서 고려할 점은 다음과 같다.
1. 각 쿼리가 오직 하나의 partition만 접근하도록 스키마를 설계한다. partition은 보통 100MB 이하의 사이즈로 작게 유지하는 게 좋다.
2. 만약 여러 partition을 접근해야 하는 쿼리가 필요하다면 비동기로 쿼리를 수행하고 클라이언트 단에서 merge를 해야 한다.
3. 한 번의 쿼리에 하나의 partition에 접근하기 위해 다양한 데이터 nesting techniques를 사용하면 좋다.(예를 들어 collection column이나 partition 내에서 정렬된 채로 저장되는 cluster column이 있다.)
4. 필요하다면 데이터를 복사해도 괜찮다.(Denormalization)
'cassandra' 카테고리의 다른 글
Cassandra(카산드라) Denormalization과 logged batch (0) | 2020.01.15 |
---|---|
카산드라(Cassandra) Secondary Index는 사용하지 마라!! (0) | 2020.01.14 |
Cassandra(카산드라) Partition(파티션)/Cluster key에 대해서 (0) | 2020.01.06 |
Cassandra/카산드라 소개 및 특징 (0) | 2019.12.16 |
현대 애플리케이션에서 RDB의 한계 (0) | 2019.12.16 |