.net 数据仓库类型解决方案?

.net 数据仓库类型解决方案?,.net,vb.net,design-patterns,.net,Vb.net,Design Patterns,我正在开发一个从其他系统删除信息的系统。例如,有一个客户数据库,如果客户最近的订单是6年或更长时间的,则可以删除客户 我可以想出两种方法: 为每个系统创建类,例如Customer(用于客户数据库)、Order(用于订单数据库)等。在多态性的每个类中都有一个名为Delete的函数,即客户端可以在每个类中调用Delete,这将删除必要的记录 使用SSIS将做出实体决策所需的所有信息(如订单)复制到副本数据库中,并生成一个大查询,查询所有应删除的内容。这是一种数据仓库类型的方法 我无法决定哪个选项更好

我正在开发一个从其他系统删除信息的系统。例如,有一个客户数据库,如果客户最近的订单是6年或更长时间的,则可以删除客户

我可以想出两种方法:

  • 为每个系统创建类,例如Customer(用于客户数据库)、Order(用于订单数据库)等。在多态性的每个类中都有一个名为Delete的函数,即客户端可以在每个类中调用Delete,这将删除必要的记录
  • 使用SSIS将做出实体决策所需的所有信息(如订单)复制到副本数据库中,并生成一个大查询,查询所有应删除的内容。这是一种数据仓库类型的方法

  • 我无法决定哪个选项更好

    两者似乎都有各自的优点和缺点,我个人会选择第二种方法,尤其是当你处理大量的记录时,这样就不会用连续的点击来删除记录。这两种方法似乎都有各自的优点和缺点,我个人会选择第二种方法,尤其是当你处理大量的记录时,为了不让数据库被连续的点击所占用,你需要删除记录。

    我不同意你的第一种方法。我不确定所有独立的业务类都会以某种方式为
    Delete
    方法共享相同的接口是否有意义。删除客户所需的参数可能与删除订单所需的参数不同。强迫他们共享同一个界面似乎很奇怪。这样做可能会不必要地限制将来代码的灵活性。此外,删除客户的业务逻辑可能涉及盲目地循环其他对象(没有特定顺序),并对所有对象调用
    Delete
    方法,这似乎有些奇怪。我认为您应该对它们被删除的顺序有更多的控制,以及在其中一个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
    
    出于多种原因,第二种选择将更加灵活。例如:

    Public Interface ICustomerBusiness
        Function GetStaleCustomers(timeSinceLastOrder As TimeSpan) As IList(Of CustomerDto)
        Sub DeleteCustomer(customerId As Integer)
    End Interface
    
    • 你可以更好地控制正在发生的事情和时间。这将允许您在过程中提供详细的状态更新(如有必要)。它还允许您在出现故障时提供详细的跟踪日志记录和更精确的错误消息
    • 删除订单的业务逻辑将被分解为一个单独的可重用业务类。如果您只需要从代码中的其他地方删除一个订单,您可以通过通用代码来完成

      • 我不同意你的第一种方法。我不确定所有独立的业务类都会以某种方式为
        Delete
        方法共享相同的接口是否有意义。删除客户所需的参数可能与删除订单所需的参数不同。强迫他们共享同一个界面似乎很奇怪。这样做可能会不必要地限制将来代码的灵活性。此外,删除客户的业务逻辑可能涉及盲目地循环其他对象(没有特定顺序),并对所有对象调用
        Delete
        方法,这似乎有些奇怪。我认为您应该对它们被删除的顺序有更多的控制,以及在其中一个delete方法失败时如何处理

        我建议首先从更高的层次来考虑。你实际上需要什么样的商业方法?根据您描述的场景,我可以看到两种业务方法:

        • 获取过去6年中没有订单的所有客户的列表
        • 删除客户(及其所有订单)
        因为这两种方法都与客户相关,所以将它们组合成一个单一的客户业务类(某种类型)是有意义的。例如:

        Public Interface ICustomerBusiness
            Function GetStaleCustomers(timeSinceLastOrder As TimeSpan) As IList(Of CustomerDto)
            Sub DeleteCustomer(customerId As Integer)
        End Interface
        
        一旦您像那样封装了业务逻辑,现在不管数据访问层是如何实现的。客户机调用那些简单的业务层方法,而不必关心逻辑在幕后如何工作。通过将业务逻辑封装在自己的层中,您可以自由地以不同的方式重写它,而无需重写任何客户机代码

        那么,业务类内部的逻辑是什么样的呢?它可以是对一个数据访问方法的一次调用,该方法通过一个大型SQL命令完成所有工作,也可以通过多次调用分别完成每个步骤。这完全取决于你。明显地