2012-09-13 50 views
0

我正在寫網站評級書,我不知道如何實現登錄用戶的投票系統。用戶應該能夠對1-10的書籍進行評分,當然,系統應該記住他的投票,計算所有選票並計算平均費率。投票系統的Django模型

可以說我有以下模型:

class Book(models.Model): 
    title = models.CharField(max_length=30) 
    author = models.ForeignField(Author) 
    #... other fields 

class User(models.Model): 
    first_name = models.CharField(max_length=50) 
    last_name = models.CharField(max_length=30) 
    #... other fields 

現在,我可以添加率和rates_count領域的書,但我需要記住用戶投票。很顯然,我需要在圖書類多對多領域,我覺得這樣的事情應該罰款:

class Vote(models.Model): 
    user_who_voted = models.ForeignField(User) 
    rated_book = models.ForeignField(Book) 
    rate_date = models.DateField() 
    rate = models.ForeignField(User) 

class Book(models.Model): 
    title = models.CharField(max_length=30) 
    author = models.ForeignField(Author) 
    votes = models.ManyToManyField(through='Vote') 
    #... other fields 

我不知道如果我需要在圖書類率和rates_count。因爲我可以從Vote模型計算它們的值。這裏有幾個未知數:

有多快/慢數據庫引擎,比方說PostgreSQL,會計算所選書籍的平均費率,(增加和計算所有投票的投票數[平均費率=所有投票數/投票數]爲10000票,以及如何爲1000000票。手術時間是否持續增長?如果我的PC比服務器慢1000倍,是否需要進行計算也是線性的?

對不起,如果我的問題很愚蠢,但我沒有經驗的數據庫編程。謝謝你的回答。

+0

如何'votes_on_books'表'ID'(Django給你這個), 'book_id'作爲書的外鍵,'voter_id'作爲用戶的外鍵,以及'rating'?然後,當您呈現圖書的頁面時,您可以嘗試獲取記錄,其中book_id =當前圖書和user_id =當前ID;一擊就意味着他們已經投了票,你不應該用投票界面來渲染這個頁面。您還可以輕鬆查詢當前圖書的所有選票或當前用戶的所有選票,而無需在表格上添加任何其他選項。 – chucksmash

+0

謝謝@lamChuckB。我想這是最好的選擇。我的方法沒有'votes = models.ManyToManyField(through ='Vote')',但我認爲django使用這些信息來生成管理頁面(我不確定這一點),所以我會留在我的模型中。 – fenuks

回答

1

不是ORM和Django的專家,但大多數SQL數據庫的總數可以很快計算出來。如果您有數字字段的評級,數學會很容易和快速,並在一個最多兩個DB SQL調用中完成(您還需要計算記錄數)。檢查django ORM是否有總計(我相信它),否則(因爲我確信django orm也提供直接SQL),您可能需要制定自定義SQL查詢以計算費率。這樣的查詢將過濾所需的書籍ID。

擴大算法並不是微不足道的。我想你可能會拆分這個問題,一個關於模型和另一個關於性能,一旦你有一些模型(也許替代模型)

+1

謝謝。我對'相當快'的答覆感到滿意。我問及可擴展性,因爲我只是好奇,這對我來說不是生死攸關的問題。 – fenuks

+0

「相當快」是兩條路徑的結果,您可以通過獲取單個圖書的記錄集(包含多個記錄)來解決問題,然後計算循環中的評分(或使用ORMS函數爲你做同樣的事情)。 ORMs傾向於這種方法,而當你總共使用SQL你會得到一個結果的總和和處理將在SQL服務器端完成(通常比其他方法快得多) – ljgww