0

我搜索了以下问题的答案,但得到的答案主要与是否使用代理项有关,而不是关于是否在连接表的子项上使用复合键。

我有一张桌子attendees和一张桌子events

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

现在假设参加活动的参与者可以拥有schedule_items.

我通常会简单地使用表event_attendee_idschedule_item_id的列event_attendee_schedule_items

使用以下复合外键设置有哪些缺点(如果有的话)?

attendee_id, event_id, schedule_item_id(复合键而不是event_attendees表的直接链接)?

4

1 回答 1

1

如果出现以下情况,我会推荐第一种方法:

  • 该表event_attendees仍然是必需的。因为如果你有两个连接表event_attendees并且event_attendee_schedule_items(如果你使用第二种方法,这基本上是你得到的)你可以输入不一致的数据。即使您可以保证这两个表是同步的(例如通过正在写入数据的外部程序),我也不会这样做。

  • 你有相同风格的其他扩展的想法,比如一个表格event_attendee_invoice_parts(它会链接到发票数据)你可以把公共数据放进去event_attendees

  • event_attendees有自己的属性,例如entry_badge_id将在event_attendee_schedule_items. event_attendees对于此查询,您无论如何都必须加入。

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

于 2016-03-24T21:12:16.130 回答