mongoDB替代外键约束

viv*_*v1d 6 mongodb

我创建了一个SQL DB并检查了完整性.现在我想将这些表放在mongoDB中,并将其保留在映射规则中.Table = collection,row = 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));
Run Code Online (Sandbox Code Playgroud)

DBRef,我试过但不是外键替代品.

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

Phi*_*ipp 20

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

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

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

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

总结一下: MongoDB并不像SQL数据库那样"聪明".它本身并没有太大作用.它完成了应用程序所做的事情,而不是更多而不是更少.但这就是为什么它如此之快(没有昂贵的一致性检查)和灵活(没有实现新功能所需的数据库修改)的原因.


xam*_*mir 5

关系数据库的一大优点是,它确实可以使数据库中的数据保持一致。它执行此操作的方法之一是使用外键。外键约束是,假设有一个包含某些列的表,该表将具有一个外键列,该列具有来自另一个表的列的值。在中MongoDB,不能保证将保留外键。程序员应确保以这种方式确保数据的一致性。在将来的版本中,这可能是可行的,MongoDB但是今天,没有这样的选择。外键约束的替代方法是嵌入数据

  • 如果父文档拥有嵌入的数据,Embeddig 数据只是一种替代方法。有些情况下,文档有自己独立的生命周期,但仍需要从其他文档中引用。如果我理解正确,在这种情况下就无法保持一致性,导致数据随着时间的推移不可避免地退化。最坏的情况是,人们会试图找到解决方法,同时在世界各地浪费时间来解决根本无法解决的问题。 (2认同)