用许多主键规范化表的惯例是什么

时间:2019-03-12 22:09:54

标签: sql database-design mariadb composite-primary-key unique-key

我有一个像这样的数据库表:

col1 PRI
col2 PRI
col3 PRI
col4 PRI
col5 PRI
col6 
col7
col8

因此,看起来从1到5的所有列都必须是唯一的,并且仅将这些键设为主键就显得“很有意义”。这是正确的设计方式吗?还是我们应该添加一个在5列上具有唯一约束的自动生成的新列?我们将使用这些列的子集(col1-col3)或全部5列进行查询

2 个答案:

答案 0 :(得分:1)

这很好;我认为不需要“已生成”列:

PRIMARY KEY(a,b,c,d,e)

如果您有这个,它将可以有效地工作:

WHERE b=22 AND c=333 AND a=4444  -- in any order

大多数其他组合的效率较低。

(请使用真实的列名,以便我们可以更详细地讨论。)

答案 1 :(得分:0)

如果将列设置为UNIQUE,将失败,因为col1在2个不同的行上不能相等。

但是,如果将列设置为PRIMARY KEY而不是UNIQUE,则数据库将假定所有主键的组合必须为'UNIQUE'值,因此在任何位置都找不到col1 + col2 + col3 + col4 + col5另一排。

希望有帮助。

编辑

这里有个例子:

create table example (
col1    bigint  not null unique,
col2    bigint  not null,
primary key (col1,col2));

insert into example values(1,1);  ==> Success
insert into example values(1,2);  ==> Failure - col1 is unique and '1' was used
insert into example values(2,1);  ==> Success - '2' was never used on col1
insert into example values(2,7);  ==> Failure - '2' was already used on col1

但是,如果您改用:

create table example (
col1    bigint  not null,
col2    bigint  not null,
primary key (col1,col2));

insert into example values(1,1);  ==> Success
insert into example values(1,2);  ==> Success
insert into example values(2,1);  ==> Success
insert into example values(1,2);  ==> Failure - '1','2' combination was used