2017-02-20 141 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

您可以使用數組來存儲版本號。 –