2010-12-21 67 views
2

我想弄清楚如何設置一個數據庫和/或模型來處理各種徽章。讓我們以堆棧溢出badges爲例。每個規則都有不同的規則,有些可能只是一個不同的變量(比如10條評論和100條評論)。徽章 - 數據結構/模型?

我的問題是你如何在應用程序中設置此類型驗證/檢查?每個徽章是否都有自己的方法?

回答

1

由於SO運行SQL Server,SQL Server代理作業定期運行以製表統計信息。當滿足條件時,作業中的存儲過程將插入到徽章/ etc表中。

觸發器將是另一種選擇,但它們的執行不能延遲多個用戶的範圍。

+0

您將如何設置標準?每個徽章是否需要不同的方法? – RyanJM 2010-12-21 01:33:05

+0

@RyanJM:是的,每個徽章都有它自己的存儲過程。這樣,你可以改變一個,而不會影響其他人 - 單片,超級proc不是一個好主意。 – 2010-12-21 01:58:11

+0

當你說存儲過程時,你的意思是在數據庫還是模型中?對不起,我試圖確保我完全理解如何做到這一點。 – RyanJM 2010-12-21 14:24:36

1

我會想象一些計算是實時的,而其他計算是間歇運行的進程。

例如,當您的答案得到10個upvotes時出現的徽章,可以實時計算,但幾乎沒有性能影響。

另一方面,對於檢查您是否達到日常聲望上限x次數的徽章,您可能希望將其作爲某種批處理作業,因爲您只能在每天結束時進行檢查。

關鍵問題是保持運行速度。堆棧溢出每天會產生數千(甚至數萬)的問題,可能有數十萬條評論。任何不平凡的計算應該在一個單獨的過程中運行。它保持了核心功能的緊湊,有限和清潔,從而實現了高性能。在覈心發佈系統之外的進程中運行復雜的計算,可以在不影響用戶使用該網站的能力的情況下進行。如果任務足夠複雜,則可以通過在多臺機器上運行相同的進程來進行水平擴展。

+0

那麼每個徽章都需要自己的一套方法來貫穿? – RyanJM 2010-12-21 01:31:39

+0

每個徽章可能是它自己的sql查詢。即使你可以一次計算多個bades,我不認爲它是一個好主意。保持每個單獨的計算,因爲它在概念上更簡單。我確定一些SO開發人員會加入並指出他們是如何實際完成的;) – hvgotcodes 2010-12-21 01:33:39

+0

這將會是一些SO開發人員的願望。 – RyanJM 2010-12-21 14:26:34

1

這就是我將如何實現它,如果我需要:

我會設置一些隊列管理器(也有很多這樣的軟件)和寫的經紀人,將從隊列處理消息。每當發生任何事件時,例如:您查看了一個主題,您編輯了您的評論,編輯了您的答案,編輯了其他人的答案,您提出了投票等,等等 - 您將收集一條消息並附帶事件描述。是的,這將是真的那裏的消息量很大。

當您收集了大量的消息後 - 您可以啓動一個代理程序,以便按計劃或實時處理消息。

使用此模式,您可以將代理擴展爲複雜的徽章,只要您想要。