これについては、Datastax ブログに良いブログ記事があります: http://www.datastax.com/dev/blog/does-cql-support-dynamic-columns-wide-rows
答えはイエスです。CQL3 は動的な列をサポートしていますが、以前のバージョンの CQL で機能していた方法とは異なります。私はあなたの例をよく理解していません.CQL2でもどのように機能したかわかりません。私が正しく理解している場合は、パーティション キー (行キー) が日であり、各目撃情報が時間と名前のペアである船の目撃情報のタイムラインを作成したいと考えています。ここに提案があります:
CREATE TABLE ship_sightings (
day TEXT,
time TIMESTAMP,
ship TEXT,
PRIMARY KEY (day, time)
)
そして、エントリを挿入します
INSERT INTO ship_sightings (day, time, ship) VALUES ('Tuesday', NOW(), 'Titanic')
ただし、おそらくTIMEUUID
代わりにa を使用する必要がありますTIMESTAMP
(主キーは a である可能性がありますDATE
)。そうしないと、同じタイムスタンプを持つ 2 つの目撃情報を追加して、1 つだけが生き残る可能性があります。
これは幅の広い行の例でしたが、動的な列の問題があり、まったく同じではありません。CQL3 での例を次に示します。
CREATE TABLE ship_sightings_with_properties (
day TEXT,
time TIMEUUID,
ship TEXT,
property TEXT,
value TEXT,
PRIMARY KEY (day, time, ship, property)
)
次のように挿入できます。
INSERT INTO ship_sightings_with_properties (day, time, ship, property, value)
VALUES ('Sunday', NOW(), 'Titanic', 'Color', 'Black')
# you need to repeat the INSERT INTO for each statement, multiple VALUES isn't
# supported, but I've not included them here to make this example shorter
VALUES ('Sunday', NOW(), 'Titanic', 'Captain', 'Edward John Smith')
VALUES ('Sunday', NOW(), 'Titanic', 'Status', 'Steaming on')
VALUES ('Monday', NOW(), 'Carapathia', 'Status', 'Saving the passengers off the Titanic')
この種の動的列の欠点は、プロパティ名が複数回保存されることです (したがって、連続して 1000 回の目撃情報があり、それぞれに「Captain」というプロパティがある場合、その文字列は 1000 回保存されます)。オンディスク圧縮により、そのオーバーヘッドのほとんどが取り除かれ、ほとんどの場合、心配する必要はありません。
最後に、CQL3 のコレクションに関する注意事項です。これらは便利な機能ですが、幅の広い行や動的な列を実装する方法ではありません。まず第一に、それらには 65536 アイテムの制限がありますが、Cassandra はこの制限を適用できないため、あまりにも多くの要素を追加すると、後でそれらを読み戻せなくなる可能性があります。コレクションは主に小さな複数値フィールド用です。標準的な例は、各行がエントリであり、エントリには単一の名前しかないが、複数の電話番号、電子メール アドレスなどがあるアドレス帳です。