【问题标题】:Data Integrity importance when taking the NOSQL approach? [closed]采用 NOSQL 方法时数据完整性的重要性? [关闭]
【发布时间】:2015-05-05 14:16:49
【问题描述】:

我几乎完成了一个大型应用程序的工作;几天前,我看到了 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 集合吗?

【问题讨论】:

  • 我真的认为您应该比您的问题更多地考虑“NoSQL”或“文档数据库”方法。这实际上取决于您的实际“用例”,因为在某些情况下,文档存储对“嵌入式架构”更有意义,而在其他情况下,使用大多数 SQL(关系)解决方案提供的关系结构更有意义。就目前的情况而言,对于任何可信的人来说,确实没有可靠的案例来回答这个问题。

标签: mongodb database-schema data-integrity nosql


【解决方案1】:

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

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

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

未经测试的示例:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 2018-05-12
    • 1970-01-01
    • 2020-11-28
    • 2020-09-13
    相关资源
    最近更新 更多