2014-12-03 54 views
9

我读到,在nosql(例如cassandra)数据经常存储非规范化。例如见SO回答或这website卡桑德拉反规范化数据模型

一个例子是,如果你有员工和部门的一列的家人和你想执行一个查询:select * from Emps where Birthdate = '25/04/1975' 然后,你必须做一个列族birthday_Emps并存储每个员工为一列的ID。因此,您可以查询生日_Emps家庭关键字'25/04/1975',并立即获得该日期出生的所有员工的ID。您甚至可以将员工详细资料标准化为birthday_Emps,以便您立即拥有员工姓名。

这真的是这样做吗?

  1. 每当员工被删除或插入时,您将不得不从employee_Emps中删除员工。在另一个例子中,有人甚至说,有时候你有一种情况,某个表中的某个删除需要在其他表中删除100个。这真的很常见吗?

  2. 在应用程序代码中进行连接是否很常见?你有软件,允许你创建预先编写的应用程序来连接来自不同查询的数据吗?

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

回答

8

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

  1. 这仍然是一个好主意,因为查询时间的速度使它值得。是的,有更多的清理工作要做。我不必从其他专栏中执行100次删除操作,但偶尔会有一些复杂的清理工作要做。但是,无论如何,你不应该在Cassandra中做大量的删除操作(反模式)。

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

  3. 几篇文章,我可以推荐:

+1

Btw。更新所有非规范化数据是否是手动过程?或者这可以通过cassandra自动完成? – Stefan 2014-12-05 11:05:54

+1

@Stefan这是非规范化模型的缺点,因为没有参照完整性。因此,您需要调整您的DAO以修改更新中的多个表。 – Aaron 2015-01-16 15:38:43