0

我正在製作一個系統,用戶可以在產品上進行投票或者停止投票,我需要能夠明確計算出產品的漲跌幅度,以及作爲最近一段時間的總分。產品投票系統的數據庫設計

每個投票都可以有選擇地對它發表評論,用戶需要能夠回顯/提升其他人的評論(有點像轉推),並且這也會根據父母添加/減去產品的總分投票被轉推。

這裏是我目前的建議表:

產品
ID,姓名,CATEGORY_ID

投票
ID,USER_ID,PRODUCT_ID,PARENT_ID,評論,評分,日期時間

用戶
ID,usernam e等

我想我可能需要一個評論表來有效地做到這一點?根據我在StackOverflow上讀到的一些建議,投票的得分字段爲1或-1,這將允許我收集該列的SUM()以計算總投票數,另一種可能性是具有單獨的vote_up和vote_down表......但我只是不確定。

回答

6

這取決於你想做什麼,這可能是一個非常複雜的問題,但這是我最簡單的方法(例如,我可以在離開工作前10分鐘把它扔在一起; -P)

我會嘗試StackOverflow/HotOrNot風格的方法,並將它們的排名存儲爲無符號整數。

PRODUCTS(
id, 
category_id, 
name, 
rating INTEGER UNSIGNED NOT NULL DEFAULT 0 
); 

然後在您的'VOTES'表中,您存儲投票(上/下)。我認爲你的'VOTES'表的表格看起來很好(儘管我會使用枚舉作爲SCORE數據類型,或者一些策略來確保投票不能通過XSS進行操作,例如,某人修改了投票表決權他們的投票是+10,000而不是+1,那麼這不會很酷)

對於一個小的有趣的應用程序,你可以通過增加或減少計數,當用戶點擊,但如果你正在做任何有擴展願望的東西,那麼你將通過一些每10-15分鐘運行一次的批處理進行投票計算和排序。

同樣在這個級別,您將開始使用算法來對投票值進行加權。例如,如果同一用戶每天不止一次(或每次)投票(向上或向下)同一產品,則第一次之後的投票不應計入計算產品的排名。

For Example, here is how Quora's Ranking Algorithm works

如果用戶是一個「超級用戶」或有較爲活躍,也許他們的票是不是一個新的用戶投票更重要的帳戶。我想在Yelp上,如果你沒有超過一兩個評論,你的評分和評論不會被計算出來,直到你滿足最少的評論數量。真的,天空的極限。

PS. I would also recommend checking out this o'Reilly book on some of the strategies for solving these kinds of problems

1

Beginning CakePHP對上意見落實工作表決(上/下)系統中的Ajax教程。幾年前我做過這個教程。我不確定它有多安全,或者它是否會成爲您項目的良好基礎,但可能值得查看一些想法。

1

如果您預計會有大量的用戶同時投票,你真的需要考慮性能....

天真的方法可能是這個樣子(我的道歉,如果我過於簡化你的榜樣,如果T- SQL是不是你的毒藥):

create table Products(
ProductId BIGINT IDENTITY(1,1) PRIMARY KEY CLUSTERED, 
Score  INT NOT NULL... 
ProductDetails... 

在那裏你會通過總結向上/向下表決表來進行產品的更新。壞!

如果你有大量的用戶投票,肯定會發生死鎖,通過不斷插入/更新/選擇對同一張表。

更好的方法是完全放棄Score列,只插入向上/向下投票表,並根據需要進行選擇。沒有理由不能計算代碼中的總和(即PHP,C#或其他),並且它避免了必須更新Products表(至少用於計算Score)。換句話說,將產品分數存儲在產品表上並不會爲您購買任何產品,而只是不必要的開銷。

我說的經驗,當我說更新「可以」在高容量系統中不好。與在末尾插入或選擇相比,更新是昂貴的(假設您的表格已正確編制索引),並且很容易在不知情的情況下在這種情況下取​​出大量鎖定。