2012-03-12 102 views
2

我有一個問題:是否有可能創建列家族在卡桑德拉,將這個樣子的下方,如何定義它的結構:卡桑德拉和supercolumns

Users = { //CF 
    AlexS : { //row key 
     Address : { //supercolumn 
       state: "NJ", 
       country: "US", 
       phone : { //super column 
        zip: "00283", 
        number : { // supercolumn 
         home: "23756511", 
         mobile : "23756512" 
        } 
       } 
     } 
    } 
} 

回答

7

嵌套超柱超柱內的四個層次?據我所知,這是不可能的。因爲您需要通過引用您想要的當前插入的哪個列族來指定。考慮以下內容,您可以將頂級列族定義爲類型列族超級。然後,您可以在此超級列家族中擁有多個超級列,並且此超級列將具有多個列=值對,這些對被稱爲子列。例如,

list Users;  
Using default limit of 100 
------------------- 
RowKey: AlexS 
=> (super_column=Address, 
    (column=country, value=US, timestamp=1331614891360000) 
    (column=state, value=NJ, timestamp=1331614891355000)) 
=> (super_column=number, 
    (column=home, value=23756511, timestamp=1331614891406000) 
    (column=mobile, value=23756512, timestamp=1331614891406001)) 
=> (super_column=phone, 
    (column=zip, value=00283, timestamp=1331614891396000)) 

1 Row Returned. 
Elapsed time: 21 msec(s). 
+1

好吧,因爲我還沒有找到任何文件或信息,這是可能的+你的答案,我認爲這是不可能的。因此,只有2種類型的列家族可用:標準和超級;並且超類型的列族僅給出了附加的頂級列來保存子列。 – Kitamo 2012-03-13 08:07:40

+0

是的,可能不是現在,時間也許會是支持。聲明一個超類型的列族,幷包含許多標準列族。對於每個標準列族,您將存儲多個columnName和columnValue。 – Jasonw 2012-03-13 09:04:32

+1

你可能會考慮使用複合類型的密鑰,然後有3個單獨的鍵:AlexS:Address,AlexS:number,Alexs:phone等,並避免SuperColumns。一個好處是,可以爲任何列添加索引(僅適用於標準CF) – libjack 2012-03-13 15:15:33

2

另一種選擇是將部分或全部用戶實體存儲爲JSON,因爲這就是您如何表示它的方式。然後,如果您需要進行反向查找,只需編寫自己的索引即可。在這種情況下,您的密鑰是「AlexS」,那麼您將擁有一個「地址」列,其中包含地址數據的JSON表示(或任何想要使用的序列化)。

然後,如果你想通過電話號碼查找,你會有一個本土化的索引,其中key =電話號碼,然後是每個用戶ID的列。

這是一個非常普遍的方法與Cassandra。