2012-10-29 33 views
2

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

具体来说,我想知道从1-1中指定关系会得到什么好处,如果有的话。

非常感谢。

+0

我不使用Django - 因此我发现这个问题更加令人困惑 - 但它听起来像研究有关“NULL FOREIGN KEYS”(搜索条件)*的争论可能是一个好的起点。 – 2012-10-29 02:37:32

+0

可能的重复[有什么区别django OneToOneField和ForeignKey](http://stackoverflow.com/questions/5870537/whats-the-difference-between-django-onetoonefield-and-foreignkey) – danodonovan

回答

2

1-1的附加限制提供了一个更紧密和更丰富的概念模型,但也可以提供洞察力,可以提供更直观的检索。由于多对一表示父母/收藏关系,因此与检索特定实体的任何给定集合相关的成本不明确。由于1-1提供了一个平面映射,所以还有一个平坦的检索成本。这会导致喜欢在相关时更喜欢提取,因为连接将能够被轻松优化,并且结果数据集将是已知的大小。

+0

谢谢你马特。这非常有帮助。 – eikonomega

0

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

2

他们是不一样的;仔细想想:

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

+0

这并没有解释任何关于什么实际上正在进行。 1对1仍然是一个隐藏的权利(只是在一个地方或另一个地方限制更严格)。 –

+0

谢谢@ sampson-chen。我理解1-1关系与普通关键字相反的区别,但我对Django中的结果感兴趣。 – eikonomega

6

OneToOneField在'ForeignKey'之后在Django中演变而来。从概念上讲ForeignKeyunique=True约束类似于OneToOneField

所以,如果你想确保每张图片都有一个用户,反之亦然,请使用OneToOneField

如果你想要一个用户有任何数量的图片使用ForeignKey

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

MultiTableInheritance在内部隐式使用OneToOneField,您可以看到概念来自哪里。

+0

谢谢Pratik,这非常有帮助。我希望我可以将“正确答案”分给两个人。 – eikonomega

+0

不用担心。也许你可以放弃它,所以当其他人正在寻找相同的答案时,它会显得更高。 –

相关问题