2013-03-11 111 views
0

我bulding應用程序的投票能力(+ 1/-1),並試圖爲此具有簡單快速的mysql表結構。到目前爲止,我的想法很簡單,就是有這樣的:知識產權歷史投票系統

tbl_votes商店爲特定對象票值:

CREATE TABLE IF NOT EXISTS `tbl_votes` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `vote` int(11) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

tbl_votes_ips存儲的IP < =>投票的歷史使某些IP只能投一次:

CREATE TABLE IF NOT EXISTS `tbl_votes_ips` (
    `vote` int(11) NOT NULL, 
    `ip` int(11) NOT NULL 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

的目的是降低插入新的值時,SQL調用。目的是在高負載的網站上使用。這些功能的最佳做法是什麼?

請分享你的經驗。

附:我已經做了投票IP對唯一鍵的想法,所以我沒有選擇和,而只是處理MySQL的「沒有獨特的價值」的錯誤:

ALTER TABLE `tbl_votes_ips` ADD UNIQUE (
`vote` , 
`ip` 
); 

但是,這不會對當的情況下工作用戶正在改變它的選擇。所以無論如何,我需要打額外的電話來搜索IP和投票。

+1

你意識到這隻會讓成千上萬的人在弗吉尼亞共享AOL代理服務器的人投票嗎? ...或者對任何給定代理服務器後面的所有人投一票。僅限IP是一種非常不可靠的解決方案。 – 2013-03-11 17:25:00

+0

是的我意識到,這就是爲什麼我要求幫助,請發佈更好的解決方案,我將不勝感激 – Serg 2013-03-11 17:29:08

回答

2

備選方案A

要求用戶註冊和登錄。

備選方案B

  • 設置一個唯一的cookie。如果它在以後的訪問中出現,請使用它。
  • 連接瀏覽器用戶代理+ IP地址並創建一個哈希值。將該散列用於將來的訪問,如果該Cookie不存在,則作爲該用戶是否投票的代理。它將有85%的可靠性。
  • 如果您願意,您可以在用戶代理+ IP之外添加更多因素,但涉及更多。詳情請參閱Panopticlick

備選方案C

使用Evercookie。如果你走這條路,在你的隱私政策中要非常清楚你正在這樣做。通過使用但不公開使用這些技術,公司已經被起訴(一些成功,一些失敗,但以任何方式花費他們的時間和金錢)。

限制

請記住,任何這些技術並不很難有人來解決。多用戶註冊只是一個免費的電子郵件帳戶。如果您回收有線電視盒,許多家庭互聯網連接將獲得新IP。智能手機在街道上行駛一英里左右即可獲得新的IP。即使用戶在其系統中有多個瀏覽器,Panopticlick也會失敗。

0

使用唯一的密鑰,例如

PRIMARY KEY (vote, ip) 

那麼簡單

INSERT INTO tbl_votes_ips (vote, ip) VALUES ($vote, $ip) 
ON DUPLICATE KEY UPDATE SET vote=VALUES(vote) 

這是可以做到單個查詢和MySQL將處理決定,如果它應該是一個插入或更新。

而且,正如Eric J上面提到的,您的系統將面臨任何共享代理/ NAT網關的用戶組。並且也不會處理IPv6上的用戶。雖然目前還不是特別普遍,但它已經到了IPv6支持不再被忽視的程度。

+0

謝謝!這對簡單的設置非常有幫助。你能提出一些需要考慮共享IP的東西嗎? – Serg 2013-03-11 17:33:37

+0

不是真的。 IP是識別網絡上特定主機的唯一方法。您可以嘗試添加其他內容,例如瀏覽器用戶代理字符串,Cookie等等,但沒有一個100%可靠。 – 2013-03-11 17:34:51

+0

沒問題,所以更好的解決方案是隻爲註冊用戶計票。 – Serg 2013-03-11 17:38:05

0

如何爲每位用戶投票?授予用戶使用電子郵件註冊的能力,並確保您將確認電子郵件發送至他們的電子郵件,以便他們對其進行驗證。然後你得到了你的唯一標識符,不管它們從哪裏登錄,都不允許同一個用戶投票一次。

如果您希望某組用戶不能投票選定某個部分,那麼您需要創建一個用戶類並與用戶表相關聯,以便John和Smith擁有相同的用戶類並且僅允許投票一次。