当前位置: 首页 > 面试题库 >

在单个SQL表中表示记录之间的多对多关系的最佳方法是什么?

董高逸
2023-03-14
问题内容

我有一个这样的SQL表:

更新:我正在更改示例表,因为原始数据(州,城市,学校)的现有层次结构性质掩盖了项目之间需要简单关系的事实。

entities
id      name               
1       Apple     
2       Orange            
3       Banana             
4       Carrot                
5       Mushroom

我想在这些实体之间定义双向关系,以便查看一个实体的用户可以看到所有相关实体的列表。

这些关系是由最终用户定义的。

数据库中表示这些关系并随后查询和更新它们的最佳方法是什么?

我所看到的一种方式…

我的直觉说像这样的关系表:

entity_entity
entity_id_a       entity_id_b
1                 2
5                 1
4                 1
5                 4
1                 3

在这种情况下,假设提供的entity_id为4,将如何获得所有相关记录(分别为1和5)?

同样,对entity_id = 1的查询应返回2、3、4和5。

感谢您的时间,让我知道是否可以澄清所有问题。


问题答案:

定义约束:entity_id_a < entity_id_b

创建索引:

CREATE UNIQUE INDEX ix_a_b ON entity_entity(entity_id_a, entity_id_b);
CREATE INDEX ix_b ON entity_entity(entity_id_b);

第二个索引不需要包括在内,entity_id_a因为您将使用它仅选择a一个内的所有索引bRANGE SCANonix_b将比SKIP SCANon快ix_a_b

使用您的实体填充表,如下所示:

INSERT
INTO entity_entity (entity_id_a, entity_id_b)
VALUES (LEAST(@id1, @id2), GREATEST(@id1, @id2))

然后选择:

SELECT entity_id_b
FROM entity_entity
WHERE entity_id_a = @id
UNION ALL
SELECT entity_id_a
FROM entity_entity
WHERE entity_id_b = @id

UNION ALL 在这里,您可以使用上述索引,并避免为了唯一性而进行额外的排序。

以上对于对称和反身关系都是有效的。这意味着:

  • 如果 一个 关系到 b ,则 b 是关系到 一个

  • a* 从未与 a 相关 *



 类似资料:
  • 我正在使用hibernate多对多的关联。我有3个表(STUDENT,COURSE和STUDENT_COURSE)。在3个表中,2个是主表,1个是提供关系的中间表。当记录从STUDENT中删除时,相应的映射将从Student_Course中删除。我的要求是它甚至应该从课程表中删除记录。考虑以下STUDENT_COURSE条目: 当从学生表中删除101时,上述表中的第一个条目被删除,但课程表中对应于

  • 问题内容: 代表具有属性的多对多关系的最“ mongo”方式是什么? 因此,例如: MYSQL表 => => => 解决方案1 将人们嵌入电影中…? 在MongoDB中,我知道这样做很好,但是我不想让人们看电影,从逻辑上讲这没有任何意义。因为人们不一定只属于电影。 解决方案2 并且将两个单独的集合。 =>嵌入 =>嵌入 该解决方案的问题在于,当我们要为特定对象更新人员时,我们需要运行两个更新查询以

  • 我使用的是Laravel 5.4,其模型和表格结构如下: 一个用户可以有多个账户 一个帐号可以被多个用户共享 每个账户有多个持有量 因此,用户通过他们的许多帐户间接拥有许多资产。 我需要帮助在用户模型上定义一个称为“持有量”的关系,以获得适用于用户的所有持有量(基于他们所链接的账户)。 我尝试了很多不同的东西,在谷歌上花了很长时间。我可以接近BelongToMany和hasManyThrough,

  • 问题内容: 假设我有两个或两个以上相同长度的列表。遍历它们的好方法是什么? ,是列表。 要么 还是我缺少任何变体? 使用一个相对于另一个有什么特别的优势吗? 问题答案: 通常的方法是使用: 这将停止两个iterables时较短且耗尽。另外值得注意的是:(仅适用于Python 2)和(适用于Python 3)。

  • 我需要在我的数据库中创建多个多对多的关系。 有一个“主”表,我们称之为“项目”。 然后有3个表包含“选项”。 假设我们有:品类、地域、用户。这些保存的唯一信息是项目的名称和ID。 可以将多个类别、区域和用户分配给多个项目。 因此,我有两个选项来创建这种关系: 1)为每个'选项'表创建关系表。每个表包含两列:project_id和category_id、region_id或user_id。使用这种方

  • 问题内容: 已关闭 。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗? 更新问题,以便通过编辑此帖子以事实和引用的形式回答。 3年前关闭。 “关联表”的正确或最受欢迎的名称是什么? 我听说过查找,关联,解析,映射和联结表。 问题答案: 对照表。CustomerProductXRef。