Django一对一和外键关系在数据库级别上的区别?

时间:2018-08-01 09:27:15

标签: django database

OneToOneFieldForeignKey只是unique=True。数据库级有什么区别,性能如何?

非常感谢。

1 个答案:

答案 0 :(得分:2)

如果我们查看source code of the OneToOneField,我们会看到:

class OneToOneField(ForeignKey):

    # ...

    def __init__(self, to, on_delete, to_field=None, **kwargs):
        kwargs['unique'] = True
        super().__init__(to, on_delete, to_field=to_field, **kwargs)

它包含一些额外的属性,以使Django理解OneToOneField reverse 不是 唯一的字段,但是它可以因此直接查询对象。

因此,我们将构造一个UNIQUE(foreign_column)(根据数据库语言的不同,语法可能会有所不同)。

对于大多数流行的数据库引擎,默认情况下在ForeignKey的数据库级别上,数据库构造一个 index ,以提高反向查找的性能。因此,如果您创建新行或更新现有行,数据库将检查索引包含该值(因此可以保证唯一性)。

因此,这将进行更新并创建额外的查询结果。但是,当我们使用ForeignKey(带有索引)时,无论如何都应该执行索引查找,因为索引已更新。因此,在合理的数据库系统上,性能差异应该可以忽略不计。