我正在设计一个数据库,该数据库将用于存储来自许多不同来源的数据。我存储的实例由原始来源分配了唯一的ID。我存储的每个实例都应包含有关其来源的信息,以及与此来源相关联的ID。
作为示例,请考虑说明该问题的下表:
---------------------------------------------------------------- | source_id | id_on_source | data | ---------------------------------------------------------------- | 1 | 17600 | ... | | 1 | 17601 | ... | | 2 | 1 | ... | | 3 | 1 | ... | ----------------------------------------------------------------
请注意,尽管id_on_source每个来源的唯一,但有可能在id_on_source不同来源中找到相同的来源。
id_on_source
我对关系数据库有一个不错的了解,但是与专家甚至是经验丰富的用户都相去甚远。我在此设计中面临的问题是应该用作主键。数据似乎决定使用的复合主键(source_id, id_on_source)。经过一番谷歌搜索之后,我发现了一些关于复合主键优缺点的激烈争论,这让我有些困惑。
(source_id, id_on_source)
该表将与其他表具有一对多关系,因此将在其他表的外键中引用。
我并不局限于某个特定对象RDBMS,也不确定出于争论的目的它是否重要,但是可以说我更喜欢SQLite和and一起工作MySQL。
RDBMS
SQLite
MySQL
在这种情况下使用复合外键有什么优缺点?你更喜欢哪个?
我个人觉得复合主键很痛苦。对于希望加入“源”表的每个表,都需要同时添加source_id和id_on_source字段。
我将在您的源表上创建一个标准的自动递增主键,并在source_id和id_on_source列上添加唯一索引。
然后,这允许您仅将源表的ID添加为其他表上的外键。
通常,我还发现许多框架和工具产品中对复合主键的支持充其量只是“修补”而在其他框架中则不存在。