回答

收藏

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

技术问答 技术问答 295 人阅读 | 0 人回复 | 2023-09-14

我有这样SQL表:; ?& x7 v9 a' d$ p  Z
更新:我正在更改示例表,因为原始数据(州、城市、学校)的现有层次结构性质掩盖了项目之间需要简单关系的事实。
" A* ~' i9 e: C/ h6 X& R' d8 xentitiesid      name              Apple    2                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    Orange            3                                          3                                                                                                                                                                                                                                                                              3                                                                                                            3                                                                                                                                                                    Banana            4                                            4           Carrot              5 5                                             5 5                                                                                                                                                                                                                                                                                                          5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5      5 5 5 5 5                  5                           5                                                                                                Mushroom我想在这些实体之间定义双向关系,以便查看所有相关实体的列表。
; [( S& m3 j! u) y& r最终用户定义了这些关系。
2 m4 x  g4 T2 r, R2 A: e$ w. I在数据库中表在数据库中表达这些关系,然后查询和更新它们?' E* H+ A" Q, G& a& O* G
我看到的一种方式…/ _2 E  L9 U% y' U1 h5 P$ U
我的直觉说这样的关系表:7 R5 J2 |; z% ?. J
entity_entityentity_id_a       entity_id_b                                                                                                                                                                                                                                                  14                                                                                                                                                                                                                                                                                                                                                                    在这种情况下,假设提供entity_id4.如何获得所有相关记录(分别为1和5)?( {7 ]1 D8 Z" f* l. `4 ^
同样,对entity_id = 1查询应返回2、3、4、5。- S5 I, z, k* f" l' h
感谢您的时间,让我知道是否能澄清所有问题。
( g2 T  ~- {& G8 p- O                                                               
# |9 r5 X" w9 t$ K% J1 u    解决方案:                                                                , c1 a! R/ l' g% {
                                                                定义约束:entity_id_a ! T( U9 q5 m& P& H! U  H7 p
创建索引:+ d9 H$ n. _9 h
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一个内部的所有索引b。RANGE SCANonix_b将比SKIPSCANon快ix_a_b。
) U# x( ^; T% V/ Y- a1 G4 I如下所示:  r% G! Q; L  z) w' t' Q
INSERTINTO entity_entity (entity_id_a,entity_id_b)VALUES (LEAST(@id1,@id2),GREATEST(@id1,@id2))然后选择:
& r& b' y% v' b- O* c* XSELECT entity_id_bFROM entity_entityWHERE entity_id_a = @idUNION ALLSELECT entity_id_aFROM entity_entityWHERE entity_id_b = @idUNION ALL 在这里,您可以使用上述索引,并避免为独特性排序。
5 Z+ I; S7 M. W, J* k# e对称和反身关系是有效的。这意味着:# k# i' i* g! l8 Z- ]
如果 一个    关系到 b    ,则 b    与 有关一个
+ z& {4 Q- `% z0 q( h. Fa*    从未与 a    相关 *% X$ E* L6 p: ]: O
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则