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

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

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

非常感谢。

【问题讨论】:

标签: django django-models


【解决方案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,这很有帮助。我希望我可以将“正确答案”分给两个人。
    • 不用担心。也许你可以投票给它,这样当其他人在寻找相同的答案时它会显示得更高。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 2014-06-19
    相关资源
    最近更新 更多