mongoDB替代外键约束

时间:2013-01-11 14:27:52

标签: mongodb

我创建了一个SQL DB并检查了完整性。现在我想将这些表放在mongoDB中,并将其保留在映射规则中。表=集合,行= doc等。

但是如何在mongoDB中设置关注:

create table pruefen 
( MatrNr integer references Studenten on delete cascade,
  VorlNr integer references Vorlesungen,  
  PersNr integer references Professoren on delete set null,  
  Note numeric(2,1) check (Note between 0.7 and 5.0),   
  primary key (MatrNr, VorlNr));

DBRef,我已经尝试但不是外键替换。

如果应用程序要接管它的样子呢?

2 个答案:

答案 0 :(得分:17)

MongoDB没有级联删除。当您的应用程序删除数据时,它还负责删除任何引用的对象本身以及对已删除文档的任何引用。但通常当您在关系数据库中使用on delete时,您会遇到一个组合案例,其中一个父对象拥有一个或多个子对象,并且子对象在没有父对象的情况下毫无意义。 In that situation, MongoDB encourages embedding instead of referencing。这意味着您在父对象中创建一个数组,并将完整的子文档放入该数组中,而不是将它们保存在自己的集合中。这样,它们将与父母一起删除,因为它们是其中的一部分。

虽然在字段中保留多个值是SQL中绝对禁止的,但在MongoDB中没有任何问题。这是因为MongoDB查询语言可以轻松地处理数组和嵌入对象。您甚至可以在数组中的子文档字段上创建索引,这样您就可以轻松搜索嵌入在其他对象中的对象。

如果您仍想引用其他集合中的对象,您可以使用DBRef,也可以使用任何其他唯一标识符(唯一性是MongoDB可以执行的少数几项内容之一。为此,{ {3}})。但在这种情况下,MongoDB不强制执行一致性。您可以创建指向不存在的ObjectIds的DBRef,并且当DBRef指向的文档被删除时,不会发生任何事情。应用程序负责确保在删除文档时,所有引用它的文档都会更新。

MongoDB也不能强制执行约束。由于MongoDB的无模式特性,它甚至无法强制执行字段的特定类型。同样,您的应用程序负责确保它放入mongodb的数据遵循特定的规范。当你想自动化这个时,MongoDB有许多编程语言的对象关系映射框架。

将它全部包装起来: MongoDB不像SQL数据库那样“智能”。它本身并没有太大作用。它完成了应用程序所做的事情,而不是更多而不是更少。但这就是为什么它如此之快(没有昂贵的一致性检查)和灵活(没有实现新功能所需的数据库修改)的原因。

答案 1 :(得分:5)

关系数据库的一大优点是它非常擅长在数据库中保持数据的一致性。其中一种方法是使用外键。一个外键约束是,让我们说一个表有一些列,这个列将有一个外键列,其中包含来自另一个表的列的值。在MongoDB中,无法保证将保留外键。程序员要确保数据以这种方式保持一致。这可能在MongoDB的未来版本中有可能,但今天,没有这样的选择。外键约束的替代方法是嵌入数据