首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果两个表具有“一对一”关系,它们是否应该具有与主键相同的列?

如果两个表具有“一对一”关系,它们是否应该具有与主键相同的列?
EN

Stack Overflow用户
提问于 2012-06-23 19:20:07
回答 4查看 2.2K关注 0票数 1

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

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

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-06-23 19:31:23

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

唯一的关系就是

代码语言:javascript
运行
复制
AccountActivation.UserId -> Users.UserId

或者你认为你突然拥有了什么?

如果go按照你的建议去做,那么表UsersUserId上有它的PK,表AccountActivationActivationCode上有它的PK -完全没有问题,而且没有理由不这样做。

您为AccountActivation的PK选择哪一列(UserIdActivationCode)并不重要-这不会影响/干扰AccountActivationUser之间的FK关系,也不会添加任何类型的额外一对一关系.....

如果您确实选择ActivationCode作为AccountActivation的PK,那么我要采取的唯一额外步骤就是在UserId上创建一个非聚集索引,以便连接这两个表的查询将从最高性能中受益。

票数 1
EN

Stack Overflow用户

发布于 2012-06-23 19:31:49

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

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

只是为了说明我的建议:

代码语言:javascript
运行
复制
Users table has two columns UserId CreationDate

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

票数 1
EN

Stack Overflow用户

发布于 2012-06-23 19:32:50

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

代码语言:javascript
运行
复制
Users
=====

UserId primary key
Name
Address
etc...

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

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

现在你有了一对一的关系

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11169086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档