8

我创建了一个 SQL DB 并检查了完整性。现在我想把这些表放在 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,我试过但不是外键替代品。

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

4

2 回答 2

28

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

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

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

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

总结一下: MongoDB 不像 SQL 数据库那样“聪明”。它本身并没有多大作用。它做应用程序告诉它做的事情,不多也不少。但这就是它如此快速(无需昂贵的一致性检查)和灵活(无需修改数据库即可实现新功能)的原因。

于 2013-01-11T14:49:30.547 回答
7

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

于 2016-08-29T14:53:25.180 回答