采用 NOSQL 方法时数据完整性的重要性?

Data Integrity importance when taking the NOSQL approach?

我几乎完成了一个大型应用程序的工作;几天前,我在 "NOSQL" 上看到了 Martin Fowler 的演讲。之后我意识到我一直在使用 Mongo 作为关系数据库,所以我决定重构我的模式。但是,我从一个来自 "RDBMS" 世界的人那里听说过很多关于诚信的事;我真的明白它有多么重要,那么在"NOSQL"引擎中可以实现数据完整性吗?

更明确地说,这是一个简单的例子:

假设我的系统中有 productinventory 个实体,

在我的 inventory 中,我引用 product_id 来定义产品,

目前 inventory 在我的 mongo collection 中看起来像这样
{'inventory' :{'product_id' : '1', 'count' : 15}}

所以我可以像这样在我的系统中存储 inventory:
{'inventory' :{'product' : {'id' : 1, 'name' : 'book'}, 'count' : 15}}
并仍然实现数据完整性?如果我在 product 实体中更改产品 _id : 1 的名称,那么会发生什么情况 - 我会循环更新所有 inventory collection 吗?

MongoDB 没有任何确保一致性的内置功能(唯一的例外:可以使用唯一索引强制执行唯一性约束)。不向数据库写入不一致数据的责任委托给应用程序。

当你的数据库模式中有冗余时(在 MongoDB 中不像在关系数据库中那样是致命的罪过),那么你的应用程序需要确保所有具有副本的文档数据点被更新。所以是的,当您更改产品名称并且您在多个文档中有该产品名称时,您需要更新它们。

但这并不一定意味着您需要循环。您可能可以使用带有 {multi:true} 选项的更新语句来完成此操作,以一次更新集合中所有文档中的产品名称。

未经测试的示例:

 db.collection.update(
     {
         "inventory.product.id": "1"
     },
     {
         $set: { "inventory.product.name": "New Product Name" }
     },
     {
          multi: true
     }
);

请记住,此示例假定您有嵌套对象,而不是任何嵌套对象数组。当你有数组并且只想更新那些符合条件的数组条目时,你需要使用 the $ operator.