Database design MongoDB:存储和存储;何时使用关系

Database design MongoDB:存储和存储;何时使用关系,database-design,mongodb,document-database,Database Design,Mongodb,Document Database,我是MongoDB的新手,所以请容忍我 我有两个问题: 首先,采取以下措施: // add a record $obj = array( "title" => "Calvin and Hobbes", "author" => "Bill Watterson" ); MongoDB是否将“title”和“author”存储为该集合中该对象每个条目的文本?还是创建一个模式并将其转换为字段号(或者什么都不做,只存储数据) 我的第二个问题是:什么时候应该使用“关系”?假设我有100个分销商

我是MongoDB的新手,所以请容忍我

我有两个问题:

首先,采取以下措施:

// add a record
$obj = array( "title" => "Calvin and Hobbes", "author" => "Bill Watterson" );
MongoDB是否将“title”和“author”存储为该集合中该对象每个条目的文本?还是创建一个模式并将其转换为字段号(或者什么都不做,只存储数据)

我的第二个问题是:什么时候应该使用“关系”?假设我有100个分销商,每个分销商包含(对象方面的)1000个客户,每个客户有10个项目。这使得一个巨大的整体对象可以操纵

在SQL世界中,这些都是相关的“对象”。在文档世界中,我们试图通过嵌入子对象来存储完整的对象

然而,这可能很难实现。这方面的最佳做法是什么?有人能给我指一个指南吗

谢谢

MongoDB是否存储“标题”和 “作者”作为每一个人的文本 将此对象输入此 收藏

MongoDB是无模式的——因此答案很明显:是的,因为没有模式

我的第二个问题是:什么时候应该 “关系”可以用吗?假设我有 100名经销商,其中包括 (对象方面)每个客户端1000个,以及 每个客户有10个项目。那个 使一个巨大的整体对象 操纵

请查收


您可以选择嵌入文档、数据库引用或多个查询。

MongoDB字段是否为此集合中的每个条目命名?

是的,MongoDB确实存储每条记录的文本。在实践中,如果磁盘空间是一个限制因素,这通常不是太大的问题,您可能需要考虑其他事项。 什么时候应该使用“关系”?

这与其说是一门科学,不如说是一门艺术。这是一个很好的参考,但这里有一些事情需要考虑:

  • 尽可能多地投入

    文档数据库的乐趣在于它消除了大量的连接。您的第一反应应该是尽可能多地在单个文档中放置内容。因为MongoDB文档具有结构化,而且您可以在该结构中高效地进行查询,所以不需要像在SQL中那样立即规范化数据。特别是,任何与其父文档无关的数据都应该是同一文档的一部分

  • 可从多个位置引用到其自身集合中的分离数据

    这与其说是一个“存储空间”问题,不如说是一个“数据一致性”问题。如果多条记录引用同一数据,则更新单个记录并在其他位置保留对该记录的引用会更高效,也不容易出错

  • 文档大小注意事项

    MongoDB对单个文档施加4MB大小限制。在一个GB数据量的世界里,这听起来很小,但同时也是3000万条推特或25万条典型的堆栈溢出答案或20张闪烁的照片。另一方面,这是比一个典型的网页上一次可能要显示的信息多得多的信息。首先考虑什么会使你的查询更容易。在许多情况下,对文档大小的关注将是过早的优化

    在您给出的示例中,我将创建3个单独的集合,因为我不需要了解其他9个项目来创建项目列表。我将保持查询的简单性。(但请参见底部的Protip)

  • 复杂的数据结构:

    MongoDB可以存储任意深度嵌套的数据结构,但不能有效地搜索它们。如果数据形成树、林或图,则实际上需要将每个节点及其边存储在单独的文档中。(注意,对于这种类型的数据,有专门设计的数据存储,也应该考虑)

  • 数据一致性

    MongoDB在效率和一致性之间进行权衡。规则是,对单个文档的更改总是原子的,而对多个文档的更新永远不应该被认为是原子的。也无法在服务器上“锁定”记录(您可以使用例如“锁定”字段将其构建到客户机的逻辑中)。设计模式时,要考虑如何保持数据一致性。通常,文档中保存的内容越多越好

专业提示

即使您确实使用了引用,也最好在父文档中保留一点引用中的数据。一般来说,我保存了足够的信息,可以在父对象中建立到子对象的有意义的链接

在您的示例中,这意味着将客户名称与ObjectID一起保留在经销商的文档中,这样我就可以按名称创建到每个客户的链接,而无需单独查询。如果为客户端构建URL需要文档id之外的内容,我也会将其存储起来


像这样的技巧可以减少1+n查询情况。

Yes,
title
author
作为文本存储在数据库中。根据您使用的语言/驱动程序/包装器,通常可以重新映射该字段,以便该字段在数据库中为
t
,但从对象访问时为
title
。从关系的角度来看,你通常会发现你必须为“某些东西”进行优化。没有单一的“最佳方式”。下次请将您的问题拆分为单独的stackoverflow问题。请注意,MongoDB的最新版本现在高达16MB。这是1.8.0版。因此,如果您正在启动一个新项目,16MB将成为您的“新”最大容量。我们被建议不要将文档设置得太大,因为这可能会影响性能。这是一个糟糕的建议吗?克拉夏洛特:再一次,在你的问题中,艺术多于科学。在执行连接时,MongoDB的性能不如SQL数据库。抓取一堆文档比检索一个大文档要糟糕得多。另一方面,如果你很少需要