数据库设计-联接表的子项关键字选择



我搜索了以下问题的答案,但得到的答案大多与是否使用代理有关,而不是与是否在联接表的子级上使用复合键有关

我有一个表attendees和一个表events

联接表是event_attendees,包含两个外键attendee_idevent_id,并且还有一个代理主键id

现在假设一个活动的参与者可以拥有schedule_items

我通常只使用表event_attendee_schedule_items中的列event_attendee_idschedule_item_id

使用下面的复合外键设置会比上面的设置有什么缺点(如果有的话)?

attendee_idevent_idschedule_item_id(复合键,而不是指向event_attendees表的直接链接)?

如果:,我推荐第一种方法

  • 仍然需要表CCD_ 15。因为如果有两个联接表event_attendeesevent_attendee_schedule_items(如果使用第二种方法,基本上就是这样),则可能会输入不一致的数据。即使你可以保证这两个表是同步的(例如通过写入数据的外部程序),我也不会这么做。

  • 您有相同样式的其他扩展的想法,比如表event_attendee_invoice_parts(它将链接到发票数据),您可以将通用数据放入event_attendees

  • CCD_ 20具有其自己的属性,如将在CCD_ 22的上下文中使用的CCD_。对于此查询,您无论如何都必须加入event_attendees

最后一个原因给了我们一个额外的提示:这取决于表中的数据量和您进行的查询在某些情况下,您的性能将受益于组合键(和组合索引),而在其他情况下则不然。有关详细讨论,请参阅此问题。

最新更新