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