admin

复合主键

sql

我正在设计一个数据库,该数据库将用于存储来自许多不同来源的数据。我存储的实例由原始来源分配了唯一的ID。我存储的每个实例都应包含有关其来源的信息,以及与此来源相关联的ID。

作为示例,请考虑说明该问题的下表:

----------------------------------------------------------------
| source_id | id_on_source | data                              |
----------------------------------------------------------------
| 1         | 17600        | ...                               |
| 1         | 17601        | ...                               |
| 2         | 1            | ...                               |
| 3         | 1            | ...                               |
----------------------------------------------------------------

请注意,尽管id_on_source每个来源的唯一,但有可能在id_on_source不同来源中找到相同的来源。

我对关系数据库有一个不错的了解,但是与专家甚至是经验丰富的用户都相去甚远。我在此设计中面临的问题是应该用作主键。数据似乎决定使用的复合主键(source_id, id_on_source)。经过一番谷歌搜索之后,我发现了一些关于复合主键优缺点的激烈争论,这让我有些困惑。

该表将与其他表具有一对多关系,因此将在其他表的外键中引用。

我并不局限于某个特定对象RDBMS,也不确定出于争论的目的它是否重要,但是可以说我更喜欢SQLite和and一起工作MySQL

在这种情况下使用复合外键有什么优缺点?你更喜欢哪个?


阅读 180

收藏
2021-05-10

共1个答案

admin

我个人觉得复合主键很痛苦。对于希望加入“源”表的每个表,都需要同时添加source_id和id_on_source字段。

我将在您的源表上创建一个标准的自动递增主键,并在source_id和id_on_source列上添加唯一索引。

然后,这允许您仅将源表的ID添加为其他表上的外键。

通常,我还发现许多框架和工具产品中对复合主键的支持充其量只是“修补”而在其他框架中则不存在。

2021-05-10