mongodb - MongoDB 带有数组的大文档 VS 小而多的文档
问题描述
我们有一个送餐应用程序。我们使用 MySQL,但我们现在正在迁移到 MongoDB。
我们有这样的表:餐厅、菜单、订单等......
要迁移 MongoDB,我对如何为“菜单”集合设计模式感到困惑
选项 1) 使用与 MySQL 相同的方式,'menus' 集合将有很多来自不同餐厅的菜单(文档)
选项 2) 每个商店将在“菜单”集合中有一个文档,将他们的菜单嵌入到他们的文档中
总而言之,哪一个最适合 MongoDb?20000 个小文档与 100 个文档,每个文档包含 100 或 200 个数组/对象。我要求性能,如果这个应用程序随着数十家新餐厅的增长而增长
每个菜单文档几乎是 256 字节,为了计算,我们可以很容易地说每个商店的菜单在 50 到 200 之间。(所以我们不会超过 MongoDB 的 16MB 文档限制)
此外,我们需要在两个不同的页面上使用应用程序内的“菜单”,第一个:20 种来自不同餐厅的适合您附近位置的最佳食物,第二个:每个商店都有自己的页面和自己的菜单。
注意:当餐厅添加所有菜单时,他们的菜单至少在 6-8 个月内保持 98% 不变。除了价格或小细节外,他们不会轻易修改/编辑或更改。
解决方案
在 MongoDB 中,您以稍后想要读取的格式存储数据。
所以你需要分析你的用例:
- 来自不同餐厅的 20 种最佳美食,适合您附近的位置
- 每个商店都有自己的页面和自己的菜单。
我不确定第一个用例,但看起来你总是要先过滤餐厅(位置),所以在这种情况下,将菜单项与餐厅一起存储。
如果您想直接过滤菜单项,您可以将它们存储在具有专用索引的单独集合中。在您的情况下,如果您将地理位置添加(非规范化)到每个不同的菜单项,这也可以工作。
您也可以同时执行以下操作:将菜单项存储在餐厅文档中并作为单独的文档。
推荐阅读
- json - 带有值的输出键
- vb.net - 我的程序仅在一次 PC 中停止工作(第二次存储图片时)
- cocoapods - 确定 cocoapods 的安装方式
- c++ - 不能用 boost beast 做 https-request
- c++ - 发送带有 MapViewOfFile 的结构并读取未知值
- linux - 我们如何找出进程的进程 ID,在 LINUX 中读取命名管道/FIFO?
- java - 如何连续传递 DecimalFormat 两个文字字符?
- java - 具有泛型类型的 Java 工厂
- memory-mapped-files - Chronicle Queue 内存映射文件以减少避免垃圾收集?
- python-3.x - NameError:名称'main'未定义 - 缩进