2017-02-20 67 views
0

我有以下型号:通过最近的浮点值查询最有效的方法?

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) 

初始DB播种代码:

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(10. *缺少数据库) - >最接近的版本= 9.3为我的初始种子数据。

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

你可以建议性能最好的选择吗?

+2

我开始的时候根本就不使用浮点数。版本“数字”实际上不是偶数,更不用说浮点值。整数数组可以更好地工作,至少在PostgreSQL中,可以正确比较。 –

回答

0

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

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

+0

您可以使用数组来存储版本号。 –