假设我有一个名为Users的表,它代表一个网站的注册用户。我还有一个AccountActivation表,其中存储了发送到新用户的电子邮件的随机生成的字符串,以验证该电子邮件。
AccountActivation表有UserId列,它恰好也是Users表的主键。它还具有用于存储代码的ActivationCode列。任一列都可以唯一地标识AccountActivation表中的一行。
因此,如果我选择激活代码列作为主键,我最终会有两个具有不同主键的一对一的表。我想在一对一的关系中,两个表必须有相同的主键?
发布于 2012-06-23 19:31:23
如果您选择ActivationCode作为主键,那么为什么会有两个一对一的关系?
唯一的关系就是
AccountActivation.UserId -> Users.UserId或者你认为你突然拥有了什么?
如果go按照你的建议去做,那么表Users在UserId上有它的PK,表AccountActivation在ActivationCode上有它的PK -完全没有问题,而且没有理由不这样做。
您为AccountActivation的PK选择哪一列(UserId或ActivationCode)并不重要-这不会影响/干扰AccountActivation和User之间的FK关系,也不会添加任何类型的额外一对一关系.....
如果您确实选择ActivationCode作为AccountActivation的PK,那么我要采取的唯一额外步骤就是在UserId上创建一个非聚集索引,以便连接这两个表的查询将从最高性能中受益。
发布于 2012-06-23 19:31:49
如果只有一个ActivationCode,它们可以共享UserId。但这意味着当用户重新生成一个键时,您应该更新旧的行或删除它。
但是为什么你需要存储这些数据呢?您还可以将帐户激活码与来自User的唯一数据进行某种计算和加密。
只是为了说明我的建议:
Users table has two columns UserId CreationDate那么令牌可能是UserId + CreationDate (示例)。您将能够在没有数据库中额外数据的情况下生成和检查它。我知道这可能不适合您的要求。
发布于 2012-06-23 19:32:50
使AccountActivation中的UserId列成为Users表的外键。
Users
=====
UserId primary key
Name
Address
etc...
AccountActivation
=================
UserId primary key (foreign key to Users.UserId)
ActivationCode (unique constraint)现在你有了一对一的关系
https://stackoverflow.com/questions/11169086
复制相似问题