1-many 关系的前向访问通常是如何实现的?

Posted

技术标签:

【中文标题】1-many 关系的前向访问通常是如何实现的?【英文标题】:How is the forward access of 1-many relationships normally implemented? 【发布时间】:2018-05-20 10:07:22 【问题描述】:

我知道一对多关系最容易用具有指向父项的外键引用的子项来表示。

Parent
  - id

Child
  - id
  - parentId // fk

在这种情况下,从孩子访问父母是微不足道的。只需对父表进行 O(1) 访问。

但是如何管理一个父母的所有孩子的有效访问?

例如像Parent.children() 这样的方法通常如何在 orm 中实现以使其高效?

我考虑过/尝试过的一些事情:

如果父级也有childIds: [] 的列表,这将起作用,但是您必须在创建后将 childId 插入到父级 childIds 中。创建模型的两个操作似乎是错误的,即使它让我们 O(1) 访问子 ID 列表。

您可以简单地循环遍历所有子 children.filter(( parentId ) => parentId === 2) 以获取此处的子代,例如父 2 您想要访问所有父 2 的孩子的每个领带。但这是 O(n) 次操作,效率低下。

是否有一些标准方法可以避免这两个陷阱? IE。什么是 / 是实现以一对多关系返回父模型的子代的 orm 方法的标准方法?

【问题讨论】:

请用您的 ORM 标记。请阅读How to Ask 并采取行动,点击谷歌搜索“stackexchange homework”和向下投票箭头鼠标悬停文本。这太宽泛了,但也是一个常见问题。此外,您似乎不知道 ORM 是什么,因为使用 ORM 而不是非关系解决方案的全部意义在于,人们可以以非关系风格编写这样的表达式,而不必执行通过非关系“遍历所有”。 问题是关于 orm 的这方面通常是如何实现的,我没有使用 ORM,我正在编写自己的规范化存储和围绕它的 orm。经过数小时的搜索,我找不到在实现一对多关系的正向时通常应用哪些原则。我知道这个问题写得不是很好,但它是一个非常简单的问题:通常如何实现正向 1-many 关系方法。 是的,但我的第一条评论仍然适用。 What is an ORM and where can I learn more about it?的可能重复 【参考方案1】:

基于@philipxy 的cmets,最好的方法是回答我自己的问题,也许其他人可以更好地回答。

ORM 允许您声明关系和方法以获取相关实体查询的结果,但 ORM 执行的查询是特定于存储的,这就是它“更高效”的地方。在 SQL 存储中,开发人员通常不会考虑这一点,ORM 只会运行例如select * from children where parentId = 2,商店会提高效率。

看来您有一个 javascript 对象存储。除非性能是一个真正的问题,否则children.filter( parentId ) === parent.idredux-orm 使用的方法,考虑到现代浏览器的速度,很可能就足够了。

对于 SQL 存储,优化此类查询的方法可能要低得多。例如,如果所有孩子都按 parentId 排序,则可以使用比 O(n) 更有效的算法。一些这样的方法也可以应用于 javascript 对象存储。

换句话说,在子模型上使用 parentId 会导致从 1 到 many 时出现过滤问题。

您还提到了这样一个事实,即您可以表示父级具有子级 ID 的一对多关系。鉴于在这种情况下,如果您想从孩子转到父母(找到其中一个孩子拥有您所追求的孩子 ID 的父母),在这种情况下您仍然会面临过滤问题,除非出于某种原因您打算非常频繁地从父母传给孩子,但反之亦然,这可能不太合适。它不太适合业务问题,如果没有父母,孩子就不会有意义地存在,例如对帖子的评论,因为以这种方式存储关系需要孩子首先存在。

简而言之,O(n) 循环来实现 1-many 方法将需要较大的 n 成为性能瓶颈,如果是这样,还有其他小于 O(n) 的过滤方法。您可以探索 CS 过滤算法以进一步了解这一点。此外,如果您正在实施您的商店,许多选项都是有效的,这取决于您的具体情况。 SQL 通常会在某种程度上抽象使用的算法,但如果您正在实现自己的商店,则需要根据您的案例更仔细地考虑这一点。

【讨论】:

以上是关于1-many 关系的前向访问通常是如何实现的?的主要内容,如果未能解决你的问题,请参考以下文章

神经网络的前向与后向传播简单理解

C++ 中嵌套类型/类的前向声明

前向算法Python实现

C++ 中的前向引用或声明

模板-宽度优先搜索的前向星实现

模板-深度优先搜索的前向星实现