Skip to main content

Cassandra: The Definitive Guideの7章を読んだ

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を実際にアプリで使う流れを理解しましたとさ
まだまだ続くよ

関連記事:

Pocket