在 MySQL 中,我创建了一个用户表,给表一个字段“userid”,为每个新用户分配一个具有 AUTO_INCREMENT 的唯一 ID。然后,我将有关用户的其他信息分发到多个表中,每个表都有一个字段“userid”...
MongoDB中这种模式的等价物是什么?
我将使用什么数据对象来创建以某种方式属于一起的多个文档之间的引用?
在 MySQL 中,我创建了一个用户表,给表一个字段“userid”,为每个新用户分配一个具有 AUTO_INCREMENT 的唯一 ID。然后,我将有关用户的其他信息分发到多个表中,每个表都有一个字段“userid”...
MongoDB中这种模式的等价物是什么?
我将使用什么数据对象来创建以某种方式属于一起的多个文档之间的引用?
MongoDB 没有自动增量,因为当您拥有独立机器的分布式集群时,自动增量无法正常工作。与此等效的是 MongoDB 分配给每个文档的唯一 ObjectID。它们比整数长得多,但保证它们是全局唯一的,因此它们可以用作不同的标识符。
MongoDB 不支持 JOIN。当你需要它们时,你需要在应用层上模拟它们。这意味着您通常应该避免将有关一个实体的数据分布在多个文档中。通常的解决方案是将所有数据作为子对象或数组嵌入到父文档中。在 SQL 中这样做是一个坏主意,但是 MongoDB 的查询语言和索引系统就是为此而设计的,并且非常支持它。
示例:当您有一张包含 n 个职位的发票时,您将有两个 SQL 表,invoice_head
并且invoice_position
. 在 MongoDB 中,您将拥有一个集合invoices
,其中每个文档都有一组位置。
然而,有一个例外。MongoDB 不喜欢随时间增长的对象。出于性能原因,MongoDB 尝试将每个文档保存在硬盘驱动器的连续部分中。这意味着当文档增长到超出该部分时,需要重新分配它。这种不断的重新分配可能是一个真正的性能挂钩。非常大的对象也不利于缓存。为了进一步阻止不断增长的对象,MongoDB 对每个文档施加了 16MB 的人为大小限制。
示例:当您有一个论坛,其中每个用户都有 n 个帖子时,您不会将帖子嵌入到撰写帖子的用户的文档中或他们所属线程的文档中,因为这些文档会随着时间的推移而不断增长并且可能有一天会达到 16MB 的限制。