2011-11-12 28 views
3

请考虑以下事项,我想在Cassandra中存储关于石砖的数据。首先,砖块有一个名为brick123的独特名称/ ID。这块砖的宽度为6,高度为3,长度为4。它的“重量:2片”。它有一些狂野的“颜色”basecolor:红色,色调:砂岩,条纹:蓝色。它在以下国家“生产”,1:俄罗斯,2:非洲,3:日本。我们可以从以下“供应商”订购1:Lowes,2:bricks-r-us,3:stone-supply。Cassandra数据模型 - 1个SCF或多个CF的

现在,如果我们有X个Stone Brick,我们应该使用Super-Column-Family来容纳我们的Brick数据吗?我们能否问卡桑德拉从非洲石头砖到石头供应石砖?

谢谢!

回答

2

正常的建议似乎是为了避免SCFs赞成多个CFs。

对于砖块的简单属性(宽度,颜色等),可以对每个砖块使用一个简单的行(每个属性有一列)(如果要查找具有特定砖块的砖块,还可以启用自动二级索引属性):

CF "bricks": 

brick123 -> w h l weight color hue  striping 
      6 3 4 2pds red sandstone blue 

对于多值属性(国家,生产者)你可以有单独的列科:

CF "countries": 

brick123 -> Russia Africa Japan 
      <empty> <empty> <empty> 

和/或如果你想从一个特定国家查找砖,你创建一个二级索引作为另一个CF:

CF "country2bricks" 

Russia -> brick123 brick124 ... 
      <empty> <empty> 

Africa -> brick123 brick127 ... 
      <empty> <empty> 

Japan -> brick123 
      <empty> 

(和相同的供应商)

关键的一点是,在卡桑德拉您结构中的列族的要求相匹配,你要执行的查询,denormalising。

“空”表示我们只是单独使用列名来存储信息,并且列值为空。

+0

谢谢DNA!我对这个问题的了解和研究越多,看起来就像你说的那样,要么使用多个cf,要么使用CompositeType列。 CompositeType看起来很有希望,除了许多api没有像PHP那样的支持。 – Blake

+0

PHP现在支持合成。只要把钥匙变成“something:something_else”即可。 – Nick