django - 将 Django 模型/表拆分为两个模型/表是否有性能优势?

标签 django database-design django-models database-schema

SO question 7531153 ,我询问了将 Django 模型一分为二的正确方法——使用 Django 的多表继承或显式定义 OneToOneField。

基于 Luke Sneeringer's评论,我很好奇将模型一分为二是否会提高性能。

我考虑将模型一分为二的原因是因为我有一些字段将始终完成,而其他字段通常为空(直到项目关闭)。

将通常为空的字段(例如 actual_completion_dateactual_project_costs)放入 Django 中的单独模型/表中是否可以提高性能?

分成两个模型

class Project(models.Model):
    project_number = models.SlugField(max_length=5, blank=False,
            primary_key=True)
    budgeted_costs = models.DecimalField(max_digits=10, decimal_places=2)
    submitted_on = models.DateField(auto_now_add=True)

class ProjectExtendedInformation(models.Model):
    project = models.OneToOneField(CapExProject, primary_key=True)
    actual_completion_date = models.DateField(blank=True, null=True)
    actual_project_costs = models.DecimalField(max_digits=10, decimal_places=2,
            blank=True, null=True)

最佳答案

实际上,恰恰相反。任何时候涉及多个表,都需要 SQL JOIN,这对于数据库来说执行起来比简单的 SELECT 查询慢。就性能而言,字段为空这一事实在某种程度上是没有意义的。

根据表的大小和列数,只选择您需要与之交互的字段子集可能会更快,但在 Django 中使用 only 这很容易方法:

Project.objects.only('project_number', 'budgeted_costs', 'submitted_on')

产生类似于:

SELECT ('project_number', 'budgeted_costs', 'submitted_on') FROM yourapp_project;

使用单独的模型(和表)只对模块化的目的有意义——这样你子类化 Project 来创建一个特定类型的项目,它需要额外的字段,但仍然需要所有的字段一个通用的项目

关于django - 将 Django 模型/表拆分为两个模型/表是否有性能优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7760841/

相关文章:

django - 如何在维护外键和多对多关系的同时将 Django PostgreSQL 数据库模型的主键还原为 AutoField

mysql - 导师、学生、类(class)数据库设计

php - 关于后端的架构决策

database - Django 中的syncdb 和更新数据库模式

python - 呈现 : Decimal ('51.8' ) is not JSON serializable 时捕获类型错误

Django prefetch_related 与反向外键查找

MongoDB数据库架构

mysql - Django 1.8 中的复杂注释

python - 在 django 中单击管理员的选择字段后如何隐藏或显示模型字段

python - 如何在 ModelForm 中使用 forms.ChoiceField()?