MongoDB - 多对多关系?

2024-01-09

我很好奇如何构建一个具有多对多关系、可能有数万条记录的 MongoDB。

假设您有一个餐厅数据库,可以跟踪大量餐厅以及所有入住过这些餐厅的人。因此,用户可能想要查找一个人并查看他们已签到的所有餐厅,而且还想查找一家餐厅并查看所有已签到的人。

如何以一种有意义且易于搜索和更新的方式构建它?


您给出的示例与大多数现实世界中的多对多关系示例一样,实际上是一个示例几对几关系。您可能有许多餐厅和许多食客,但与整个集合相比,任何给定的餐厅只为一小部分食客提供服务,并且大多数单独的食客只会访问一小部分餐厅。这听起来像是一个稀疏链接的网络,其中链接密度比明显低于 1。

为了测量网络的链接密度(边缘密度),我们计算 现有链接 m 与可能链接总数的比率。 对于 N 个节点的网络,网络链路密度为 D = m / 0.5*N*(N-1) 全连接网络的(最大)链路密度 D 为 1。 -网络科学 http://www.network-science.org/highly-connected-society-dense-social-complex-networks.html

但是,您问的是多对多,那么我们以神经网络为例怎么样?神经网络通常形成密集网络,因此代表真正的多对多网络。在这种情况下,答案很简单——不要使用 mongoDB。使用根据您的具体要求量身定制的自定义结构和序列化策略。毕竟,真正的多对多关系几乎总是异常值,因此需要进行特定的处理。

话虽如此,建模更常见几对几mongoDB 中的关系可以在不牺牲丰富文档结构的情况下实现,而如何实现这一点取决于您的访问模式。

因此,对于餐厅/食客网络示例,如果您通常要查询餐厅的食客信息,那么您将创建每个餐厅保存的diner_ids 数组。另一种方式意味着每个用餐者持有一系列的restaurant_ids。两者都是为了双向查询能力。

必须小心,因为 mongoDB 中没有foreign_key 约束,因此维护数据的引用完整性是您的责任。

如果性能对您来说最重要,那么您可能希望将数据嵌入到每个文档中,而不是使用 id 引用它。这是读取性能更高的选项(写入性能不那么高),因为所有数据都可以一次从磁盘中取出。这意味着您在更新数据值时需要做更多工作以确保数据的完整性,但这通常并不像乍看起来那么可怕。食客真正改名的频率有多少?根据文档大小,您可能不一定要嵌入完整文档,数据子集加上指向完整记录的 id 通常就可以解决问题。

简而言之,mongoDB 模式设计应该由应用程序需求驱动。不同的应用程序有不同的模式,而不是用一个单一的关系数据库来统治它们。数据的真实情况如何?应用程序实际上如何使用这些数据?存储的文档对象有多大?回答这些问题,您的模式实际上就会自行设计。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MongoDB - 多对多关系? 的相关文章

