Nosql 如果行可以具有不同数量/类型的列,那么将行划分为列族的目的是什么?

Nosql 如果行可以具有不同数量/类型的列,那么将行划分为列族的目的是什么?,nosql,cassandra,conceptual,Nosql,Cassandra,Conceptual,考虑到列族可以具有任意结构的行,我们可以将所有行存储在一个“存储”中(故意避免使用“columnfamily/table”这个名称)。 那么,列族的用途是什么呢?最简单的原因就是名称本身“列族”。柱族将一组相关柱组合在一起。可以将其视为包含相关列的命名空间。 例如,“Name”列本身缺乏上下文,可以由“Employees”或“Cities”等列族提供上下文。或者,每一列都需要单独承载它的所有上下文,而不需要相关列的概念。原子性 在Cassandra 1.1及以下版本中,唯一的原子保证是写入同一行

考虑到列族可以具有任意结构的行,我们可以将所有行存储在一个“存储”中(故意避免使用“columnfamily/table”这个名称)。
那么,列族的用途是什么呢?

最简单的原因就是名称本身“列族”。柱族将一组相关柱组合在一起。可以将其视为包含相关列的命名空间。

例如,“Name”列本身缺乏上下文,可以由“Employees”或“Cities”等列族提供上下文。或者,每一列都需要单独承载它的所有上下文,而不需要相关列的概念。

原子性

在Cassandra 1.1及以下版本中,唯一的原子保证是写入同一行(即使用相同的键)将是原子的

因此,您需要非常仔细地考虑您希望在列中包含什么,以及这些列应该位于哪一行,以便在写入失败时应用程序能够正常运行。

原因:

  • 对行中的列具有不同的排序顺序。比较器是在列族创建时指定的,以后不能更改。因此,如果您有行,哪些列必须按字母或数字排序,则必须创建不同的列族。
  • 自定义可以按列族设置的存储选项。例如缓存或行、压缩、删除过期列等。可以找到每个列系列的存储选项
  • 不能在同一列族中混合使用计数器列和非计数器列
  • 正如在其他答案中提到的,由于逻辑内聚性,列表示由行id标识的某些实体的属性。
我可以说,列的上下文是行而不是列族。在关系数据库中,具有相同结构的元组集合被分组到表中。在这里,每一行都可以有自己的结构,因此从存储的角度来看,无论我有1个列族还是多个列族(只要我可以在列族中插入任何内容),都没有多大区别。Timeseries数据只是一个很长的行,每列代表一个时间事件。我不明白为什么我不能把它放在一个“存储”中。尽管如此,我知道对于每个给定的应用程序都有一个数据模型,所以用“名称范围”来表示不同的概念对于组织模型是很有用的。我的兴趣是找出这个概念对物理存储有什么影响。我认为CF中表示实体的相关列的逻辑分组即使从存储的角度来看也是非常重要的。逻辑实体(CF)中表示的数据经常一起访问。这允许您将频繁访问的实体物理存储在更快的存储上,而将较少访问的实体物理存储在较慢的物理存储上。存储位置取决于构成群集和分区方案的计算机,而不是您的CFs。实际上,根据Cassandra文档,在群集的单个节点中,不同CFs的数据存储在单独的文件中。我想这就是为什么CF在数据存储中起作用的问题的目的。虽然您的答案是正确的,但它并没有回答为什么要将行划分为多个列族的问题,这就是这个问题的重点。partitioner不仅为行键分配令牌,还为节点分配令牌。也许你想看看一致散列