我的场景很难用一个简短的标题来解释,所以这里有一个例子:
我有多个表“birthday_event”、“meeting_event”、“dinner_event”,它们在名为“attendees”的表中有多个 child 。本质上,我有 3 个不同的一对多关系:“birthday_event”有很多“与会者”,“meeting_event”有很多“与会者”,等等。
每个“事件”表都有自己的特定属性。通常,我会在“与会者”中有一个外键“event_id”,因此关系很牢固,但是有许多不同的事件表可以满足“event_id”属性,所以它不会是严格的外键,如果说得通。
我的理解是,当外键建立时,它是强链接到单个表中的属性,而不是像示例中的 3 个事件表那样的多个表。这也是我的理解,外键永远不应该为空,以确保数据的稳健性。那么,在我的许多事件和许多与会者之间建立牢固关系的最佳做法是什么?
我可能的解决方案:
在“attendees”表中使用“event_id”作为常规属性,以便所有三个事件都可以使用“attendees”。缺点是这只是一个伪外键。
为每个事件创建 3 个不同的“attendee”表,因此会有“birthday_attendee”、“meeting_attendee”和“dinner_attendee”表。缺点是表多。
使用像“event_attendee”这样的联结表是行不通的,因为这样的话这个表在将单个外键“event_id”链接到多个事件表时也会出现问题。
这些或其他解决方案中的哪一个最适合使数据库设计易于理解、可扩展和高性能?
顺便说一下,我打算使用 Django 后端对这些数据库表进行模型操作,如果这对答案有任何影响的话。
最佳答案
Postgres 为您提供了一个解决方案,即表继承。在 documentation 中有详细描述.
基本上,您可以有一个events
表,然后有三种不同类型的事件。您可以拥有对特定事件或父 events
表的外键引用。
例如,您可以有一个通用的 eventAttendees
表。这将有一个指向 events
的外键。但引用可以是任何特定事件类型。然后,特定事件类型将具有 event
中的公共(public)列(可能只有 eventId
),并且只有该特定类型的列。
关于SQL - 一对多与多个 "One"表的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49160392/