Cassandra数据模型 - 1个SCF或多个CF.

时间:2011-11-12 16:01:20

标签: cassandra

考虑以下情况,我想在Cassandra中存储有关Stone Bricks的数据。首先,砖块有一个名为brick123的唯一名称/ id。这种砖的“尺寸”宽度为:6,高度:3,长度:4。它的“重量:2pds。”它有一些野生的“颜色”基色:红色,色调:砂岩,条纹:蓝色。它在以下国家“生产”,1:俄罗斯,2:非洲,3:日本。我们可以从以下“供应商”订购1:Lowes,2:brick-r-us,3:石材供应。

现在,如果我有X个Stone Bricks,我们是否应该使用Super-Column-Family来存储我们的Brick数据?我们可以向Cassandra询问非洲的石砖或通过石材供应的石砖吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

正常的建议似乎是避免SCF支持多个CF.

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

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> 

(供应商也一样)

关键在于,在Cassandra中,您可以构建列族以匹配您要执行的查询,并根据需要进行非规范化。

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

答案 1 :(得分:1)

超级列未编入索引 - 这意味着,超级列上的读取访问权限会将其整个内容加载到RAM中。这也是避免SCF的另一个原因,特别是如果它包含大量数据。

http://wiki.apache.org/cassandra/CassandraLimitations