考虑以下情况,我想在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询问非洲的石砖或通过石材供应的石砖吗?
谢谢!
答案 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的另一个原因,特别是如果它包含大量数据。