Cassandra db - 데이터 모델링
데이터 모델링을 하기 위해 호텔 도메인을 이용해보자. 호텔에 객실에 머무는 게스트가 있고 각 호텔은 여러개의 Room 을 가지고 있다. 게스트가 예약한 Room 에 대한 정보가 있고 각 Room 에서 제공되는 Amentity 가 있다. 관심이 있을만한 "공원", "박물관", "쇼핑" 과 같이 게스트들이 관심있어할만한 데이터 또한 Point Of Interest 에 저장된다.
RDBMS Design
만약 당신이 새로운 데이터 기반 Application 을 구축한다면, 적절한 normalized 테이블과 FK 를 사용하여 데이터를 모델링할것이다.
아래 도표는 관계형 데이터베이스를 사용한 데이터 모델링을 나타낸다. 관계형 데이터베이스는 Many to Many Join 을 활용한다.
Hotel <-> Points , Rooms <-> Amentities , Room <-> Availability, Guests <-> Rooms
Design Differences Between RDBS and Cassandra
카산드라와 관계형 데이터베이스 모델링의 주요 차이점을 강조해보자.
No joins
카산드라에서는 Join 을 사용할 수 없다. 데이터 모델링을 하였는데 Join 을 사용해야 한다면 Client Side 에서 수행하거나 조인 결과를 나타내는 비정규화 테이블을 따로 생성해야한다. 후자의 방법이 카산드라에서는 선호된다. Client Side 에서 조인을 하는 것은 극히 드문 경우이다. 데이터 중복을 극도로 피하고 싶다면 사용한다.
No referential integrity
비론 카산드라는 경량화된 트랙잭션과 Batch 와 같은 기능을 제공하지만 카산드라는 테이블간의 참조 무결성에 대한 개념이 없다. 관계형데이터베이스에서 다른 테이블의 데이터에 접근하기 위해서 FK 를 지정했다. 그러나 카산드라는 이것을 강요하지 않는다. 다른 테이블의 ID 를 저장하는 것은 일반적인 설계이기는 하지만 Cascading Delete 와 같은 기능은 제공되지 않는다.
Denormalization
관계형 데이터베이스 설계에서 정규화의 중요성에 대해서 배웠을 것이다. 카산드라에서는 비정규화 되었을때 성능이 극대화되기 때문에 정규화에 대한 이점이 없다. 기업들이 관계형 데이터베이스의 데이터를 정규화 하지 않는 것은 종종 있는 일이다. 여기에는 크게 두가지 이유가 있다. 하나는 성능이다. 기업은 수많은 Join 을 통해 그들이 필요한 데이터를 추출하는데 원하는 성능을 얻지 못하기 때문에 비정규화 한다. 이러한 설계는 동작하기는 하지만 관계형 데이터베이스 설계 방식에 어긋나는 것이다.
두번째 이유는 보존이 필요한 비지니스 문서일 경우이다. 다른 테이블들과 많은 Join 이 걸려있는 데이터이지만 이 데이터를 보존해야하는 겨우가 있을 수 있다. 송장과 관련된 예제가 있다. 이미 Customer 와 Product 테이블이 있고 이 테이블드과 관계가 있는 Inovice 테이블을 만든다고 생각해보자. 그러나 실제로 해서는 안된다. 고객과 가격 정보는 변경될 수 있고 법, 보고서, 위법행위와 관련된 Invoice 데이터는 유실 될 수 있다.
관계형 세계에서, 역정규화는 피해야한다. 하지만 카산드레아서는 그렇지 않다.
Query-first design
관계형 모델리은 간단하게 말해서 도메인 테이블에 도메인 개념을 나타내는 것이다. 그 후에 관계에 따라서 PK 와 FK 를 할당한다. Many-to-Many 관계가 있을 경우에 Join 을 위한 테이블을 생성한다. 이 Join 테이블은 실제 세계에 존재하지 않는다. 그리고 이 테이블은 관계형 데이터 모델링의 부작용으로 나타났다. 모든 테이블을 갖춘 후에 Key 로 정의된 관계에 따른 쿼리를 작성한다. Join 에 의한 복잡한 Subquery 가 생겨나게 된다.
대조적으로 카산드라는 데이터 모델링부터 시작하지 않는다. 쿼리 모델부터 시작하게된다. 데이터 모델링을 하는 대신에 쿼리를 먼저 작성하고 데이터를 정리한다. Application 에서 사용하는 가장 대중적인 쿼리를 생각하고 그 쿼리를 제공하기 위한 테이블을 만든다.
출처 - https://cassandra.apache.org/doc/latest/cassandra/data_modeling/data_modeling_rdbms.html