NOSQL 非规范化数据模型

Posted

技术标签:

【中文标题】NOSQL 非规范化数据模型【英文标题】:NOSQL denormalization datamodel 【发布时间】:2015-01-28 14:07:44 【问题描述】:

我多次读到 NOSQL 数据库中的数据是非规范化存储的。例如,考虑一个国际象棋游戏记录。它可能不仅包含参与国际象棋游戏的玩家ID,还包含该玩家的名字和姓氏。我想这样做是因为在 NOSQL 中无法进行连接,所以如果您只是复制数据,您仍然可以在一次调用中检索您想要的所有数据,而无需手动应用程序级别的数据处理。

我不明白的是,现在当您想要更新棋手的姓名时,您必须编写一个查询来更新该棋手参与的棋局记录以及该棋手的棋手记录。那个玩家。这似乎是一个巨大的性能开销,因为数据库必须搜索该玩家参与的所有游戏,然后更新每条记录。

数据是否经常像我的示例中那样以非规范化方式存储?

【问题讨论】:

【参考方案1】:

您是对的,数据通常以非规范化方式存储在 NoSQL 数据库中。

更新的问题部分在于术语“最终一致性”的来源。

在您的示例中,当您更新玩家的姓名时(不是常见事件,但它可能会发生),您将发出一个后台作业来更新所有其他记录的名称。是的,当更新发生时,您可能会检索到较旧的值,但最终数据将是一致的。由于我们不是在这里编写 ATM 软件,因此性能/一致性的权衡是可以接受的。

您可以在这里找到更多信息:http://www.allbuttonspressed.com/blog/django/2010/09/JOINs-via-denormalization-for-NoSQL-coders-Part-2-Materialized-views

【讨论】:

【参考方案2】:

一种看待它的方式是,用户更改其姓名的次数极为罕见。 但是读取和更改电路板数据的次数是巨大的。

因此,仅针对发生次数多于发生次数很少的情况进行优化才有意义。

需要注意的另一点是,如果将该名称数据保留在板数据下重复,您实际上会增加读取的性能开销。每次您获取董事会数据时,您都必须多走一步并获取所有用户数据(即使您真正想要的只是名字和姓氏)。

再次将名字和姓氏放在棋盘数据上的原因可能是在显示棋盘数据的屏幕上,您通常也会显示用户名。

由于这些原因,您可以避免在 NoSQL DB 上拥有重复数据。 (虽然这也可以在 SQL DB 中完成,但请注意,你会被不赞成的)。在 NoSQL 世界中,重复是相当普遍的,并且也在推广。

【讨论】:

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

NoSQL之mongodb我见

NoSQL:从关系型数据库到非关系型数据库

「SQL vs NOSQL」关系型数据库和非关系型数据库深度解析

NoSQL之Redis配置与优化

NoSQL之Redis配置与优化

NoSQL之redis概述+部署