一对一和外键关系之间的区别?
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】:它们不一样;想一想:
如果User
和Picture
之间存在一对一的关系,则表示用户只能拥有一张图片(而一张图片只能拥有一个用户)。如果你有一个带有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,这很有帮助。我希望我可以将“正确答案”分给两个人。 不用担心。也许你可以投票给它,这样当其他人在寻找相同的答案时它会显示得更高。以上是关于一对一和外键关系之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章