2012-07-15 74 views
1

我正在構建簡單的Web應用程序,用戶可以投票。 什麼是檢查用戶是否已投票的最快方式。我感興趣的是兩個關係數據庫和基於文檔的數據庫(MongoDB的,...)獨特的投票,禁用revote

我有一些想法,但我相信他們可以改進:

關係數據庫

創建表決單獨的表:

|userid|articleid| 

之前遞增文章投票檢查是否有既包括用戶名和條款ArticleID一行。我們有兩個疑問。有可能通過觸發器來改善這種情況嗎?例如:

|useridarticleid| unique column 

投票之前在應用程序端生成useridarticleid。嘗試插入useridarticleid。如果字段是新的,觸發器將觸發,它將增加文章中的投票欄。

基於文檔

這是更棘手一點。因此,有文檔結構類似這樣:

{ 
    "id": "123", 
    "content": "something", 
    "num_votes": 2, 
    "votes" : [ 
       "userid1", 
       "userid2" 
      ] 
} 

第一「查詢」 - 檢查,如果用戶ID是在投票數組。第二個「查詢」 - 如果不是,則增加num_votes。

再次兩個查詢。所以我認爲我們可以改變這一點,但我不知道它是否會提高性能:

插入投票數組中的userid。當用戶想檢查文章「計數」數組中的投票。但是我認爲這可能會降低性能,因爲如果流量很高,那麼每篇文章都有點浪費。在這裏想象一下Reddit。

回答

1

實際上,它在文檔數據庫中要簡單得多。您的文檔結構非常適合。

{ 
    "id": "123", 
    "content": "something", 
    "num_votes": 2, 
    "votes" : [ 
       "userid1", 
       "userid2" 
      ] 
} 

db.collection.update(
     {id:"123", votes:{$ne:"userid"}}, 
     {$push:{"votes":"userid"},$inc:{"num_votes":1}} 
); 

這將原子更新記錄id = 123個將用戶ID選民和選票增加的列表中,如果用戶ID是不是已經在投票的本文件的列表中。

所以只有一個查詢和一個更新 - 它們實際上是相同的操作。

+0

我不認爲你需要關係數據庫案例的觸發器 - 只需在userid,articleid表上添加一個唯一約束,並且任何重複的插入操作都會失敗。 – 2012-07-15 19:53:51

+0

它的悲傷我不能標記兩個答案。感謝你! – ewooycom 2012-07-15 20:50:08

1

在關係數據庫中| userid | articleid |將是最好的方法,將這兩個字段用作主鍵。

在第二個中,您還可以考慮將投票置於用戶文檔或文章文檔中。

無論如何,我建議你真的專注於創建一個設計,在那裏改變所有這些決定很容易。

不同的設計方式,比如「同時在同一篇文章中有很多用戶」或者「在不同文章中的很多用戶」等等......直到你看到真正的用法,您將沒有足夠的信息來決定哪種方法最好,最快速地工作...因此,創建一些可以輕鬆適應您稍後學習的任何信息。

順便說一句:你也可以考慮不要同時計票。我記得有一篇文章(我無法找到)在哪裏提到你管票數字實際上並不「準確」......他們對當前投票進行估計,並在後臺工作者線程中計算實際數字。

+0

在文檔模型中,當您將選舉器插入數組時,遞增投票可以保證兩者不會失去同步。如果投票計數與選民分開存儲,那麼要有絕對準確的計數,您需要一份工作來定期檢查計數。 – 2012-07-15 19:51:35