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

标签 mongodb database-schema data-integrity nosql

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

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

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

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

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

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

最佳答案

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

当您的数据库架构中存在冗余时(在 MongoDB 中不像在关系数据库中那样致命),那么您的应用程序需要确保所有具有重复数据点的文档都已更新。因此,是的,当您更改产品名称并且该产品名称包含在多个文档中时,您需要全部更新它们。

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

未经测试的示例:

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

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

关于mongodb - 采用 NOSQL 方法时数据完整性的重要性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28857059/

相关文章:

node.js - mongodb 神秘错误 process.nextTick(function() { throw err; }) ^ Object 错误。<anonymous>

database - 如何优雅地设计表示 ADDRESS 的数据库模式?

database-design - Google Analytics的数据库架构/数据库设计会是什么样?

performance - 我应该相信 Redis 的数据完整性吗?

mongodb - 如果有多个索引包含相同的字段,会使用哪个索引?

javascript - 在express js中从数据库全局访问配置

javascript - Meteor:如何将项目推送到用户集合并创建列表或数组,而不是用新项目替换每个项目?

mysql - 如何改进存储图像的数据库?

sql - 营业时间数据库设计

sql-server - 强制执行此数据完整性约束的最佳方法?