Mat*_*kin 1 django database-design django-models database-schema
在问题7531153中,我询问了将Django模型拆分为两种的正确方法 - 使用Django的多表继承或显式定义OneToOneField.
根据Luke Sneeringer的评论,我很好奇是否将模型分成两部分可以获得性能提升.
我之所以考虑将模型分成两部分是因为我有一些字段总是会完成,而其他字段通常都是空的(直到项目关闭).
将典型的空字段(如actual_completion_date和actual_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)
Run Code Online (Sandbox Code Playgroud)
实际上,恰恰相反.任何时间的多个表都参与其中,SQL联接将被要求,这是固有地慢于一个数据库,以比简单的SELECT查询执行.字段为空的事实在性能方面无论如何都是毫无意义的.
根据表的大小和列数,只选择需要与之交互的字段子集可能会更快,但在Django中使用该only方法很容易:
Project.objects.only('project_number', 'budgeted_costs', 'submitted_on')
Run Code Online (Sandbox Code Playgroud)
产生的东西类似于:
SELECT ('project_number', 'budgeted_costs', 'submitted_on') FROM yourapp_project;
Run Code Online (Sandbox Code Playgroud)
使用单独的模型(和表)仅对模块化的目的有意义 - 这样您Project可以创建一个特定类型的项目,该项目需要其他字段但仍需要泛型的所有字段Project.
对于你的情况,如果有一些信息只有在它关闭时才可用,我确实建议制作一个单独的模型.
加入并不错.特别是在你的情况下,如果你在一个表中有所有行而在另一个表中有更少的行,则连接会更快.我经常使用数据库,在大多数情况下,这是一个纯粹的猜测,可以判断一个连接是好还是坏.在许多情况下,即使是全表扫描也比使用索引更好.你需要查看EXPLAINs,如果性能是一个问题,并在可能的情况下描述Db工作(我知道Oracle支持这一点.)但在性能成为一个问题之前,我更喜欢更快的开发.
我们在Django中有一个5M行的表.我们需要一个仅对1K行不为null的列.只需改变桌子就可能需要半天时间.从头开始重建也需要几个小时.我们选择制作一个单独的模型.
我参加过关于领域驱动设计的讲座,其中作者解释说,重要的是,特别是在开发新应用程序时,要分离模型,而不是将所有内容都放在一个类中.
假设你有一个CargoAircraft级和PassengerAircraft.将它们放在一个班级并"无缝地"工作是如此诱人,不是吗?但与他们的互动(安排,预订,重量或容量计算)是完全不同的.
因此,通过将所有内容放在一个类中,您可以强制自己在每个方法中使用一堆IF子句,在Manager中使用额外的方法,更难以调试,在DB中使用更大的表.基本上你为了什么而花费更多时间开发自己?仅限两件事:1)较少的连接2)较少的类名.
如果你将类分开,事情会变得容易:
因此,更快的发展.
| 归档时间: |
|
| 查看次数: |
1252 次 |
| 最近记录: |