Cassandra 也没有列数。这将启用半结构化数据或无模式表

Cassandra 也没有列数。这将启用半结构化数据或无模式表,cassandra,nosql,data-modeling,column-oriented,wide-column-store,Cassandra,Nosql,Data Modeling,Column Oriented,Wide Column Store,您可以将宽列存储视为可以容纳无限列数的表,因此是宽的 这里有几个链接来支持这一点: 也提到了它,尽管它将Cassandra分类为键值存储 在我看来,卡桑德拉这个词用错了。相反,将其称为行分区存储更合适。让我为您提供一些详细信息: 主键、分区键、群集列和数据列: 每个表必须有一个具有唯一约束的主键 分区键是主键的第一个组件。其散列值用于确定存储数据的节点。分区键可以是由多个列组成的复合键。我们希望几乎相等的数据分布,在选择主键时要牢记这一点 在主键中分区键之后列出的任何字段都称为群集列。

您可以将宽列存储视为可以容纳无限列数的表,因此是宽的

这里有几个链接来支持这一点:

  • 也提到了它,尽管它将Cassandra分类为键值存储

    • 在我看来,卡桑德拉这个词用错了。相反,将其称为行分区存储更合适。让我为您提供一些详细信息:

      主键、分区键、群集列和数据列:

      每个表必须有一个具有唯一约束的主键

      分区键是主键的第一个组件。其散列值用于确定存储数据的节点。分区键可以是由多个列组成的复合键。我们希望几乎相等的数据分布,在选择主键时要牢记这一点

      在主键中分区键之后列出的任何字段都称为群集列。这些在分区内按升序存储数据。集群列组件还有助于确保每行的主键是唯一的

      您可以使用任意数量的集群列。不能在SELECT语句中无序使用集群列。您可以选择在SELECT语句中使用集群列来省略。没关系。在使用SELECT语句时,请记住按顺序起诉他们。但请注意,在CQL查询中,如果未使用其他已定义的群集列,则不能尝试访问列或群集列。例如,如果主键是
      (年份、艺术家名称、专辑名称)
      ,并且您希望在查询的
      WHERE
      子句中使用
      city
      列,那么您只能在
      WHERE
      子句使用属于主键的所有列时使用它

      代币:

      Cassandra使用标记来确定哪个节点保存哪些数据。令牌是64位整数,Cassandra将这些令牌的范围分配给节点,以便每个可能的令牌都由节点拥有。向集群添加更多节点或删除旧节点会导致在节点之间重新分配这些令牌

      行的分区键用于使用给定的分区器(用于计算分区键的令牌的哈希函数)计算令牌,以确定哪个节点拥有该行

      Cassandra是行分区存储:

      行是在Cassandra中存储相关数据的最小单元

      不要将Cassandra的列族(即表)看作是RDBMS表,而应将其看作是
      dict的
      dict
      (这里
      dict
      是类似于Python的
      OrderedDict
      的数据结构):

      • 外部
        dict
        由行键(主键)键入:这决定了分区中的哪个分区和哪一行
      • 内部
        dict
        由列键(数据列)键入:这是
        dict
        中的数据,列名作为键
      • 两个
        dict
        都按键排序和排序:外部
        dict
        按主键排序

      此模型允许您在任何时候省略列或添加任意列,因为它允许您为不同的行拥有不同的数据列。

      Cassandra有一个列族(表)的概念,它最初来自BigTable。不过,如您所述,将它们称为“面向列”确实会产生误导。在每个列族中,它们将一行中的所有列与行键一起存储,并且不使用列压缩。因此,Bigtable模型仍然主要是面向行的。

      这正是重点!它完美地解释了这种差异。这样,Cassandra可以是面向列的,但这取决于您使用的列名。谢谢你讲清楚!可以通过翻转第一个表来演示列的方向性。假设行键为“颜色”、“重量”、“价格”。然后,列名称是水果类型“苹果”、“橙色”等。难道卡桑德拉不能被视为一种水果吗?是的,我认为它与EAV有相似之处,特别是在我的第一个例子中——但对于“宽行”来说就更少了使用风格。第一个示例与MongoDB中的文档非常相似。我认为关键是在Cassandra中,列可以有双重用法。它为每一行存储由列名和列值组成的有序偶列表。这意味着您可以通过键入水果名称和您所说的列来制作列族水果。另一方面,您还可以定义一个cf fruit_cols,它以颜色和该颜色果实的名称作为列作为键。以这种方式,它们将存储在同一页中。我认为这可以看作是一种专栏式的方法。不是吗?这对我来说是正确的答案+1,因为它很有效。最好指出,您可以为Cassandra(大表)中的每一行使用不同的列,其中一些列甚至可能有数千列,而一些列可能仅限于一行。
      apple -> colour  weight  price variety
               "red"   100     40    "Cox"
      
      orange -> colour    weight  price  origin
                "orange"  120     50     "Spain"
      
      temperature ->  2012-09-01  2012-09-02  2012-09-03 ...
                      40          41          39         ...
      
      apple -> colour  weight  price variety
               "red"   100     40    "Cox"
      
      apple -> colour  weight  price variety
               "red"   100     40    "Cox"
      
      grape -> colour  weight  price variety
               "red"   100     40    "Cox"
      
         ID         Last    First   Bonus
         1          Doe     John    8000
         2          Smith   Jane    4000
         3          Beck    Sam     1000
      
           "Bonuses" : {
                 row1 : { "ID":1, "Last":"Doe", "First":"John", "Bonus":8000},
                 row2 : { "ID":2, "Last":"Smith", "First":"Jane", "Bonus":4000}
                 ...
           }
      
      Primary Key = Partition key + Clustering Columns
      
      # Example
      Primary Key: ((col1, col2), col3, col4)     # primary key uniquely identifies a row
                                                  # we need to choose its components partition key
                                                  # and clustering columns so that each row can be
                                                  # uniquely identified
      Partition Key: (col1, col2)                 # decides on which node to store the data
                                                  # partitioning key is mandatory, and it
                                                  # can be made up of one column or multiple
      Clustering Columns: col3, col4              # decides arrangement within a partition
                                                  # clustering columns are optional