MongoDB 3.X:每个数据库只有一个集合有意义吗

MongoDB 3.X:每个数据库只有一个集合有意义吗,mongodb,Mongodb,由于MongoDB 3.x引入了每个记录锁,而不是在集合或数据库上,所以使用一个额外的标识符字段“documentType”将所有数据写入单个集合是否有意义。 它将通过map reduce操作帮助模拟“join”。 Couchbase对“bucket”而不是collection做同样的事情 有人认为这种方法有什么缺点吗?有一个普遍的缺点:索引 在Mongo中,您通常希望设置索引,以便大多数(如果不是全部)查询都使用它们。因此,除了\u id上的索引外,您还将在搜索依据的主要字段上设置索引(通常与

由于MongoDB 3.x引入了每个记录锁,而不是在集合或数据库上,所以使用一个额外的标识符字段“documentType”将所有数据写入单个集合是否有意义。 它将通过map reduce操作帮助模拟“join”。 Couchbase对“bucket”而不是collection做同样的事情


有人认为这种方法有什么缺点吗?

有一个普遍的缺点:索引

在Mongo中,您通常希望设置索引,以便大多数(如果不是全部)查询都使用它们。因此,除了
\u id
上的索引外,您还将在搜索依据的主要字段上设置索引(通常与排序依据的字段复合)

如果要将所有内容存储在一个集合中,这意味着您需要在该集合上具有所有这些索引。这意味着两件事:

  • 索引会更大,因为要索引的文档更多。诚然,使用稀疏索引可以在一定程度上缓解这一问题

  • 在集合中插入或修改文档需要Mongo更新所有这些索引(在标准的使用多个集合方法中只更新相关索引)。这会降低您的写入性能

此外,如果您的应用程序中有一个查询不知何故没有使用这些索引中的一个,那么它需要扫描整个集合,即
O(n)
,其中
n
是集合中的文档数——在您的情况下,这意味着整个数据库中的文档数


收藏品很便宜。使用它们;)

有一个大的缺点:索引

在Mongo中,您通常希望设置索引,以便大多数(如果不是全部)查询都使用它们。因此,除了
\u id
上的索引外,您还将在搜索依据的主要字段上设置索引(通常与排序依据的字段复合)

如果要将所有内容存储在一个集合中,这意味着您需要在该集合上具有所有这些索引。这意味着两件事:

  • 索引会更大,因为要索引的文档更多。诚然,使用稀疏索引可以在一定程度上缓解这一问题

  • 在集合中插入或修改文档需要Mongo更新所有这些索引(在标准的使用多个集合方法中只更新相关索引)。这会降低您的写入性能

此外,如果您的应用程序中有一个查询不知何故没有使用这些索引中的一个,那么它需要扫描整个集合,即
O(n)
,其中
n
是集合中的文档数——在您的情况下,这意味着整个数据库中的文档数


收藏品很便宜。使用它们;)

请详细说明您的用例。MongoDB中的数据建模在很大程度上依赖于它们。我可能无法向您提供实际的数据建模信息,但我打算做的是执行“加入”mongodb服务器上的不同实体在单个查询中的操作,而不是通过多次调用在业务服务器中进行此类计算。无建模+无确切的用例描述=
打印“是和否。取决于用例。”
通常,如果需要模拟连接,您的数据模型很可能有问题。真的吗?从现实世界的角度来看,为给定的MongoDB(或任何其他面向文档的DB)集合提出模型,并且在其他集合中不会有外键引用,这对我来说是完全不自然的。您是否将所有内容都嵌入到集合中的单个文档结构中?如果您需要,您是否曾经需要多个集合?您绝对可以在MongoDB中拥有引用,尽管它们是隐式的。我每次都使用多个集合。让我们以银行为例。我会有一个名为
账户
预订
的集合,这应该是不言自明的。那么我怎样才能得到账户X的余额呢?我会对账户的所有预订进行汇总,对预订值进行加和减。为了节省时间,我可以使用(增量)mapReduce或聚合作业,将当前月初每个帐户的余额写入中间表。与SQL中的基本相同。请详细说明您的用例。MongoDB中的数据建模在很大程度上依赖于它们。我可能无法向您提供实际的数据建模信息,但我打算做的是执行“加入”mongodb服务器上的不同实体在单个查询中的操作,而不是通过多次调用在业务服务器中进行此类计算。无建模+无确切的用例描述=
打印“是和否。取决于用例。”
通常,如果需要模拟连接,您的数据模型很可能有问题。真的吗?从现实世界的角度来看,为给定的MongoDB(或任何其他面向文档的DB)集合提出模型,并且在其他集合中不会有外键引用,这对我来说是完全不自然的。您是否将所有内容都嵌入到集合中的单个文档结构中?如果您需要,您是否曾经需要多个集合?您绝对可以在MongoDB中拥有引用,尽管它们是隐式的。我每次都使用多个集合。让我们以银行为例。我会有一个名为
账户
预订
的集合,这应该是不言自明的。那么我怎样才能得到账户X的余额呢?我会对账户的所有预订进行汇总,对预订值进行加和减。为了节省时间,我可以使用(增量)mapReduce或聚合作业,将当前月初每个帐户的余额写入中间表。和SQL差不多。谢谢Max,我明白你关于inde的观点