拥有一个包含外键的复合主键是不是一个坏主意?
Is it a bad idea to have a composite primary key that contains a foreign key?
我正在设计一个数据库,有下面两个表:
t_model
(字段:model_id
(PK),model_name
)
t_model_version
(字段:model_id
(PK,FK),model_version
(PK),start_validity_date
,end_validity_date
)
可以看出,t_model_version
它的PK是复合PK。 PK的字段部分之一也是FK(t_model
的PK)。我想知道这是好事还是坏事?我想避免以后遇到我无法预见的困难...
t_model
持有不同的模型(例如不同的 models/functional 形式来预测宏观经济增长)。 t_model_version
保存每个模型的版本号(例如,不同版本的模型意味着保留函数形式但系数估计已更新)。
编辑:我的问题不是关于如何在感兴趣的领域已经是复合PK的一部分时添加FK,但这是否是一个好习惯。因此,我的问题不是 Composite Primary Key + Foreign Key 的重复。
只要在你找到它们的地方声明它们,这样 DBMS 就可以强制执行它们——除非其他声明已经暗示——除非你必须声明一个 PRIMARY KEY
或 UNIQUE NOT NULL
列列表,它被引用一个 FOREIGN KEY
.
当列不能为 NULL 时声明 NOT NULL
。当子行值唯一且不为空时声明 PRIMARY KEY
或 UNIQUE NOT NULL
(并且不包含较小的此类子行,这意味着)。声明剩余的 UNIQUE
子行(不包含较小的子行,这意味着)。当子行值必须作为 PRIMARY KEY
或 UNIQUE NOT NULL
值出现在别处时声明 FOREIGN KEY
(并且 FOREIGN KEY
的链还没有这样说)。然后,如有必要,声明由 FOREIGN KEY
s.
引用的剩余子行
PS 担心你学到的每一种概念组合是没有用的。阅读有关信息建模和关系数据库的信息以学习良好的设计。
这很好——很常见,即使你使用的是自然键。如果您使用代理键,则没有必要。
最大的问题是,如果 FK 字段在您的数据中也可能为空,因为它可能会导致唯一性问题。但是,鉴于您的字段结构,我发现您在任何情况下都不太可能在该字段中允许空值。
我正在设计一个数据库,有下面两个表:
t_model
(字段:model_id
(PK),model_name
)t_model_version
(字段:model_id
(PK,FK),model_version
(PK),start_validity_date
,end_validity_date
)
可以看出,t_model_version
它的PK是复合PK。 PK的字段部分之一也是FK(t_model
的PK)。我想知道这是好事还是坏事?我想避免以后遇到我无法预见的困难...
t_model
持有不同的模型(例如不同的 models/functional 形式来预测宏观经济增长)。 t_model_version
保存每个模型的版本号(例如,不同版本的模型意味着保留函数形式但系数估计已更新)。
编辑:我的问题不是关于如何在感兴趣的领域已经是复合PK的一部分时添加FK,但这是否是一个好习惯。因此,我的问题不是 Composite Primary Key + Foreign Key 的重复。
只要在你找到它们的地方声明它们,这样 DBMS 就可以强制执行它们——除非其他声明已经暗示——除非你必须声明一个 PRIMARY KEY
或 UNIQUE NOT NULL
列列表,它被引用一个 FOREIGN KEY
.
当列不能为 NULL 时声明 NOT NULL
。当子行值唯一且不为空时声明 PRIMARY KEY
或 UNIQUE NOT NULL
(并且不包含较小的此类子行,这意味着)。声明剩余的 UNIQUE
子行(不包含较小的子行,这意味着)。当子行值必须作为 PRIMARY KEY
或 UNIQUE NOT NULL
值出现在别处时声明 FOREIGN KEY
(并且 FOREIGN KEY
的链还没有这样说)。然后,如有必要,声明由 FOREIGN KEY
s.
PS 担心你学到的每一种概念组合是没有用的。阅读有关信息建模和关系数据库的信息以学习良好的设计。
这很好——很常见,即使你使用的是自然键。如果您使用代理键,则没有必要。
最大的问题是,如果 FK 字段在您的数据中也可能为空,因为它可能会导致唯一性问题。但是,鉴于您的字段结构,我发现您在任何情况下都不太可能在该字段中允许空值。