我正在尝试从关系数据库(mysql)数据迁移到nosql(mongoDb)。但是我怎样才能确保mongodb中的数据完整性。我发现我们不能在服务器端做到这一点。我应该在应用程序端使用什么来处理数据完整性?
例如:我有两个表用户和任务。两者都有userId字段常见。如果我在任务表中添加一个新条目,它应检查userid是否存在于用户表中。 这是其他要求之一,如添加约束,更新值等
答案 0 :(得分:8)
最终,你被搞砸了。在这种情况下,没有办法(在mongodb中)保证数据完整性,因为它一般缺乏关系,特别是缺少外键。在构建应用程序级别检查方面没有什么意义。无论它们多么精细,它们仍然可能失败(因此“无法保证”)。
因此,它要么嵌入(以便相关数据始终存在于文档中),要么放弃对一致数据的希望。
答案 1 :(得分:2)
MongoDB不支持FOREIGN KEY。它的用途是避免加入。
MongoDB不支持服务器端外键关系。但有些时候我们需要联系So MongoDB应用程序使用两种方法之一来关联文档:
手动参考,其中将一个文档的_id字段另存为另一个文档作为参考。然后您的应用程序可以运行第二个查询以返回相关数据。对于大多数用例,这些引用很简单,也很充分。
DBRefs 是使用第一个文档的_id字段,集合名称以及(可选)其数据库名称的值从一个文档到另一个文档的引用。通过包含这些名称,DBRefs允许位于多个集合中的文档更容易与来自单个集合的文档链接。这可能不那么快,因为DB必须进行额外的查询以读取对象但允许进行外键引用。您仍然需要手动处理您的参考。只有在查找DBRef时,您才会看到它是否存在,如果引用的目标不再存在,DB将不会遍历所有文档以查找引用并将其删除。但是我想删除这本书之后删除所有的引用都需要每个集合只有一个查询,不多了,所以真的不那么难。
有关详细信息,请参阅文档:Database References。
我该如何解决这个问题?
要明确,MongoDB不是关系型的。没有标准的#34;正常形式"。您应该根据您存储的数据和要运行的查询对数据库建模。 对于前 -
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
},
]
}
答案 2 :(得分:2)
确保数据完整性的步骤: