我搜索了以下问题的答案,但得到的答案大多与是否使用代理有关,而不是与是否在联接表的子级上使用复合键有关
我有一个表attendees
和一个表events
。
联接表是event_attendees
,包含两个外键attendee_id
和event_id
,并且还有一个代理主键id
现在假设一个活动的参与者可以拥有schedule_items
。
我通常只使用表event_attendee_schedule_items
中的列event_attendee_id
、schedule_item_id
。
使用下面的复合外键设置会比上面的设置有什么缺点(如果有的话)?
attendee_id
、event_id
、schedule_item_id
(复合键,而不是指向event_attendees
表的直接链接)?
如果:,我推荐第一种方法
-
仍然需要表CCD_ 15。因为如果有两个联接表
event_attendees
和event_attendee_schedule_items
(如果使用第二种方法,基本上就是这样),则可能会输入不一致的数据。即使你可以保证这两个表是同步的(例如通过写入数据的外部程序),我也不会这么做。 -
您有相同样式的其他扩展的想法,比如表
event_attendee_invoice_parts
(它将链接到发票数据),您可以将通用数据放入event_attendees
-
CCD_ 20具有其自己的属性,如将在CCD_ 22的上下文中使用的CCD_。对于此查询,您无论如何都必须加入
event_attendees
。
最后一个原因给了我们一个额外的提示:这取决于表中的数据量和您进行的查询在某些情况下,您的性能将受益于组合键(和组合索引),而在其他情况下则不然。有关详细讨论,请参阅此问题。