table 可以有两列作为主键吗

Can a table have two columns which could act as primary key

根据第三范式,我们需要避免对无键属性的依赖。

所以如果我有一个用户数据库

User(username varchar, full_name varchar, country varchar, SSN varchar, UID varchar)

对于每个用户,我都有他的用户名、全名、国家和社会安全号码(这是唯一的),以及另一个对每个用户来说都是唯一的号码。我想使用用户名作为 PRIMARY KEY,但是如果你知道一个人的社会安全号码,你也可以获得关于该用户的所有信息,因为它也是 'UNIQUE'.

不违反第三范式吗? 我可以将它拆分为两个或多个 table,例如从 User 中删除 SSN 并将其放在不同的 table

SSN(ssn varchar, username varchar)

但是现在我在这个table中遇到了同样的问题,因为两个键可以用作'PRIMARY KEY'。

还好吗?或者它是否违反了第三种形式,如果违反了,有什么巧妙的方法可以解决这个问题吗?

在数据库中,有多个可能都是唯一的列是很常见的。您已经清楚地阐明了这种情况。这些被称为候选主键

在这种情况下,这些列中的每一列都应显式声明为 uniquenot null。但是,只有一列可以作为主键。

总的来说,我赞成合成主键 -- 一个自动递增的数值。确切的语法因数据库而异,但大多数数据库都支持此类键。

您不应该将表分成两部分,因为在 'User' 模式中有三列(用户名、SSN、UID)是唯一可识别的,如果您将 'username' 作为主键,那么另外两列(SSN,UID)是备用主键,在用户模式中称为 'candidate key' 。 & 这不应该违反 3NF 。