2013-08-28 183 views
1

我正在開發一個從其他系統中刪除信息的系統。例如,有一個客戶數據庫,如果最近的訂單是六年或更長時間,客戶可以被刪除。數據倉庫類型解決方案?

我能想到的兩種方法是:

  1. 每個系統例如創造類客戶(用於客戶數據庫),訂單(用於訂單數據庫)等。在每個類中爲多態性都有一個稱爲刪除的功能,即客戶可以在每個類中調用刪除,這將刪除必要的記錄。
  2. 全部複製,使有關實體如決策所需要的信息使用SSIS命令進入複製數據庫並生成一個應該刪除的所有內容的大查詢。這是一種數據倉庫類型方法。

我不能決定哪個選項是更好的。

回答

2

我想借此與第一種方法的問題。我不確定所有單獨的業務類別以某種方式共享同一個接口的方法是否合理。刪除客戶所需的參數可能與刪除訂單所需的參數不同。迫使他們共享相同的界面似乎很奇怪。這樣做可能會在未來不必要地限制代碼的靈活性。此外,刪除客戶的業務邏輯似乎很奇怪,會盲目地循環其他對象,並不是特定的順序,並且在所有這些對象上都調用了一個Delete方法。我想你會希望更多地控制它們被刪除的順序,以及在刪除方法失敗時如何處理。

我會建議它的第一個想法在一個較高的水平。你實際需要什麼商業方法?根據您描述的情況,我可以看到兩個業務方法:

  • 在過去6年取得所有客戶的列表,沒有訂單
  • 刪除用戶(及其所有的訂單一起)

由於這兩種方法都與客戶有關,所以將它們組合到一個單一的客戶業務類中是有意義的。例如:

Public Interface ICustomerBusiness 
    Function GetStaleCustomers(timeSinceLastOrder As TimeSpan) As IList(Of CustomerDto) 
    Sub DeleteCustomer(customerId As Integer) 
End Interface 

一旦你喜歡封裝的業務邏輯,現在不要緊數據訪問層是如何實現的。客戶端調用這些簡單的業務層方法,而不必關心該邏輯在後臺工作的方式。通過將業務邏輯封裝在自己的層中,您可以自由地以不同的方式重寫它,而無需重寫任何客戶端代碼。

那麼,什麼會是企業級內部的邏輯是什麼樣子?它可以是一次調用數據訪問方法,通過一個大規模SQL命令完成所有工作,也可以分別執行多個調用來執行每個步驟。這真的取決於你。顯然前者會更有效率,但後者會更靈活。這將取決於你的需求。下面是每個可能的樣子的一個簡單示例:

Public Sub DeleteCustomer(id As Integer) 
    _customerDataAccess.DeleteCustomerAndOrders(id) 
End Sub 

' or... 

Public Sub DeleteCustomer(id As Integer) 
    For Each i As OrderDto In _orderBusiness.GetOrdersByCustomer(id) 
     _orderBusiness.DeleteOrder(i.Id) 
    Next 
    _customerDataAccess.DeleteCustomer(id) 
End Sub 

第二個選項由於多種原因會更加靈活。例如:

  • 您將更好地控制正在發生的事情和時間。這將允許您在此過程中提供詳細的狀態更新(如有必要)。它也可以讓你提供詳細的跟蹤日誌和更精確的錯誤消息,當出現問題時。
  • 刪除訂單的業務邏輯將分解爲單獨的可重用業務類。如果您需要從代碼的其他地方刪除某個訂單,則可以通過通用代碼進行操作。
+0

謝謝。您能否在最後一段中解釋您的意思:「後者會更靈活」? – w0051977

+0

我假設你正在談論可擴展性和SOLID方法的所有好處? – w0051977

+0

@ w0051977我更新了我的答案,以更好地描述我的意思。 –

1

兩者似乎有自己的優點和缺點,我會親自去第二條路線,特別是如果你正在處理非常大量的記錄,以不佔用數據庫中連續命中刪除記錄。

+0

謝謝。 +1表示「連續點擊」。但是,我忘記補充說我正在從由提供Web服務的第三方開發的數據庫中刪除。因此,如果有100條記錄要刪除,那麼數據庫上會有100條記錄。我想這會改變你的答案? – w0051977

+0

我仍然認爲這是一種更清潔的方法,但是,從這個角度來看,它幾乎是一種洗滌方式。 – user2366842

+0

你仍然認爲選項2呢? – w0051977

1

第三種方法是使用具有多個代理的消息傳遞系統。這種方法非常適用於非常複雜的場景。

這裏有一個場景:

用戶運行一個命令來刪除一個實體(訂單,客戶等)。 用戶正在使用的工具會在表示用戶意圖的工作隊列 中創建一條消息(例如「刪除客戶123」)

消息由一個或多個代理處理。每個代理對特定的大部分操作都是特定的 ,並且僅偵聽相關的 消息。所有代理都在單個分佈式事務中工作。 這意味着每個代理商都有一個非常狹窄的特定範圍,但任何代理商都可以拒絕整體操作。如果代理需要執行其他子任務,則可以爲這些操作排隊其他消息(例如,刪除屬於客戶的每個訂單的 )。

該方法可以很好地擴展,特別是對於非常複雜的交互。它避免了任何一個系統必須知道所有其他系統。每個代理知道要處理的消息,並處理與該消息相關的非常具體的任務。

它的初始設置更多,但是非常具有可擴展性(您可以添加新的代理,消息等,而不會影響現有的代理)。

如果您決定使用此方法,請參閱MassTransit以獲取框架(還有其他方面)。如果你在.NET中工作,它是一個非常好的系統,功能強大,但平易近人。它的Sagas對於協調多個代理之間的複雜交互尤其好。

+0

謝謝+1。用戶不刪除記錄 - 這是一個計劃任務。消息系統是什麼意思? - 你是指應用程序客戶端嗎? – w0051977

+0

我指的是一個MessageBus,它是一個建築組件。我建議以MassTransit作爲MessageBus框架的一個例子。 http://www.eaipatterns.com/MessageBus.html – STW

+0

如果這是自動清理不相關的系統,那麼你可能不需要/需要一個集中的工具來做到這一點。爲每個系統選擇最佳選項可能會更好。 – STW