cassandra - 与 Bigtable 相比,Cassandra 数据模型中关于列族的概念差异?

标签 cassandra nosql google-cloud-bigtable scylla

我目前正在尝试深入研究 Cassandra 的数据模型及其与 Bigtable 的关系,但最终对列族概念感到非常头疼。

主要是问了我的问题和already answered .但是,我对答案不满意:)

首先,我阅读了 Bigtable paper特别是关于它的数据模型,即数据是如何存储的。据我了解,Bigtable 中的每个表基本上都依赖于具有维度行、列和时间的多维稀疏映射。 map 按行排序。可以使用名称约定 family:qualifier 将列分组为列族。因此,一行可以包含多个列族(参见论文中的示例图)。

虽然声明 Cassandra 依赖于 Bigtable 数据模型,但我多次阅读到,在 Cassandra 中,列族包含多行,并且在某种程度上类似于关系数据存储中的表。这是否与 Bigtable 的方法相反,其中一行可以包含多个列族?首先是列族还是行:)?这些概念甚至具有可比性吗?

最佳答案

您链接的答案是 6 年前的,从那以后 Cassandra 发生了很多变化。 Cassandra 刚开始时,它的数据模型确实是基于 BigTable 的。一行数据可以包括任意数量的列,这些列中的每一列都有一个名称和一个值。一行可以有 1000 个不同的列,不同的行可以有 1000 个其他列 - 行不必具有相同的列。这样的数据库被称为“无模式”,因为没有每一行需要遵守的模式。

但是托托,我们不再在堪萨斯州了——从那以后, Cassandra 的模型的焦点发生了变化(虽然不是本质上的),我将尝试解释如何以及为什么:

随着 Cassandra 的成熟,它的开发人员开始意识到无模式并不像他们曾经认为的那么好。模式在确保应用程序正确性方面很有值(value)。此外,通常不会因为一个记录中有 1000 个单独命名的字段而在一行中达到 1000 列。相反,更常见的情况是记录实际上包含 200 个条目,每个条目有 5 个字段。模式应该修复这些条目中的每一个都应该具有的这 5 个字段,并且定义这些单独条目中的每一个的内容称为“集群键”。所以在六年前的 Cassandra 0.8 时代,这些想法作为“CQL”(Cassandra 查询语言)引入 Cassandra。

例如,在 CQL 中,一个列族(它被忠实地重命名为“表”)具有一个模式,其中包含一个已知的字段列表:

CREATE TABLE groups (
    groupname text,
    username text,
    email text,
    age int,
    PRIMARY KEY (groupname, username)
)

这个模式表示表中的每一行(现在,在现代 Cassandra 中,这被重命名为“分区”),键为“组名”,是一个可能很长的用户列表,每个用户都有用户名、电子邮件和年龄字段。 “PRIMARY KEY”说明符中的第一个名称是分区键(它确定宽行的键),第二个称为聚类键(它确定一起构成宽行的小行的键) .

尽管有了新的 CQL 改版,Cassandra 继续使用旧的 BigTable-wide-row-without-schema 实现来实现这些新概念。例如,假设我们的数据有一个包含两个人的组“mygroup”,(john, john@somewhere.com, 27) 和 (joe, joe@somewhere.com, 38)。 Cassandra 将以下四个列名->值添加到宽行:
john:email -> john@somewhere.com
john:age -> 27
joe:email -> joe@somewhere.com
joe:age -> 27

请注意我们如何最终得到一个宽行,其中包含 4 列 - 每行 2 个非关键字段(电子邮件和年龄),乘以分区中的行数 (2)。聚类键字段“用户名”不再作为值出现在任何地方,而是作为列名称的一部分!所以如果我们有两个用户名值“john”和“joe”,我们有一些列前缀为“john”,一些列前缀为“joe”,当我们阅读“joe:email”列时,我们知道这是username=joe 行的电子邮件字段。

Cassandra 仍然具有这种内部二元性——将面向用户的 CQL 行和集群键转换为旧式宽行。直到最近,Cassandra 被称为“SSTables”的磁盘格式仍然是无模式的,并且使用如上所示的复合名称作为列名称。我在Scylla的网站https://github.com/scylladb/scylla/wiki/SSTables-Data-File上写了一篇关于SSTable格式的详细描述。 (Scylla 是我贡献的 Cassandra 的更高效的 C++ 重新实现)。然而,列名在这种格式中非常低效,因此 Cassandra 最近(在 3.0 版中)切换到不同的文件格式,这是第一次接受集群键和模式完整的行作为一等公民。这是 7 年前无模式 Cassandra 棺材上的最后一颗钉子。 Cassandra 现在一直都是模式完整的。

关于cassandra - 与 Bigtable 相比,Cassandra 数据模型中关于列族的概念差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47120916/

相关文章:

java - 支持 Cloud Bigtable 作为 Cloud Dataflow 中的接收器

cassandra - 标准列族与 super 列族

cassandra - Cassandra 中分层实体的建模

java - 如何通过 Spring Boot 在 MongoDB 中加载初始数据?

node.js - 如何在单个请求中读取 Firestore 中的多个文档?

google-cloud-bigtable - BigTable是否允许设置微时间戳粒度

java - 在 Cassandra 数据库中编写存储过程

configuration - 错误 session : Error creating pool to/127. 0.0.1:9042

Firebase 数据库架构

google-cloud-dataflow - 如何集成测试写入 Bigtable 的 Dataflow 管道?