与MySQL相比,MongoDB中的文档之间的引用

时间:2013-10-29 17:45:27

标签: mongodb

在MySQL中,我创建了一个用户表,为表提供了一个字段“userid”,为每个新用户分配了一个带有AUTO_INCREMENT的唯一ID。然后,我在几个表上分发有关用户的其他信息,每个表都有一个字段“userid”...

MongoDB中这种模式的等价物是什么?

我将使用哪个数据对象在多个文件中创建引用?

1 个答案:

答案 0 :(得分:1)

MongoDB没有自动增量,因为当您拥有独立计算机的分布式群集时,自动增量不能正常工作。与此相当的是MongoDB为每个文档分配的唯一ObjectID。它们比整数长得多,但它们保证全局唯一,因此它们可以用作不同的标识符。

MongoDB不支持JOIN。当您需要它们时,您需要在应用程序层上模拟它们。这意味着您通常应该避免在多个文档上分发有关一个实体的数据。通常的解决方案是将所有数据作为子对象或在父文档中的数组中嵌入。在SQL中执行此操作是一个坏主意,但MongoDBs查询语言和索引系统是为此而制定的,并且支持它非常好。

示例:如果您的发票包含n个职位,则您将拥有两个SQL表invoice_headinvoice_position。在MongoDB中,您将拥有一个集合invoices,其中每个文档都有一个位置数组。

但是,有一个例外。 MongoDB不喜欢随时间增长的对象。出于性能原因,MongoDB尝试将每个文档保存在硬盘驱动器的连续部分中。这意味着当文档增长到超过该部分时,需要重新分配。这种不断的重新分配可以是一个真正的性能钩子。非常大的对象也不利于缓存。为了进一步阻止不断增长的对象,MongoDB对每个文档施加了16MB的人为大小限制。

示例:如果您的论坛中每个用户都有n个帖子,您就不会将帖子嵌入编写它们的用户的文档中,也不会嵌入其所属线程的文档中,因为这些文件会随着时间的推移而增长和增长,并且有一天会达到16MB的限制。