微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

所有产品的单一大集合 vs 每个产品类别的单独集合

如何解决所有产品的单一大集合 vs 每个产品类别的单独集合

我是 Nosql 的新手,我正在尝试找出为我的数据库建模的最佳方法。我将在项目中使用 arangoDB,但我认为如果使用 MongoDB,这个问题也成立。

数据库将存储 12 类产品。每个类别预计将包含数百或数千种产品。产品也会不断添加/删除

所有产品都会有许多通用字段,但每个类别也会有独特的字段/对数据的不同限制。

请记住,在某些情况下,我需要同时查询所有类别,例如在所有类别中搜索产品,而在其他情况下,我只需要查询一个类别。

我应该创建一个单独的集合“产品”并使用一个字段来指示类别,还是为每个类别创建一个单独的集合?

我已经阅读了许多与这个想法相关的问题(1 个集合 vs 多个),但除了“这取决于”之外,我无法得出结论。

所以我的问题是:在这个特定用例中,在性能和速度方面,哪个选项是最优化的,多个集合 vs 单个集合 + 分片?

任何帮助将不胜感激。

解决方法

正如您所提到的,您需要处理您的数据和用例。你会有更好的画面。

需要做的一些决定如下。

  1. 决定您在不久的将来拥有的文件数量。如果你一年有 100 万个文档,那么尝试至少 300 万个数据

  2. 决定所需索引的数量。

  3. 决定每秒写入和读取的次数。

  4. 确定每个类别的文档大小。

  5. 决定查询模式。

基于需求的一些输入

  1. 如果您有更多的写入和更多的索引,那么由于需要更新多个索引,单个整体式集合会变慢。

  2. 由于每个类别有不同的字段集,您可以尝试使用多个集合。 有 $unionWith 可以组合来自多个集合的数据。但是检查性能完全取决于上述决定。还要注意这个 open issue

  3. 如果您决定采用整体式收集,请推迟分片。一旦发现查询速度较慢,就实施此操作。

  4. 如果你在同一个文档上有更多的写入,写入将按顺序执行。它也会减慢你的阅读速度。

  5. 考虑在从集合中清除更多数据时回收磁盘空间。多个集合在这里效果很好。


  1. 迫使我建议整体集合的要点是 I'd need to query all the categories at the same time。您可能需要添加更多类别,但将所有类别组合在单个响应中并不会提高性能。

  2. 由于您实际上没有像 RDBMS 那样的连接用例,因此您可以从模型的角度使用单个整体集合。我怀疑您是否有连接密钥。

如果我的任何观点不正确,请告诉我。

,

SQL 还是 NoSQL?

我认为在您在 NoSQL 中实现这一点之前,您应该问问自己为什么要这样做。我非常喜欢 NoSQL,但某些数据绝对比其他数据更适合该模型。

您所描述的数据是关系 SQL 数据库的经典案例。如果这是一个业余项目并且您想尝试 NoSQL,那很好,但如果这是用于生产环境或客户端,您可能会让他们的处境更加困难。

关系型还是非关系型?

您提到了所有产品的通用字段。如果您希望更新这些字段并将这些更新反映在所有产品中,那么您就有了关系数据。

背景

可能值得一读Sarah Mei 2013 article about this。跳到“MongoDB 如何存储数据” 部分并从那里阅读。警告:这篇文章被称为“为什么你不应该使用 MongoDB”并且(可能是故意的)对 Mongo 有点偏见,所以通过正确的视角阅读这篇文章很重要。您应该从本文中得到的信息是 MongoDB 并不适合每种数据类型。

在 Mongo 中处理关系数据的两种策略:

  1. 每次更新这些通用字段之一时,请使用新的通用字段数据更新每个产品的文档。这通常仅适用于更新很少或文档很少的情况,但不能两者兼有。
  2. 使用引用并进行连接。
  • 在 Mongo 中,联接通常发生在代码端(多个数据库调用)
  • 在 Arango(以及其他图形数据库,以及一些键值存储)中,连接发生在数据库端(单个数据库调用)

决定

在决定使用哪个数据库以及如何对数据建模时,这些是需要考虑的重要因素

我使用过 MongoDB、ArangoDB 和 Neo4j。

  • Mongo 绝对拥有最好的工具,而且很容易找到帮助,但我认为它不适合这种情况
  • 与 Arango 一起工作非常愉快,但尚未获得应有的采用
  • 我不会向任何寻求 NoSQL 解决方案的人推荐 Neo4j,因为它的节点和关系仅支持平面属性(无嵌套,因此不是真实文档)
  • 可能也值得考虑 MariaDB 或 Postgres

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。