【发布时间】:2017-07-10 10:06:57
【问题描述】:
我有以下型号:
class PlatformVersion(models.Model):
platform = models.ForeignKey(Platform)
version = models.FloatField(db_index=True)
display_version = models.CharField(max_length=32, db_index=True)
is_enabled = models.BooleanField(default=False)
初始数据库种子代码:
def add_version(self, platform, version, display_version):
try:
return PlatformVersion.objects.get(platform=platform, version=version)
except PlatformVersion.DoesNotExist:
return PlatformVersion.objects.create(platform=platform, version=version, display_version=display_version,
is_enabled=True)
self.add_version(platform, 9.0, '9.0')
self.add_version(platform, 9.1, '9.1')
self.add_version(platform, 9.2, '9.2')
self.add_version(platform, 9.3, '9.3')
如您所见,我只添加了次要版本,跳过了 9.0.1、9.0.2 等版本。
我有以下用例:客户端发送带有平台版本的请求,例如,9.0、9.0.0 或 9.0.1 或 10.0(数据库中根本没有)等。我需要然后从 DB 中查询以下 PlatformVersion 实例:
- 适用于 9.0 -> 9.0
- 对于 9.0.0 -> 9.0
- 对于 9.0.1 -> 9.0
- 对于 9.0.999 -> 9.0
- 对于 9.1.1 -> 9.1
- 对于 10.0(DB 中缺少 10.*)-> 对于我的初始种子数据,最接近的版本 = 9.3。
这样的代码我肯定自己可以写出来,但是每秒这样的查询量会非常大,所以我关心的是效率。
您能否建议性能的最佳选择?
【问题讨论】:
-
我一开始根本不使用浮点数。版本“数字”并不是真正的偶数,更不用说浮点值了。整数数组会更好地工作,并且至少在 PostgreSQL 中可以正确比较。
标签: sql django postgresql django-orm