0

n個のプロパティP1、P2 ... PNを持つ「アイテム」というグループを格納するためのcassandraモデルをどのように設計し、値でアイテムプロパティを検索してアイテムを取得できますか?

例えば

Item  Item_Type   State  Country

Item1  Solid      State1 Country1

伝統的RDBMSに、選択クエリを発行できます

select Item from table where Item_Type='Solid' and Country='Country1'

どうすればこのようなモデルを実現できますかNoSql Cassandracassandra のセカンダリ インデックスを試しましたが、適用できないようです。

4

2 に答える 2

1

多くの Cassandra データ モデリングの質問に対する答えは、非正規化です。

自分でインデックスを作成することで問題を解決できます。プロパティごとに、プロパティ名をキーとし、値と項目 ID を列とする行があります。

CREATE TABLE item_index (
  property TEXT,
  value TEXT,
  item_id TEXT,
  PRIMARY KEY (property, value, item_id)
)

アイテム用のテーブルも必要です。

CREATE TABLE items (
  item_id TEXT,
  property TEXT,
  value TEXT,
  PRIMARY KEY (item_id, property)
)

(複数のアイテムが同じプロパティに対して同じ値を持つことができると想定しているため、テーブルでitem_indexは 3 つの列すべてが主キーにあることに注意してください。プロパティの値は 1 つだけです -- 複数値のプロパティについてもこれを解決できますが、さらにいくつかのことを行う必要があり、例が複雑になります)itemsitem_idproperty

アイテムを挿入するたびitem_indexに、アイテムの各プロパティのテーブルに行も挿入します。

INSERT INTO items (item_id, property, value) VALUES ('thing1', 'color', 'blue');
INSERT INTO items (item_id, property, value) VALUES ('thing1', 'shoe_size', '8');
INSERT INTO item_index (property, value, item_id) VALUES ('color', 'blue', 'thing1');
INSERT INTO item_index (property, value, item_id) VALUES ('shoe_size', '8', 'thing1');

(アイテムを単一のBATCHコマンドとして挿入することもできます)

靴のサイズでアイテムを見つけるには、2 つのクエリを実行する必要があります (申し訳ありませんが、それは柔軟性を得るために支払う代償です。2 つのクエリを必要としないソリューションを他の誰かが考え出すことができるかもしれません)。

SELECT item_id FROM item_index WHERE property = 'shoe_size' AND value = '8';
SELECT * FROM items WHERE item_id = ?;

ここで、 the?item_id最初のクエリから返された の 1 つです (複数が一致する可能性があるため、覚えておいてください)。

于 2013-07-08T19:06:49.903 に答える