Cassandra 非规范化数据模型

Posted

技术标签:

【中文标题】Cassandra 非规范化数据模型【英文标题】:Cassandra denormalization datamodel 【发布时间】:2015-02-01 14:17:21 【问题描述】:

我读到,在 nosql(例如 cassandra)中,数据通常是非规范化存储的。例如,请参阅此 SO 答案或此 website。

例如,如果您有一个包含员工和部门的列族并且您想要执行查询:select * from Emps where Birthdate = '25/04/1975' 然后,您必须创建一个列族生日_Emps,并将每个员工的 ID 存储为一列。因此,您可以查询birthday_Emps 系列的键“25/04/1975”,并立即获取该日期出生的员工的所有 ID。您甚至可以将员工详细信息非规范化为birthday_Emps,这样您也可以立即获得员工姓名。

真的是这样吗?

    每当删除或插入员工时,您也必须从birthday_Emps 中删除该员工。在另一个例子中,有人甚至说有时您会遇到这样的情况,即某个表中的一次删除需要在其他表中进行 100 次删除。这真的很常见吗?

    在应用程序代码中进行连接是否常见?您是否有软件可以让您创建预先编写的应用程序来连接来自不同查询的数据?

    是否有处理这些数据模型问题的最佳实践、模式等?

【问题讨论】:

【参考方案1】:

“是”在大多数情况下,采用基于查询的数据建模方法确实是最好的方法。

    这仍然是一个好主意,因为您的查询速度非常值得。是的,还有更多的房屋清洁工作要做。我不必从其他列族执行 100 次删除,但偶尔需要进行一些复杂的清理工作。但是,无论如何,您都不应该在 Cassandra 中进行大量删除操作(反模式)。

    没有。客户端 JOIN 与分布式 JOIN 一样糟糕。整个想法是创建一个表来为每个特定查询返回数据……非规范化和/或复制……因此完全不需要进行 JOIN。例外情况是,如果您正在运行 OLAP 查询以进行分析,则可以使用 Apache Spark 之类的工具来执行临时的分布式 JOIN。但这绝对不是你想在生产系统上做的事情。

    我可以推荐几篇文章:

    Getting Started with Cassandra Time Series Data Modeling - 由 DataStax 的首席布道者 Pa​​trick McFadin 撰写,它以几种不同的方式涵盖了更常见的 Cassandra 用例之一。 Escaping From Disco-Era Data Modeling - 这个讨论了 Cassandra 初学者可能面临的一些障碍,以及克服这些障碍的一般方法。 免责声明:我是作者。 Cassandra Data Modeling Best Practices, Part 1 - Jay Patel (eBay) 关于 Cassandra 建模实践的经典文章绝对不会出错。这些示例基于 CQL 之前的世界,这有点过时了,但这些技术仍然引起了共鸣。

【讨论】:

顺便说一句。更新所有非规范化数据是手动过程吗?或者这可以由 cassandra 自动完成吗? @Stefan 这是非规范化模型的缺点,因为没有参照完整性。因此,您需要调整 DAO 以在更新时修改多个表。【参考方案2】:

值得补充的是,Cassandra 3.0 引入了物化视图,它会自动执行这种非规范化,包括保持数据同步所需的内务管理。它很可能并不适合所有情况,但值得一看。

Example from DataStax

Cassandra documentation

【讨论】:

MV 仍被标记为实验性的,而且它们正在向节点添加额外的负载,因为它需要从磁盘读取数据 我同意@AlexOtt。我现在不建议使用物化视图。

以上是关于Cassandra 非规范化数据模型的主要内容,如果未能解决你的问题,请参考以下文章

更新Cassandra中的大型非规范化数据

Cassandra 3.0 的新特性: 物化视图

具有非规范化的 cassandra 数据建模

更新 Cassandra 中的非规范化数据

NOSQL 非规范化数据模型

Cassandra 数据模型设计,根据你的查询来制定设计——反范式设计本质:空间换时间