21

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

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

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

4

2 回答 2

20

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

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

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

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

于 2014-12-17T15:41:58.013 回答
2

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

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

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

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

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

于 2020-08-03T16:52:31.707 回答