【问题标题】:Cassandra Data-Model - 1 SCF or Multiple CF'sCassandra 数据模型 - 1 个 SCF 或多个 CF
【发布时间】:2011-11-17 19:44:03
【问题描述】:

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

现在,如果我们有 X 个 Stone Bricks,我们是否应该使用 Super-Column-Family 来存放我们的 Brick 数据?我们可以向 Cassandra 索要来自非洲的石砖吗?或者可以通过石头供应获得哪些石砖?

谢谢!

【问题讨论】:

    标签: cassandra


    【解决方案1】:

    通常的建议似乎是避免使用 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”表示我们只是单独使用列名来存储信息,列值是空的。

    【讨论】:

    • 感谢 DNA!我对这个问题的阅读和研究越多,看起来就像你说的那样,要么是多个 cf,要么是使用 CompositeType 列。 CompositeType 看起来很有希望,只是在许多 api (如 PHP)中缺乏支持。
    • PHP 现在支持组合。只需将键设为“something:something_else”即可。
    【解决方案2】:

    超级列没有索引 - 这意味着,对超级列的读取访问会将其全部内容加载到 RAM 中。这也是避免 SCF 的另一个原因,尤其是在它包含大量数据的情况下。

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

    【讨论】:

      猜你喜欢
      • 2013-01-31
      • 2017-05-14
      • 1970-01-01
      • 2017-08-10
      • 1970-01-01
      • 1970-01-01
      • 2015-11-24
      • 1970-01-01
      • 2017-09-24
      相关资源
      最近更新 更多