【发布时间】:2021-09-17 15:54:34
【问题描述】:
我正在考虑将表架构从单个主键更改为复合主键。
此更改将影响我的许多表以及为查询此类表而编写的 SQL 语句(尤其是联接查询)。
在对复合键方法的好处进行了一些研究后,我发现一个主要卖点是它用于强制复合列的唯一性。
但是,我仍然可以保留单个主键表,然后添加唯一约束以强制复合列的唯一性,如下所示:
create table ... (
id primary key not null,
column1 ...
column2 ...
.
.
columnN ...
unique(column1, column2) // added this line to my existing tables
)
现在回答问题:
这两种方法有什么好处?
显式定义复合主键或在复合列上使用具有唯一约束的单个主键。为什么?
【问题讨论】:
-
id字段是否有意义?换句话说,它只是提供唯一整数的自动增量的某种变体,还是具有更高层次的含义?为什么你觉得需要做出改变?有没有一个PK没有提供的东西? -
尽量使您的 PK 尽可能简单 - 因此,如果单列就足够了 - 始终倾向于使用此方法而不是复合 PK。它使从其他表加入变得更加容易!
-
先想想应该怎么做。哪些列唯一标识您的行? ID 还是 ID+column1+column2?此外,PK(id)+UC(c1, c2) 与 PK(id, c1, c2) 不同。有关更理论的观点,请查看此。我认为示例部分非常有趣:en.wikipedia.org/wiki/Database_normalization
-
请将回复作为更新添加到您的问题中,这样其他人就不必搜索 cmets。你在我的评论中看到我的其他问题了吗?它们是您在第一次阅读时可能没有看到的事后想法。
-
我认为,如果你想成为唯一的 2 列,请创建一个唯一索引(约束)。这是最好的解决方案。如果您进行复合 PK,则必须更改整个数据库中的连接,并重写/重新创建 FK 列!并重复列。
标签: sql database postgresql database-schema