我是NoSQL的新手,我正在尝试找出建模数据库的最佳方法。我将在项目中使用ArangoDB,但我认为如果使用MongoDB,这个问题也会成立。
数据库将存储12个类别的产品。每个类别预计将容纳数百或数千个产品。产品也将不断添加/删除。
所有产品都有许多通用字段,但每个类别也有唯一字段/不同的数据限制。
请记住,在某些情况下,我需要同时查询所有类别(例如,在所有类别中搜索产品),而在其他情况下,我只需要查询一个类别。
我应该创建一个“产品”集合并使用一个字段来指示类别,还是为每个类别创建一个单独的集合?
我已经读了很多关于这个想法的问题(一个集合对许多),但我还没有能够得出一个结论,除了“它取决于”。
所以我的问题是:在此特定使用案例中,就性能和速度而言,多个收集与单个收集+分片,哪个选项最佳?
任何帮助都将不胜感激。
2条答案
按热度按时间nbewdwxp1#
正如你提到的,你需要利用你的数据和用例。你会有更好的图片。
一些决定要求如下。
1.决定你在不久的将来要拥有的文档数量。如果你一年要拥有100万个文档,那么至少要有300万个数据
1.确定所需的索引数。
1.决定每秒的写入和读取次数。
1.确定每个类别的文档大小。
1.确定查询模式。
基于要求的一些输入
1.如果您有更多的写入和更多的索引,则单个整体收集将较慢,因为需要更新多个索引。
1.由于每个类别有不同的字段集,您可以尝试使用多个集合。有$unionWith可以合并来自多个集合的数据。但请检查性能,它完全取决于上述决定。也请注意open issue。
1.如果您决定使用整体式集合,请推迟分片。一旦您发现查询速度较慢,就执行此操作。
1.如果在同一文档上有多个写入操作,写入操作将按顺序执行。这也会降低读取速度。
1.当从集合中清除更多数据时,考虑回收磁盘空间。
1.迫使我建议使用单一集合的一点是
I'd need to query all the categories at the same time
。您可能需要添加更多的类别,但是将所有类别组合在一个响应中在性能方面不会更好。1.由于您实际上没有像RDBMS中那样连接用例,所以从模型的Angular 来看,您可以使用单个的整体集合。
如果我的观点有任何不正确的地方,请告诉我。
a14dhokn2#
到SQL还是到NoSQL?
我认为,在NoSQL中实现这一点之前,您应该问问自己为什么要这样做。我非常喜欢NoSQL,但有些数据肯定比其他数据更适合该模型。
您所描述的数据是关系SQL DB的典型案例。如果这是一个业余爱好项目,并且您希望尝试NoSQL,这是可以的,但如果这是用于生产环境或客户端,您可能会使他们的情况更加困难。
关系型还是非关系型?
您提到了所有产品的公用字段。如果您希望更新这些字段并使这些更新反映在所有产品中,则您具有关系数据。
背景
它可能值得一阅读Sarah Mei 2013 article about this。跳到章节**“MongoDB如何存储数据”**并从那里开始阅读。警告:这篇文章的标题是“为什么您不应该使用MongoDB”,它对Mongo有些偏见(也许是有意的),因此通过正确的透镜阅读这篇文章是很重要的。
在Mongo中处理关系数据的两种策略:
1.每次您更新其中一个公用字段时,请使用新的公用字段数据更新每个产品的文档。通常,只有在更新很少或文档很少的情况下才可以这样做,但不能同时更新和文档。
1.使用引用并进行连接。
决策
在决定使用哪个数据库以及如何对数据建模时,这些都是需要考虑的重要因素
我用过MongoDB、ArangoDB和Neo4j。