2012-06-23 30 views
0

比方说,我有一个名为Users的表格,它代表了网站的注册用户。我还有一个AccountActivation表,它将随机生成的字符串存储到新用户的电子邮件中,以验证该电子邮件。如果两个表具有“一对一”关系,它们是否应该与主键具有相同的列?

AccountActivation表具有UserId列,该列也恰好是Users表的主键。它还有ActivationCode列来存储代码。任一列都可以唯一标识AccountActivation表中的一行。

所以,如果我选择激活码列作为主键,我最终会得到两个具有不同主键的一对一表。我认为在一对一的关系中,这两个表必须有相同的主键?

+2

如果你选择'ActivationCode'作为PK,那么*为什么*你有两个*一对一的关系?唯一的关系就是'AccountActivation.UserId - > Users.UserId' - 或者你认为你突然有什么? 'Users'在'UserId'上有PK,'AccountActivation'在'ActivationCode'上有PK - 完全没有问题,没有理由不这样做。 –

+0

最有可能的是,“UserId”和“ActivationCode”都是AccountActivation表的候选键。 – wildplasser

+0

你怎么知道同一个随机生成的字符串不会生成一次以上,并且实际上是否需要你的应用程序执行此操作? –

回答

1

如果选择ActivationCode作为PK的话,为什么你有两个一到一个关系?

这是有

AccountActivation.UserId -> Users.UserId 

或者你觉得还有什么你突然有唯一的关系?

如果去做你的建议,那么该表Users拥有对PK和UserIdAccountActivation有它的ActivationCode PK - 不是在所有问题,而且也没有理由不去做这样。

的列(UserIdActivationCode),你挑选的AccountActivation的PK并不重要 - 这并不影响/打扰AccountActivationUser之间的关系FK,也不会增加额外的一比一的关系任何种类的.....

如果你选择ActivationCodeAccountActivation的PK,我拿到的唯一额外的步骤是在UserId创建一个非聚集索引,使得连接这两个表的查询将从中受益最大性能。

1

如果只有一个ActivationCode,他们可以共享UserId。但是这意味着当用户重新生成密钥时,您应该更新旧行或将其删除。

但是为什么你需要存储这样的数据?您还可以将帐户激活码与某种计算和加密功能合成为User中的唯一数据。

只是为了说明我的建议:

Users table has two columns UserId CreationDate 

那么令牌可能是UserId + CreationDate(例子)。您将能够生成并检查数据库中的额外数据。我知道这可能不符合你的要求。

1

使AccountActivation中的UserId列成为Users表的外键。

Users 
===== 

UserId primary key 
Name 
Address 
etc... 

AccountActivation 
================= 

UserId primary key (foreign key to Users.UserId) 
ActivationCode (unique constraint) 

现在你有一个一对一的关系

+0

或者在'AccountActivation'中''主键'可以在'ActivationCode'上并且'UserId'上的唯一约束。 –

+0

@MartinSmith - 只要UserId是唯一的,它将保持一对一的关系,否则它将变成一对多关系。 –

+0

这是什么回应?我没有建议不要让'UserId'独一无二。如果这是回应我对你删除的评论的回应,我指出'UserId,ActivationCode'上的聚集索引不起作用,因为你不能在部分密钥上强制实现唯一性。 –

1

你不必有相同的列2个表的主键有一个一对一的关系。
您可以在AccountActivation表中拥有任何列作为主键。

UserId这是AccountActivation表的外键是Users表中的主键。因此,无论它是否是该表的主键(但它应该是唯一的,我希望它),您应该能够使用此列唯一标识AccountActivation表中的用户激活码。

相关问题