2012-07-30 108 views
1

因此,我定義了一個使用組合鍵作爲行鍵的列族。所以說複合鍵是CompositeType(LongType,LongType)。所以我測試了這種類型的存儲項目,並且工作正常,當我知道完整的密鑰時,SELECT也按預期工作。但讓我們說我想要所有有0作爲第一個元素和任何第二個的鍵。到目前爲止,我可以看到執行此查詢的唯一方法如下:在cassandra中選擇組合類型鍵

,如果我是0所有的鍵:*然後我會做一個CQL查詢key >= 0:0 AND key < 1:0其中只要有一個保序工作分區。

我的問題是:

1)僅僅是因爲我使用的是CQL驅動程序(僅適用於除了節儉的NodeJS)

2)選項,這個奇怪的語法是有這種類型的任何低效率查詢?基本上我使用的是組合鍵而不是超級列,因爲這些在CQL中不受支持。在代碼中處理這個邏輯沒有問題,只要沒有像這樣使用它的限制。

回答

1

我建議你改變你的數據模型。使用RandomPartitioner,並將第一個組件作爲行鍵。將第二個組件插入到列名稱中,即改爲使用列名稱組合。

由於列名始終排序,因此可以進行簡單的切片操作。例如,

a)當您知道這兩個組件時,對組合鍵的行鍵(第一個組件)和第一個組件進行切片。

b)如果你知道剛纔第一部分,取該行鍵(第一部分)

這是方法CQL3完整的一行,當你問它來創建多個主鍵的表需要。

+0

你說得對,它將使用列而不是行鍵作爲組合,但是有什麼理由不使用行鍵嗎?我知道即使數據均勻分佈,排序也會導致負載不平衡的問題。但是我所有的密鑰都是以sha1的至少8個字節開始的,這應該消除這個問題。 – user1084563 2012-08-03 17:32:27

+0

現在我記得我的推理,所以從你說的我知道我可以做的關鍵作爲LongType,現在的列可以是CompositeType(LongType,UTF8Type)。但是,如果他們不完全相同,我現在不能喪失聲明價值類型的能力嗎?就像如果一列是一個很長的值,另一列是utf8的值,我現在需要說所有列都是BytesType,因爲我不再有靜態列名稱了?然後我失去了cassandra爲我進行類型轉換的功能吧?我在這裏錯過了什麼嗎? – user1084563 2012-08-03 17:35:38

+0

根據我的理解,您將有兩個選項,按照您所說的以字節存儲,另一個選項是使用Dynamic Composites存儲值。 DC允許您擁有具有不同數據類型的單個組件。 – Mohit 2012-08-03 20:41:09

0

您最好的選擇是使用CQL 3。這將允許您使用下面的組合來優化查找,同時仍然允許您像使用單獨的列一樣使用組合值的各個部分。您目前在行鍵中使用組合,而CQL 3僅支持列名稱中的組合(so far),但這是,可能沒問題。在很多這樣的情況下,將合成從行鍵移動到列名不會對性能或數據分佈產生不利影響,但是如果行鍵的選擇性不夠,那麼可能會出現這種情況。

無論採用哪種方式,您都應該查看CQL 3.不推薦使用CQL 2。如果我更瞭解您的情況,我可以告訴您更多關於如何使您的模型適用於CQL 3的信息。