最有效的方法来查询最近的浮点值?

时间:2017-02-20 23:49:54

标签: sql django postgresql django-orm

我有以下型号:

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中完全丢失),等等。然后我需要从DB查询以下PlatformVersion实例:

  • for 9.0 - > 9.0
  • for 9.0.0 - > 9.0
  • for 9.0.1 - > 9.0
  • for 9.0.999 - > 9.0
  • for 9.1.1 - > 9.1
  • for 10.0(10. *在DB中丢失) - >我的初始种子数据的最接近版本= 9.3。

我确信我可以自己编写这样的代码,但每秒会有大量的此类查询,所以我关心效率。

你能为性能提出最好的选择吗?

1 个答案:

答案 0 :(得分:0)

好的,我已经意识到将主要版本和次要版本存储为模型中的单独整数字段会更好,并按其值进行过滤。

顺便说一下,我认为存储像" x.x"等版本的做法也是非常糟糕的做法。在浮动场。如果需要单个字段存储,最好将版本存储在DecimalField中,因为浮点数和十进制表示不同。