外键约束的mongoDB替代方案

外键约束的mongoDB替代方案,mongodb,Mongodb,我已经创建了一个SQL数据库并检查了完整性。现在我想将这些表放在mongoDB中,并将其保存在映射规则中。表=集合,行=单据,依此类推 但是,在mongoDB中如何着手进行以下工作: create table pruefen ( MatrNr integer references Studenten on delete cascade, VorlNr integer references Vorlesungen, PersNr integer references Professo

我已经创建了一个SQL数据库并检查了完整性。现在我想将这些表放在mongoDB中,并将其保存在映射规则中。表=集合,行=单据,依此类推

但是,在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,我已经尝试过了,但不是外键替换。


如果应用程序要像看上去那样接管,那么MongoDB没有级联删除。当应用程序删除数据时,它还负责删除任何引用对象本身以及对已删除文档的任何引用。但通常,当在关系数据库中使用delete时,会出现这样一种情况:一个父对象拥有一个或多个子对象,没有父对象,子对象就没有意义。这意味着您在父对象中创建一个数组,并将完整的子文档放入该数组中,而不是将它们保存在自己的集合中。这样,它们将与父对象一起删除,因为它们是父对象的一部分

虽然在一个字段中保留多个值在SQL中是绝对不允许的,但在MongoDB中这并没有什么错。这是因为MongoDB查询语言可以轻松地处理数组和嵌入式对象。您甚至可以在数组中的子文档字段上创建索引,以便轻松搜索嵌入到其他对象中的对象

当您仍然希望引用另一个集合中的对象时,您可以使用DBRef,也可以使用任何其他唯一标识符(唯一性是MongoDB可以强制执行的为数不多的事情之一。要做到这一点,)。但在这种情况下,MongoDB并不强制执行一致性。您可以创建指向不存在objectid的DBRef,当DBRef指向的文档被删除时,不会发生任何事情。应用程序负责确保在删除文档时,引用该文档的所有文档都会更新

MongoDB也不能强制执行约束。由于MongoDB的无模式特性,它甚至不能为字段强制执行特定类型。同样,您的应用程序负责确保它放入mongodb的数据符合特定规范。当您想要实现这一点的自动化时,可以使用MongoDB的对象关系映射框架来实现许多编程语言


总而言之:MongoDB没有SQL数据库那么“聪明”。它自己做不了什么。它执行应用程序要求它执行的操作,而不是更多或更少。但这就是它如此快速(无需昂贵的一致性检查)和灵活(无需修改数据库以实现新功能)的原因。

关系数据库的一大优点是它非常擅长保持数据库中数据的一致性。其中一种方法是使用外键。一个外键约束是,假设有一个表包含某个列,该列将包含一个外键列,该列的值来自另一个表的列。在
MongoDB
中,不能保证外键会被保留。由程序员来确保数据以这种方式保持一致。这在未来版本的
MongoDB
中可能是可行的,但现在没有这样的选项。外键约束的替代方案是嵌入数据

“MongoDB鼓励嵌入而不是引用”您可以提供链接吗?在db级别强制约束不应该比在应用程序级别更快吗?难道这不意味着MongoDB最终会因此变得更慢吗?更不用说这些应用程序级约束的实现情况了…@TamasHegedus使用合适的工具来完成这项工作。如果您正在使用MongoDB,但尝试模拟SQL数据库中的每一项功能,那么它当然会慢一些,因为您没有将它用于它设计的用例。您已经在NoSql中发现了“否”。)如果父文档拥有嵌入的数据,则Embeddig数据只是一种替代方法。有些情况下,文档有自己独立的生命周期,但仍然需要从其他文档中引用。如果我理解正确的话,在这种情况下就没有办法保持一致性,随着时间的推移,不可避免地会导致数据退化。最坏的情况是,人们会试图找到变通办法,在全世界同时浪费时间来解决根本无法解决的问题。