2011-09-29 17 views
1

因此,我幾乎完成了我的通知系統,並且在即將實施reCAPTCHA之前,我測試瞭如果我發送垃圾郵件通知會發生什麼情況。我應該使用Global ID's還是爲我的通知系統找到其他解決方案?

給你一些我的通知系統的背景。我通過它的時間戳確定最新的內容。我從數據庫ORDER BY時間戳中檢索行。時間戳值是一個格式爲Unix Time的整數。當顯示通知,他們是超鏈接,遵循此URL格式 -

http://test.com/article/id 

其中ID爲表的ID,每次新的文章被提交,該ID的增量。垃圾郵件發送通知後,我注意到垃圾郵件通知的URL是相反的順序。經過進一步調查後,我發現如果我的垃圾郵件速度夠快,時間戳變量不夠準確,並且記錄了多個具有相同時間戳的提交。

由於我的網站現在流量很低,而且提交的文件也不多,所以目前這不是一個問題,但是如果一個非常小的機會,但是如果一段內容與另一個同時提交,當他們被錯誤提交時,通知將排名靠前,這是一個很小但很煩人的錯誤。

所以我想知道我該怎麼做。我應該解決這個問題,還是這是一個非常微小的機會發生。由於reCAPTCHA的實施,垃圾郵件並不是問題,但仍有可能偶然發生。

我已經想出了3種可能的解決方案。我的問題是哪個是最高效的

  1. 爲所有4種類型的內容創建一個全局ID,每次創建評論,文章或更新時都會增加。
  2. 使用更精確的PHP時間函數,如microtime
  3. 添加某種次級排名的可變
+0

曾經有人做過適當的負載測試...... –

+0

對於初學者來說,'timestamp'列不應該是一個整數,而應該是'DATETIME'。如果你有'AUTO_INCREMENT' id列,你不需要'ORDER BY timestamp'。你已經有了一個按ID排序的結果集。 – Shef

+0

對不起,我沒有添加,但我有多個表,爲每個不同類型的內容,一個用於評論,一個用於文章等。請參閱http://stackoverflow.com/questions/7538833/how-to-structure-this -sql-query-combining-multiple-tables – liamzebedee

回答

1

鑑於可以有多個線程,甚至多個節點集羣中的插入在不同的表中有數據總是有可能你使用的任何基於時鐘的值都會被複制到多個甚至是同一個表中。

所以我的第一個想法是使用全局id表。您可以使用帶有自動遞增主鍵的常見content表,其中所有其他表將外鍵鍵入並用於排序。

另一方面,通過相同的邏輯,如何確保提交之間的某些固定順序?很可能兩個提交將按照服務器接收的相反順序提交給數據庫。我認爲解決這個問題的唯一方法就是擁有一個全球網守,所有請求都必須經過。如果您正在使用這樣的網守,那也是分配排序值的最佳位置。總之,我認爲你不應該堅持完整的訂購,因爲它不存在,除非它是一個高度排序的敏感系統,如交易或投注。否則微秒應該足夠好,只要文章評論通知不在文章本身之前。

+0

「...只要文章評論通知不在文章本身之前」 - 是的,這應該做,然後感謝提醒我,我總是需要檢查是否在文章之前發表評論被建造。謝謝! – liamzebedee

相關問題