2012-03-12 111 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。