【问题标题】:Most efficient way to query by nearest float value?通过最近的浮点值查询的最有效方法?
【发布时间】: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


【解决方案1】:

好的,我意识到最好将主要版本和次要版本作为单独的整数字段存储在我的模型中,并按它们的值进行过滤。

顺便说一句,我认为在浮点字段中存储“x.x”之类的版本也是一种非常糟糕的做法。如果需要单字段存储,最好将版本存储在 DecimalField 中,因为浮点数和十进制表示不同。

【讨论】:

  • 可以使用数组存储版本号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 2012-08-18
  • 2011-01-26
  • 1970-01-01
  • 2019-03-07
相关资源
最近更新 更多