2013-07-08 79 views
0

我們如何設計一個卡桑德拉模型,用於存儲組說「項目」,其具有n個屬性P1,P2,...,PN和 由值搜索項屬性檢索項目搜索由價值卡桑德拉多個屬性

對於實例

Item Item_Type State Country 

Item1 Solid  State1 Country1 

在傳統RDBMS,我們可以發出一個選擇查詢

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

我們怎樣才能實現這樣的模型NoSql Cassandra,我們嘗試了cassandra二級索引,但它似乎不適用。

回答

1

對於屬性P1..PN,你將不得不ALTER該表與RDMSs一樣,或者使用過時的基於thrift協議的API(我建議Astyanax爲此),它可以實時添加列(但這是認爲不好的做法)。另一種可能是使用屬性的集合,你列一個是值的集合:

CREATE TABLE item (
     item_id text PRIMARY KEY, 
     property set<text> 
    ); 

對於SELECT ING值與多個WHERE子句可以使用輔助索引,或者如果你知道要去哪些列是WHERE子句中需要使用composite key,但如果要在WHERE子句中包含大量列,我建議使用輔助索引。

1

許多卡桑德拉數據建模問題的答案是:denormalize。

你可以通過自己建立索引來解決你的問題。對於每個屬性與屬性名稱作爲關鍵字的行和值和項目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表中的所有三列都在主鍵中,因爲我假設多個項目對於同一個屬性可以具有相同的值,但在items表中主鍵中只有item_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命令)

通過鞋子尺寸查找物品您需要做兩個查詢(對不起,但這是您付出的靈活性的代價 - 也許別人可以拿出一個不需要兩個查詢的解決方案):

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

其中?是第一個查詢(因爲不止一個可匹敵,記不清了)返回item_id S的一個。