数据库设计 - 连接表的子项关键选择
Database design - children of join tables key choice
我搜索了以下内容的答案,但得到的答案大多与是否完全使用代理项有关,而不是关于是否对 join 的子项使用复合键 tables.
我有一个tableattendees
和一个tableevents
。
联接table是event_attendees
,包含两个外键attendee_id
和event_id
,还有一个代理主键id
现在假设活动中的参与者可以 schedule_items
。
我通常会在 table event_attendee_schedule_items
.
中简单地使用 event_attendee_id
、schedule_item_id
列
如果有的话,使用以下复合外键设置与上述设置相比有什么缺点?
attendee_id
、event_id
、schedule_item_id
(复合键而不是直接 link 到 event_attendees
table)?
如果出现以下情况,我会推荐第一种方法:
仍然需要table event_attendees
。因为如果你有两个 join tables event_attendees
和 event_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。
我搜索了以下内容的答案,但得到的答案大多与是否完全使用代理项有关,而不是关于是否对 join 的子项使用复合键 tables.
我有一个tableattendees
和一个tableevents
。
联接table是event_attendees
,包含两个外键attendee_id
和event_id
,还有一个代理主键id
现在假设活动中的参与者可以 schedule_items
。
我通常会在 table event_attendee_schedule_items
.
event_attendee_id
、schedule_item_id
列
如果有的话,使用以下复合外键设置与上述设置相比有什么缺点?
attendee_id
、event_id
、schedule_item_id
(复合键而不是直接 link 到 event_attendees
table)?
如果出现以下情况,我会推荐第一种方法:
仍然需要table
event_attendees
。因为如果你有两个 join tablesevent_attendees
和event_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。