2. Cassandra
● 分散 key-value store
o “schema-optional”
● Fault tolerance、可用性
o 自動レプリケート
o 単一障害点なし
● リニアにスケールする
● Eventual consistency
o チューニング可能
● 複数DC構成を考慮した設計
3. データ構成
● keyspace ≒ DB スキーマ
● column family ≒ DBテーブル
● unique primary key 必須
● 型あり:int, varchar, timestamp, uuid, ...
Column family: Users
123
Primary key
user_id
name
Chris
age
29
likes
ramen
dislikes
sushi
456
name
Bob
age
35
7. CQL: SELECT
SELECT * FROM users;
user_id | age | dislikes | likes | name
---------+-----+----------+-------+-------
123 | 30 | sushi | ramen | chris
456 | 35 | null | null | bob
(2 rows)
● レコードはPRIMARY KEYでソートされる
● レコード内のキーはアルファベット順でソートされる
8. クエリ制限(1)
● 任意のキーでクエリできない
o PRIMARY KEY、インデックスされたキーのみ
cqlsh:demo> SELECT * FROM users WHERE user_id = 123;
user_id | age | dislikes | likes | name
---------+-----+----------+-------+-------
123 | 30 | sushi | ramen | chris
cqlsh:demo> SELECT * FROM users WHERE name = 'chris';
Bad Request: No indexed columns present in by-columns
clause with Equal operator
9. クエリ制限(2)
● JOINができない
o アプリ側でJOINする、or
o materialized view作る(denormalization)
クエリに対応するテーブルを作成する
アプリ側でテーブル内容を常時更新する
SQL
select u.id, p.name
from user u join product p on u.product_id = p.id
CQL
select user_id, product_name from user_product