有人可以解释将 Django 模型中的关系指定为一对一的重要性,而不仅仅是外键吗?
具体来说,我想知道将关系指定为 1-1(如果有)有什么好处。
非常感谢。
有人可以解释将 Django 模型中的关系指定为一对一的重要性,而不仅仅是外键吗?
具体来说,我想知道将关系指定为 1-1(如果有)有什么好处。
非常感谢。
OneToOneField
'ForeignKey' 之后在 Django 中的演变。从概念上讲,ForeignKey
带有unique=True
约束的 a 类似于OneToOneField
。
因此,如果您想确保每张图片都有一个用户,反之亦然,请使用OneToOneField
.
如果您希望一个用户拥有任意数量的图片,请使用ForeignKey
.
选择事物的方式也不同。在做的情况下OneToOneField
,可以做user.picture,直接获取图片。如果ForeignKey
您user.picture_set[0]
需要获取第一张图片或访问与该用户关联的所有图片。
MultiTableInheritance在内部隐式使用 OneToOneField,您可以看到这个概念的来源。
他们是不一样的; 想一想:
User
如果 a和 a之间存在一对一的关系Picture
,则表示用户只能拥有一张图片(并且一张图片只能拥有一个用户)。如果你有一个Picture
带有外键的User
,那么你是说一张图片必须只有一个用户,但一个用户可能有 0、1 或多张图片。
1-1 的附加约束提供了更紧密和更丰富的概念模型,但也可以提供可以进行更直观检索的洞察力。由于多对一表示父/集合关系,因此与检索特定实体的任何给定集合相关的成本不明确。由于 1-1 提供了一个平面映射,因此检索的成本也是一个平面。这将导致诸如在相关时更喜欢急切获取之类的事情,因为连接将能够轻松优化,并且生成的数据集将是已知大小。
Django 的外键是多对一的关系。现在,它们之间的区别与一对一和多对一关系之间的区别相同。例如,如果您有 User 和 Profile 实体。您想添加一个约束,即每个用户只能拥有一个配置文件。然后,使用 django 的一对一字段会对数据库级别产生限制,因此您将无法将用户与多个配置文件相关联,反之亦然。使用外键不会提供此约束。