1

假设我有一个名为的表Users,它代表网站的注册用户。我还有一个AccountActivation表,它存储发送到新用户电子邮件以验证该电子邮件的随机生成的字符串。

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

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

4

4 回答 4

1

如果选择ActivationCode作为PK,那为什么会有两个一对一的关系呢?

唯一的关系是

AccountActivation.UserId -> Users.UserId

或者你认为你突然还有什么?

如果按照您的建议去做,那么桌子Users的 PK 开启UserId,桌子AccountActivation的 PK 开启ActivationCode- 根本不是问题,没有理由不这样做。

您为 PK 选择哪一列(UserId或)无关紧要 - 这不会影响 / 干扰 and 之间的 FK 关系,也不会添加任何类型的额外一对一关系......ActivationCodeAccountActivationAccountActivationUser

如果您确实选择ActivationCodePK AccountActivation,我将采取的唯一额外步骤是创建一个非聚集索引,UserId以便连接两个表的查询将受益于最大性能。

于 2012-06-23T11:31:22.943 回答
1

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

但是为什么你需要存储这些数据呢?您还可以将帐户激活码与某种计算和加密与来自User.

只是为了说明我的建议:

Users table has two columns UserId CreationDate

那么令牌可能是UserId + CreationDate(示例)。您将能够在数据库中没有额外数据的情况下生成和检查它。我知道这可能不符合您的要求。

于 2012-06-23T11:31:48.583 回答
1

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

Users
=====

UserId primary key
Name
Address
etc...

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

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

现在你有了一对一的关系

于 2012-06-23T11:32:49.610 回答
1

您不需要与 2 个表中的主键具有相同的列以具有一对一的关系。
您可以将任何列作为AccountActivation表中的主键。

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

于 2012-06-25T16:52:43.480 回答