2013-08-28 128 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