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

Abo*_*ooz 6 data-integrity mongodb nosql database-schema

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

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

比方说,我有一个product,inventory在我的系统实体,

在我的inventory参考product_id中定义产品,

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

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

Phi*_*ipp 6

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

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

但这并不一定意味着你需要一个循环.您可以使用update-statement执行此操作,并且可以选择一次更新{multi:true}集合的所有文档中的product-name.

未经测试的例子:

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

请记住,此示例假定您具有嵌套对象,而不是嵌套对象的任何数组.如果有数组且只想更新符合条件的数组条目,则需要使用$运算符.