一对一和外键关系之间的区别?

Posted

技术标签:

【中文标题】一对一和外键关系之间的区别?【英文标题】:Differences between one-to-one and foreign key relationships? 【发布时间】:2012-10-18 09:19:24 【问题描述】:

有人能解释一下在 Django 模型中将关系指定为一对一而不是外键的重要性吗?

具体来说,我想知道将关系指定为 1-1(如果有的话)有什么好处。

非常感谢。

【问题讨论】:

我不使用 Django - 因此我发现这个问题更加令人困惑 - 但这听起来像是在研究关于“NULL FOREIGN KEYS”(搜索词)的辩论可能是一个很好的起点.. What's the difference between django OneToOneField and ForeignKey?的可能重复 【参考方案1】:

Django 的外键是多对一的关系。现在,它们之间的区别与一对一和多对一关系之间的区别相同。例如,如果您有 User 和 Profile 实体。您想添加一个约束,即每个用户可以拥有一个且只有一个配置文件。然后,使用 django 的一对一字段会对数据库级别产生限制,因此您将无法将用户与多个配置文件相关联,反之亦然。使用外键不会提供此约束。

【讨论】:

【参考方案2】:

它们不一样;想一想:

如果UserPicture 之间存在一对一的关系,则表示用户只能拥有一张图片(而一张图片只能拥有一个用户)。如果你有一个带有User 外键的Picture,那么你是说一张图片必须只有一个用户,但一个用户可能有0、1 或多张图片。

【讨论】:

这并没有解释任何关于实际发生的事情。 1 对 1 仍然是引擎盖下的 fkey(只是在一个地方或另一个地方有更严格的约束)。 谢谢@sampson-chen。我了解 1-1 关系与通用键的区别,但我对 Django 中的表现感兴趣。【参考方案3】:

1-1 的附加约束提供了更紧密和更丰富的概念模型,但也可以提供洞察力,从而实现更直观的检索。由于多对一表示父/集合关系,因此与检索特定实体的任何给定集合相关的成本不明确。由于 1-1 提供了一个平面映射,因此检索的成本也是一个平面。这将导致诸如在相关时更喜欢急切获取之类的事情,因为连接将能够轻松优化,并且生成的数据集将是已知的大小。

【讨论】:

谢谢马特。这很有帮助。【参考方案4】:

OneToOneField 在 'ForeignKey' 之后在 Django 中演变。从概念上讲,带有unique=True 约束的ForeignKey 类似于OneToOneField

因此,如果您想确保每张图片都有一个用户,反之亦然,请使用OneToOneField

如果您希望一个用户拥有任意数量的图片,请使用ForeignKey

选择事物的方式也不同。如果做OneToOneField,可以做user.picture,直接获取图片。如果是ForeignKey,您将执行user.picture_set[0] 以获取第一张图片或访问与该用户关联的所有图片。

MultiTableInheritance 在内部隐式使用 OneToOneField,您可以看到这个概念的来源。

【讨论】:

谢谢你,Pratik,这很有帮助。我希望我可以将“正确答案”分给两个人。 不用担心。也许你可以投票给它,这样当其他人在寻找相同的答案时它会显示得更高。

以上是关于一对一和外键关系之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章

在自定义主键和外键中定义 Laravel 关系

数据库

hibernate学习四 hibernate关联关系映射

MySQL 基础

数据库关系 - 一对一也有一对多

hibernate------映射相关