2012-07-27 51 views
6

我的數據庫中已經有很多現有的數據,並且想要開發一個積分機制,它根據每個用戶的行爲計算得分。在春天設計一個積分系統

我以可插拔的方式實現了這個功能,因此它獨立於主邏輯,並且一旦實體被修改,就依靠發送Spring事件。

問題是如何處理現有數據。我不想從現在開始收集點數,而是直到現在包括所有數據。

這樣做最實際的方法是什麼?我是否應該設計我的插件,以便提供一個index()方法,這會強制我的系統從數據庫中獲取每個實體,發送一個EntityDirtyEvent,爲每個實體啓動點插件,然後更新它讓點被保存在每個實體旁邊。這可能會導致很多開銷,對吧?

最簡單的事情就是創建一個複雜的存儲過程,然後使index()調用該存儲過程。不過,在我看來,它也是一件壞事。因爲我將不得不編寫計算java中的點的邏輯,爲什麼再次使用SQL呢?另外,總的來說,我不是將業務邏輯分解到不同層的粉絲。

有沒有人做過這個?請幫忙。

回答

4

首先讓我們區分實施策略和業務規則。

既然您已經擁有數據,請考慮直接從數據中獲取結果。這形成了數據域模型。設計數據模型以存儲所有數據。然後,創建一組查詢,視圖和存儲過程來訪問和更新數據。

一旦你有了這些視圖,就可以使用Spring JDBC模板等數據訪問庫來獲取這些數據並將它們表示爲java對象(列表,地圖,人物,點表等)。

到目前爲止,您完成的工作並沒有多大改變,無論系統上層發生了什麼。這被稱爲模型。

然後,開發一個規則庫或邏輯實現,它決定在什麼輸入,用戶操作,數據條件或所有其他條件下,需要哪些數據。從數學意義上講,這就像一個矩陣。在編程意義上,這將是一組邏輯語句。如果這和這是真的,那麼獲取這些數據,或者獲取這些數據等。這包含了系統中的邏輯。因此它被稱爲「控制器」。

不要將此邏輯移入查詢/存儲過程/視圖。

然後最後爲此開發一個前端或「控制檯」。在最簡單的情況下,開發一個控制檯輸入系統,它需要一個..並顯示一組結果。這是您對系統的「看法」。

您最終可以將視圖開發爲Web應用程序。上述命令行視圖仍然可以以Restful API服務器的形式存在。

2

我認爲這裏有一個問題需要考慮:據我所知,數據庫中有大量數據,因此只創建一個機制來計算積分系統的想法不是最好的方法。

實際上,如果您不想開始收集點數但包含所有數據,則必須處理並計算您現在擁有的信息。是的,您第一次運行此操作可能會產生開銷,但正如您所說,您需要計算此數據。

另一方面,您可能包含另一種機制,用於參加實體中的更改並啓動不同的過程,以計算適用於此特定修改的新指向差異。

因此,您可以使用一個負責計算指向系統的服務,一個用於單個實體和另一個,可能需要更長的時間才能完成,能夠計算全局點。即使您不需要實時計算,也可以創建一個負責啓動它的預定作業。最後,我知道將業務邏輯分爲兩層(Db + Java)並不是一種好的方法,但有時需要這樣做,例如,如果您需要快速回復最終適用的請求很多註冊表。我發現有些情況下,除了向數據庫添加業務邏輯(作爲存儲過程等)來管理大量數據並將最終結果返回給瀏覽器客戶端(例如:在特定時間的計算過程)。

2

您正在嘗試完成「引導」。你選擇的方法應該取決於點計算的複雜程度。如果存儲過程或簡單的更新語句是最簡單的解決方案,那就這樣做。

如果計算複雜,可以編寫一個加載現有數據的批處理作業,可能會首先對其進行最早排序,然後觸發與該數據對應的事件,就好像它們剛剛發生一樣。處理事件的代碼應該與處理未來事件的代碼完全相同,因此除了批處理作業本身之外,您不必編寫任何其他代碼。

既然你只運行一次這個東西,即使它是快速和骯髒的最簡單的解決方案。

2

你似乎正朝着正確的方向前進。你知道你想讓你的「積分」與主應用程序分開。由於暗示您已經在使用休眠模式(通過標籤!),您可以使用休眠事件系統(請參閱here第14.2節)。根據系統的大小/複雜程度,你可以在這裏插入你的積分計算(如果它不是一個龐大/複雜的系統),或者你可以發佈自己的事件,以便被任何正在收聽的軟件拾取。

任何一種設計方法的關鍵在於既不知道也不關心你的點計算。如果你正在嘗試創建一個相當通用的插件機制,那麼你可以從這個搭配點向你的系統發佈自己的事件。然後,如果您在給定的安裝/設置中沒有插件,則沒有人獲取/處理事件。如果在另一個安裝/設置中有多個插件,則每個插件都可以根據收到的事件決定他們需要執行哪些處理。在「點插件」的情況下,它會計算它的點值並存儲它。沒有存儲過程要求....

1

有兩種不同的方法。 一個是你已經知道 - 輪詢數據庫以查找更改的數據。在這種情況下,當數據庫可能沒有更改時,您正在訪問數據庫,並且可能會降低您的流程。

第二種方法 - 無論何時數據庫發生變化,數據庫都會觸發事件。您可以使用CDC(更改數據捕獲)。它會盡量減少開銷。

您可以在Spring Integration

中查找更多選項