随机推荐

  • 使用 Mockito-core 创建最终类的模拟?

    I 在github上找到 https github com relayr android sdk blob master tests src androidTest java io relayr ble service OnBoarding
  • GWT - 具有简单寻呼机问题的单元格

    单元格表分页行为异常 检查 GWT 的示例http gwt google com samples Showcase Showcase html CwCellTable http gwt google com samples Showcase
  • 如何在表单寄存器中添加一些文本字段(laravel 生成器 infyom)?

    我在这里阅读了教程 http labs infyom com laravelgenerator docs 5 3 installation http labs infyom com laravelgenerator docs 5 3 ins
  • 为什么视频观看速度这么慢?

    我在我的应用程序中放置了一个视频视图 它工作正常 但是当您打开页面时 它需要永远加载 缓冲 无论如何我可以解决这个问题吗 我的意思是这是一个3秒视频 加载时间应该不会太长 正确的 code package jslsoftware co nr
  • 是否可以为命名类型/结构定义相等性?

    读完一篇后相关问题 https stackoverflow com questions 20297503 slice as a key in map关于在映射中使用切片 我对 Go 中的相等性感到好奇 我知道可以覆盖equalsJava 的
  • 检测亮图像和暗图像

    我从 stackoverflow 答案中得到了这段代码来检测明亮和黑暗的图像 问题是它不起作用 我不知道为什么 例如如果我打电话 IsDark bitmap 40 0 9 this always sees the image as brig
  • 我可以在 C++ 中嵌套 try-catch 块吗?

    我可以嵌套 try catch 块吗 例如 void f try Some code try Some code catch ExceptionA a Some specific exception handling Some code c
  • 使用网络摄像头、OpenCV 和 Python 跟踪眼瞳位置

    我正在尝试建造一个可以通过基本的眼球运动来控制的机器人 我将网络摄像头对准我的脸 根据我瞳孔的位置 机器人会以某种方式移动 如果瞳孔位于眼睛的上 下 左 右角 机器人将分别向前 向后 向左 向右移动 我最初的计划是使用眼哈尔级联来找到我的左
  • 如何对多个wordpress自定义字段值进行排序?

    显示按 价格 自定义字段排序的 产品 类型的帖子 query new WP Query array post type gt product orderby gt meta value meta key gt price 如果还想按 尺寸
  • git stash save 和 git stash push 有什么区别?

    我应该什么时候使用git stash save代替git stash push反之亦然 git stash save接受一个非选项参数 隐藏消息 git stash push接受带有选项的消息 m并接受要存储的文件列表作为参数
  • 如何将用户输入转换为列表[重复]

    这个问题在这里已经有答案了 我想编写一个Python程序 要求用户输入7个数字 该输入应转换为列表并首先显示单个数字 然后显示整个列表 所以我的想法是从 for 循环开始 for a in range 1 8 number int inpu
  • Mobile Safari 文本输入宽度错误?

    看看这些屏幕截图 https i stack imgur com 1TFuj png https i stack imgur com 1TFuj png https i stack imgur com 3fukT png https i s
  • 设置 » JavaScript 的 document.title 中的 HTML 实体?

    我正在设置document title使用 JavaScript 但我找不到提供的方法 raquo 而不显示为文字文本 这是我的代码 document title Home raquo site com 如果我使用 在文档的标题标签中 它工
  • Rails 在控制器中异步执行任务

    当我的路线中有一条路线时 我需要执行三项任务Controller叫做 现在我的代码看起来像这样 缩写 def set quotas TaskOne new ex TaskTwo new ex TaskThree new ex quotas
  • 如何将svn分支和标签导入git-svn?

    我有一个必须提交的中央 SVN 存储库 但我对 git 充满热情 就像我认识的任何其他开发人员一样 此案众所周知 然后我读到了 git svn 并尝试了一下 由于我不需要完整的历史记录 只需要两个月左右的时间 我确实喜欢这样 git svn
  • 如何使用 OpenCv 查找图像上的角点

    我正在尝试找到图像上的角点 我不需要轮廓 只需要 4 个角点 我将使用 4 个角来改变视角 我正在使用 Opencv 但我需要知道找到角点的步骤以及我将使用什么函数 My images will be like this without r
  • 检查 Android 设备上的 NFC 功能

    这是为了回应question https stackoverflow com questions 5805034 detecting nfc on android devices Step 1 Put this in your manife
  • Z3 对指数的支持

    我是 Z3 的新手 我试图了解它是如何工作的 以及它能做什么和不能做什么 我知道Z3至少有some通过幂 运算符支持指数 请参阅Z3py 使用 pow 函数返回未知方程 https stackoverflow com questions 3
  • 如何使用 Java 计算 Selenium WebDriver 中的 HTML 子标签数量

    在 Selenium JAVA WebDriver 中 如何计算子标签 例子 div class subcategory container div class products container div class product ro
  • MongoDB - 多对多关系?

    我很好奇如何构建一个具有多对多关系 可能有数万条记录的 MongoDB 假设您有一个餐厅数据库 可以跟踪大量餐厅以及所有入住过这些餐厅的人 因此 用户可能想要查找一个人并查看他们已签到的所有餐厅 而且还想查找一家餐厅并查看所有已签到的人 如