我们如何确保 mongoDb 中的数据完整性?

Posted

技术标签:

【中文标题】我们如何确保 mongoDb 中的数据完整性?【英文标题】:How can we ensure Data integrity in mongoDb? 【发布时间】:2015-12-29 08:21:46 【问题描述】:

我正在尝试从关系数据库 (mysql) 数据迁移到 nosql (mongoDb)。但是如何确保 mongodb 中的数据完整性。我发现我们不能在服务器端做到这一点。我应该在应用程序端使用什么来处理数据完整性?

例如:我有两个表 user 和 task 。两者都有 userId 字段 common 。如果我在任务表中添加一个新条目,它应该检查用户表中是否存在用户 ID。 这是其他要求之一,例如添加约束、更新值等

【问题讨论】:

您确定要将nosql 用于您的方案吗? 如果可以的话就做一个 poc .. 重要提示:停止对需要关系数据库的事情使用 no-sql 【参考方案1】:

MongoDB 不支持 FOREIGN KEY。它用于避免 JOINS。

MongoDB 不支持服务器端外键关系。但有时我们需要关联,因此 MongoDB 应用程序使用以下两种方法之一来关联文档:

    手动参考,您可以将一个文档的 _id 字段保存在另一个文档中作为参考。然后您的应用程序可以运行第二个查询以返回相关数据。对于大多数用例来说,这些参考资料既简单又足够。

    DBRefs 是从一个文档到另一个文档的引用,使用第一个文档的 _id 字段的值、集合名称以及可选的数据库名称。通过包含这些名称,DBRefs 允许位于多个集合中的文档更容易地与来自单个集合的文档链接。这可能不会那么快,因为 DB 必须进行额外的查询来读取对象,但允许某种外键引用。您仍然必须手动处理您的参考资料。只有在查找您的 DBRef 时,您才会看到它是否存在,如果引用的目标不再存在,DB 将不会遍历所有文档来查找引用并删除它们。但我认为在删除这本书后删除所有引用将需要每个集合一个查询,仅此而已,所以真的没那么难。

有关更多信息,请参阅文档:Database References。

我该如何解决这个任务?

需要明确的是,MongoDB 不是关系型的。没有标准的“正常形式”。您应该根据您存储的数据和您打算运行的查询为您的数据库建模。 例如-

student
 
  _id: ObjectId(...),
  name: 'Jane',
  courses: [
     course: 'bio101', mark: 85 ,
     course: 'chem101', mark: 89 
  ]


course

  _id: 'bio101',
  name: 'Biology 101',
  description: 'Introduction to biology'

尝试解决这个问题

student
 
    _id: ObjectId(...),
    name: 'Jane',
    courses: [
     
        name: 'Biology 101', 
        mark: 85, 
        id:bio101 
    ,
  ]

【讨论】:

我不是在询问从 RDBS 到 nosql 的数据一致性,而是询问 mongoDb 中的数据完整性例如:我有两个表 user 和 task 。两者都有 userId 字段 common 。如果我在任务表中添加一个新条目,它应该检查用户表中是否存在用户 ID。这是其他要求之一,例如添加约束、更新值等 外键和连接没有任何关系。他需要的是外键,而不是连接。 @SergioTulentsev 查看用户 (rahul) 的示例。好像用了外键。 @SergioTulentsev 加入与此无关,但我为用户编写 @HiteshMundra:我的意思是“你为什么提到加入?他们在这里完全不相关”【参考方案2】: MongoDb 是 nosql,因此没有连接。 数据存储为 BSON 文档,因此没有外键约束

确保数据完整性的步骤:

在添加任务文档之前检查应用程序是否拥有有效用户。

【讨论】:

问题中没有提到任何地方的连接。【参考方案3】:

最终,你被搞砸了。在这种情况下,没有办法(在 mongodb 中)保证数据完整性,因为它通常缺乏关系,尤其是外键。构建应用程序级别的检查没有什么意义。无论它们多么复杂,它们仍然可能失败(因此“无法保证”)。

所以要么是嵌入(因此相关数据始终存在,就在文档中)要么放弃一致数据的希望。

【讨论】:

一致性数据不是编写正确软件的必要条件吗? @TamasHegedus:也许是,也许不是。这与问题/答案有什么关系?

以上是关于我们如何确保 mongoDb 中的数据完整性?的主要内容,如果未能解决你的问题,请参考以下文章

mongodb - 确保将数据保存在不同集合中的策略,例如应用程序级别的事务

如何正确使用事务和锁来确保数据库完整性?

如何确保数据库中的 startDate 和 endDate 列不重叠?

MongoDB入门

技术瓶颈?如何解决MongoDB超大块数据问题?

零基础学习MongoDB—— MongoDB简介