拥有包含外键的复合主键是一个坏主意吗?

时间:2017-07-12 14:00:57

标签: database foreign-keys primary-key composite-primary-key

我正在设计一个数据库,并有以下两个表:

  • t_model(包含字段:model_id(PK),model_name
  • t_model_version(包含字段:model_id(PK,FK),model_version(PK),start_validity_dateend_validity_date

可以看出,t_model_version它的PK是复合PK。 PK的一部分字段也是FK(t_model的PK)。我想知道这是好事还是坏事?我想避免以后遇到困难,我还不能预见......

t_model拥有不同的模型(例如,不同的模型/函数形式来预测宏观经济增长)。 t_model_version保存每个模型的版本号(例如,模型的不同版本意味着保留了函数形式,但系数估计已更新)。

编辑:当感兴趣的字段已经是复合PK的一部分时,我的问题不是关于如何添加FK,而是这是一个好的做法。因此,我的问题不是Composite Primary Key + Foreign Key的重复。

3 个答案:

答案 0 :(得分:1)

只需在找到它们的位置声明它们,以便DBMS可以强制执行它们 - 除非已经被其他声明暗示 - 除非您必须声明PRIMARY KEYUNIQUE NOT NULL列列表由{引用{1}}。

当列不能为NULL时,声明FOREIGN KEY。当子行值唯一且不为空时(并且不包含较小的此类子行,这将暗示),声明NOT NULLPRIMARY KEY。声明剩余的UNIQUE NOT NULL子行(不包含较小的子行,这意味着它)。当子行值必须显示在UNIQUEFOREIGN KEY值的其他位置时,我们会声明PRIMARY KEY(并且UNIQUE NOT NULL的链并不是这样说的)。然后,如有必要,声明FOREIGN KEY s引用的剩余子目录。

PS有没有必要担心你学到的每一个概念组合。阅读有关信息建模和关系数据库的知识,以了解良好的设计。

答案 1 :(得分:1)

最大的问题是,如果FK字段在数据中也可能为空,因为它可能会导致唯一性问题。但是,根据您的字段结构,我发现在任何情况下都不可能允许该字段中的空值。

答案 2 :(得分:0)

如果您使用自然键,那很好 - 甚至是常见的。如果您使用代理键,则没有必要。