SQL - 一对多与多个 "One"表的最佳实践

标签 sql postgresql database-design django-models

我的场景很难用一个简短的标题来解释,所以这里有一个例子:

我有多个表“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/

相关文章:

php - 检查有效的 SQL 列名

sql - 在 SQL 中存储圣经的最佳方式是什么?

Mysql 表结构运行速度快吗?

sql - Go 应用程序在 FLOATS 上使用 GROUP_CONCAT 进行 SQL 查询返回 []uint8 而不是实际的 []float64

mysql - 如何将 Maximum 用于 SELECT 语句

sql - 添加新列 SQL 查询

postgresql - 使一个值首先出现在下拉其他值之后

python - 如何在sql中存储树结构?

sql - 如何使用连接查询两个表并从一个表中获取所有行,并从另一个中获取相关行?

php - 查询具有多个值的多个元键的 Wordpress 帖子