OneToOneField
与ForeignKey
只是unique=True
。数据库级有什么区别,性能如何?
非常感谢。
答案 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
(带有索引)时,无论如何都应该执行索引查找,因为索引已更新。因此,在合理的数据库系统上,性能差异应该可以忽略不计。