2013-06-22 23 views
1

注意:我對django和數據庫都很陌生,所以請原諒我的無知。在Django中實現粘性線程

我想在django中實現一個論壇,並希望有粘性線程。我想的做的簡單的方式,這是定義線程模型是這樣的:

class Thread(models.Model): 
    title = models.CharField(max_length=max_title_length) 
    author = models.ForeignKey(Player, related_name="nonsticky_threads") 
    post_date = models.DateField() 
    parent = models.ForeignKey(Subsection, related_name="nonsticky_threads") 
    closed = models.BooleanField() 
    sticky = models.BooleanField() 

,然後拿到置頂貼,做這樣的事情:

sticky_threads = Thread.objects.all().filter(sticky=True) 

的問題是,至少在理論上這具有O(n)複雜性,這聽起來很糟糕。 (因爲粘性線程總是顯示在第一頁上,所以這個查詢將會相當頻繁地運行)。但是,我不知道數據庫/ django的聰明性會如何影響最終的性能,或者它是否仍然不好。

我現在的選擇是還可以創建不同的主題和Sticky_Thread類:

class Thread(models.Model): 
    title = models.CharField(max_length=max_title_length) 
    author = models.ForeignKey(Player, related_name="nonsticky_threads") 
    post_date = models.DateField() 
    parent = models.ForeignKey(Subsection, related_name="nonsticky_threads") 
    closed = models.BooleanField() 
class Sticky_Thread(models.Model): 
    title = models.CharField(max_length=max_title_length) 
    author = models.ForeignKey(Player, related_name="sticky_threads") 
    post_date = models.DateField() 
    parent = models.ForeignKey(Subsection, related_name="sticky_threads") 
    closed = models.BooleanField() 

讓我搶在O(1)時間的置頂貼不管是什麼。我不喜歡這種做法,現在如果我只想得到所有玩家的線程,我必須實現一個特殊的線程屬性是這樣的:

class Player(models.Model): 
    [snip] 

    @property 
    def threads(self): 
     return self.sticky_threads | self.nonsticky_threads 

而這種做法感到難看。

是否有明顯的最好的方式來實現這樣的東西?我只需要做計時,看看這種天真的方式是否可以接受? (我將這作爲一個學習練習來實現,所以我沒有真正的限制,這使得這項檢查有點困難)(如果是這樣,你會如何推薦我這麼做?(有點像時間bast的方式?)有沒有更好的選擇?

謝謝!

回答

3

你的這兩個行動的複雜性分析的路要走。這是完全不正確的過濾器操作爲O(n)和兩個獨立的類的O分類(1) - 我不知道你用什麼來作出區分,數據庫是高度優化的選擇個別標準:sticky列上的索引將使過濾器查詢幾乎完全一樣,查詢從單獨的表。

第一種方法是沒有問題正確的方式去這個,只要你確保你的sticky列索引。

+1

對不起,我認爲它必須掃描整個表並檢查所有n行的粘性字段,而第二個只是返回已知的粘性線程(需要0個步驟來找出哪些包括)。很明顯,我應該研究數據庫如何工作。絕對希望我已經採取了至少介紹。數據庫類畢業前......無論如何,謝謝澄清。 – marky1991