一对一和外键关系之间的差异?

时间:2012-10-29 02:32:06

标签: django django-models

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

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

非常感谢。

4 个答案:

答案 0 :(得分:6)

在'ForeignKey'之后,OneToOneField在Django中进化。从概念上讲,具有ForeignKey约束的unique=TrueOneToOneField类似。

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

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

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

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

答案 1 :(得分:2)

他们不一样;想一想:

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

答案 2 :(得分:2)

1-1的附加约束提供了更严格和更丰富的概念模型,但也可以提供可以更直观检索的洞察力。由于多对一表示父/集合关系,因此与特定实体的任何给定集合的检索相关联的成本不明确。由于1-1提供平面映射,因此检索成本也很高。这会导致在相关时更喜欢急切的提取,因为连接将能够轻松优化,结果数据集将是已知的大小。

答案 3 :(得分:0)

Django的外键是多对一的关系。现在,它们之间的差异与“一对一”和“多对一”关系之间的差异相同。例如,如果您有用户和配置文件实体。您希望添加一个约束,每个用户可以只有一个配置文件。然后,使用django的一对一字段会对数据库级别创建限制,因此您将无法将用户与多个配置文件相关联,反之亦然。使用外键的情况不会提供此约束。