Cassandra: The Definitive Guideの6章を読んだ
の続編
7章はDesigning Applications with Cassandra
この章で実際のアプリの作り方が分かりました
・Selectの結果を改行する
EXPAND ONで改行
・JSONでデータを表示と挿入
テーブル
CREATE TABLE hotel.hotel ( id text PRIMARY KEY, address frozen<address>, name text, phone text, pois set<text> )
JSONのまま挿入
INSERT INTO hotel JSON '{ "id": "A123", "name": "Masterka Hotel", "phone" : "1-888-999-9999", "address" : { "street" : "Masterka Street", "city" : "Japan", "state_or_province" : "JP", "postal_code" : "85255" } }';
SelectはJSONで表示もできる
cqlsh:hotel> SELECT * FROM hotel; @ Row 1 ---------+-------------------------------------------------------------------- id | A123 address | {street: 'Masterka Street', city: 'Japan', state_or_province: 'JP'} name | Masterka Hotel phone | 1-888-999-9999 pois | null cqlsh:hotel> SELECT JSON * FROM hotel; [json] ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ {"id": "A123", "address": {"street": "Masterka Street", "city": "Japan", "state_or_province": "JP", "postal_code": "85255", "country": null}, "name": "Masterka Hotel", "phone": "1-888-999-9999", "pois": null}
・データを複数の条件で取得したいとき
MySQLならソート条件変えたり
どこのカラムでも検索対象にできるがCassandraはそうはいかない
大前提としてallow filtering keywardは使ってはいけない
これを実施するとSSTable全部見に行くのでロードにコストがかかる
これの対策は二種類ある
・セカンダリインデックス
解決策の一つはセカンダリインデックス
ただし、セカンダリインデックスは推奨されない
複数ノードを巻き込むのでコストが高いため
また、カラムは頻繁に更新される
CREATE INDEX on hotel(name); SELECT name from hotel where name = 'Masterka Hotel'; DROP INDEX hotel_name_idx;
・セカンダリインデックスの代替
読み出しを最適化するために以下のどちからかが望ましい
非正規化したテーブルを用意するか
materialized viewを用意する
・Materialized View
解決策のその2
MySQLのViewに該当するMaterialized Viewを使う
CREATE MATERIALIZED VIEW reservation.reservations_by_confirmation AS SELECT * FROM reservation.reservations_by_hotel_date WHERE confirm_number is not null and hotel_id is not null and start_date is not null and room_number is not null primary key (confirm_number, hotel_id, start_date, room_number);
ワロタ
Materialized views are experimental and are not recommended for production us.
これでCassandraを実際にアプリで使う流れを理解しましたとさ
まだまだ続くよ
関連記事:
- Cassandra: The Definitive Guideの3章と4章を読んだ
- Cassandra: The Definitive Guideの13章と15章を読んだ
- マイクロサービスで利用するMySQLのView機能を使ってみた