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

Database design - children of join tables key choice

我搜索了以下内容的答案,但得到的答案大多与是否完全使用代理项有关,而不是关于是否对 join 的子项使用复合键 tables.

我有一个tableattendees和一个tableevents

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

现在假设活动中的参与者可以 schedule_items

我通常会在 table event_attendee_schedule_items.

中简单地使用 event_attendee_idschedule_item_id

如果有的话,使用以下复合外键设置与上述设置相比有什么缺点?

attendee_idevent_idschedule_item_id(复合键而不是直接 link 到 event_attendees table)?

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

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

  • 你有相同风格的其他扩展的想法,比如 table event_attendee_invoice_parts(这将 link 到发票数据)你可以把通用数据进入 event_attendees

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

最后一个原因给了我们额外的提示:它取决于 table 中的数据量和您进行的查询! 在某些情况下,您的表现会受益于复合键(和复合键 indexes),在其他情况下则不然。有关详细讨论,请参阅 this question