我们如何确保 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 - 确保将数据保存在不同集合中的策略,例如应用程序级别的事务