精简版
我必须在现有的多对多连接中为每对添加固定数量的其他属性。跳到下图,就优点和缺点而言,选项1-4中的哪一种是通过扩展基本案例来实现此目的的最佳方法?或者,还有没有在这里我没有考虑过的更好的选择?
较长的版本
我目前有一个通过中间联接表以多对多关系的两个表。现在,我需要向属于这对现有对象的属性添加其他链接。尽管属性表中的一个条目可能适用于多个对(或者甚至可以成对使用多次),但每个对都有固定数量的这些属性。我正在尝试确定执行此操作的最佳方法,并且在梳理如何思考情况时遇到了麻烦。从语义上来说,我似乎可以很好地描述以下任何一种情况:
- 一对链接到一组固定数量的其他属性
- 一对链接到许多其他属性
- 许多(两个)对象链接到一组属性
- 许多对象链接到许多属性
例
我有两个对象类型,X和Y,每个都有唯一的ID,以及一个objx_objy
带有列x_id
和的链接表y_id
,它们一起构成链接的主键。每个X可以与许多Y相关,反之亦然。这是我现有的多对多关系的设置。
基本情况
现在,我另外在另一个表中定义了一组属性,以及一组条件,在这些条件下,给定(X,Y)对应该具有属性P。条件的数量是固定的,所有对都相同。他们基本上说:“在情况C1中,对(X1,Y1)具有属性P1”,“在情况C2中,对(X1,Y1)对具有属性P2”,依此类推,对于联接中每对的三种情况/条件表。
选项1
在我目前的状况正好有三个这样的条件,我也没有理由认为增加,所以一种可能性是添加列c1_p_id
,c2_p_id
以及c3_p_id
对featx_featy
,指定用于给定x_id
和y_id
,其性能p_id
在每个三种情况使用。
在我看来,这并不是一个好主意,因为它使SQL难以选择应用于某个功能的所有属性,并且无法轻松扩展到更多条件。但是,它确实对(X,Y)对执行一定数量的条件的要求。实际上,这是这样做的唯一选择。
选项2
创建一个条件表cond
,并将条件ID添加到联接表的主键中。
不利的一面是,它没有为每对指定条件数量。另一个是当我只考虑初始关系时,例如
SELECT objx.*, objy.* FROM objx
INNER JOIN objx_objy ON objx_objy.x_id = objx.id
INNER JOIN objy ON objy.id = objx_objy.y_id
然后,我必须添加一个DISTINCT
子句以避免重复的条目。这似乎已经失去了每个对应该只存在一次的事实。
选项3
在联接表中创建一个新的“对ID”,然后在第一个与属性和条件之间建立第二个链接表。
除了缺乏对每对执行固定数量的条件外,这似乎具有最少的缺点。创建一个除了现有ID之外没有其他标识的新ID是否有意义?
选项4(3b)
与选项3基本相同,但不创建其他ID字段。这是通过将两个原始ID都放入新的联接表中来完成的,因此它包含x_id
和y_id
字段,而不是xy_id
。
这种形式的另一个优点是它不会更改现有表(尽管它们尚未投入生产)。但是,它基本上多次复制整个表(或者无论如何感觉都是这样),因此似乎也不理想。
摘要
我的感觉是,选项3和4足够相似,我可以选择其中一个。如果不要求对属性进行少量固定的链接,那么到现在我可能已经有了,这使得选项1看起来比其他情况更加合理。根据一些非常有限的测试,DISTINCT
在这种情况下向我的查询添加一个子句似乎不会影响性能,但是我不确定选项2和其他情况是否都代表了这种情况,因为放置会引起内在的重复链接表的多行中的相同(X,Y)对。
这些选择是我最好的前进方式,还是我应该考虑另一种结构?
DISTINCT
子句,我想到的是像#2末尾的查询那样的查询,它通过进行链接x
,但未引用...。因此,如果我受了row 和的约束,那么,我将获得两个相同的查询。行和。y
xyc
c
(x_id, y_id, c_id)
UNIQUE
(1,1,1)
(1,1,2)
SELECT x.id, y.id FROM x JOIN xyc JOIN y
(1,1)
(1,1)