【问题标题】:Data access pattern for an unconventional database layout非常规数据库布局的数据访问模式
【发布时间】:2011-09-30 10:04:00
【问题描述】:

我已经开始维护一个应用程序,该应用程序带有一个大型数据库,该数据库部分未标准化/相当混乱。大量重复数据和一些包含大量字段的表(30+)。例如,我有一个名为 Orders 的表,其中包含许多字段。我会去拆分这个表,但是不允许更改数据库布局。现在,如果我坚持使用存储库模式,我相信我应该为它创建一个 Order 实体和 CRUD 方法。问题是,业务逻辑几乎从不需要加载/更新整个订单实体,而只是一个子集。这将构成很多实体(如 FullOrder、OrderMetaInfo、OrderProcessingDetails 等)。

我的问题是,处理这种数据库混乱的最佳方法是什么?我正在考虑创建一个名为 Orders 的简单类,之前提到的实体是 POCO,而不是像 UpdateOrderMetaInfo() 或 GetOrderProcessingDetails() 这样的方法。在您开始考虑之前,这似乎是一个很好的方法,有两个表,一个是 Orders,另一个是 ArchivedOrders(不,字段不相同但非常相似 - 甚至不要问)。看来我会在大量重复代码中运行。现在我开始考虑编写一个非常简单的数据库访问类,您可以在其中传递一个手工制作的 sql 查询并取回一个记录集,就像在过去的美好时光一样。你有比这更好的主意吗?

事实和限制:它是一个 Sql 数据库,该项目是用 C# 编写的。有另一个系统使用相同的数据库,因此更改数据库布局不是一种选择。使用 EF 或任何第 3 方产品进行数据访问也不是一种选择。

很抱歉这篇文章太长了,感谢您的反馈。

【问题讨论】:

  • 卖给他们,让您使用 db 更改其他应用程序!

标签: c# design-patterns data-access-layer


【解决方案1】:

您为什么不直接使用属性设置器来实际“标记”需要更新的内容。

例如,用户可能会这样做

Order.Client = "Jorge";
Order.Price = 300;
Order.Provider = "Microsoft";

那么你的二传手看起来像

public string Client{
set
{
  mClient = value;
  ModifiedFields.Add("ClientField");
}

最后,您的 Update 方法将根据 ModifiedFields 信息决定需要运行的实际查询以更新修改后的字段。

要实际检索数据,如果查询不是那么慢,或者...如果它的权重确实足以影响您的性能,您可以简单地使用通用 GetOrder() 方法,让每个属性的 getter 检索所需的信息给定的数据子集,通过缓存策略或向属性提供 GetLastValue。

例子:

public class DBField<T>
{
  private DBCommand getCommand;

  public T Value {get;set;}
  public T GetLastValue()
  {
     // Execute getCommand here
  }

  public DBField<T>(DBCommand GetCommand)
  {
    this.getCommand = GetCommand;
  }
}

然后我的用户会这样做:

string Client = Orders["Id"].Client.GetLastValue();

【讨论】:

    【解决方案2】:

    我在工作中也遇到了类似的情况。

    我处理它的方法是创建一个新数据库,它只包含现有数据库混乱的视图。然后,我们的应用程序将视图用于所有 crud 操作。

    【讨论】:

      【解决方案3】:

      这似乎是每个其他开发人员都遇到过的问题......不更改数据库的要求很糟糕,但如果你必须坚持下去,我可以分享一些我用一个非常接近的应用程序所做的事情使用...我曾经拥有具有 Linq To Sql 数据上下文的 DAO 对象。我同意 Order 实体不需要完全加载,但我们解决它的方法是使用一些 linq to sql 的好东西,就像这里描述的那样:

      http://www.sidarok.com/web/blog/content/2008/05/02/10-tips-to-improve-your-linq-to-sql-application-performance.html

      特别注意数据加载选项和编译的查询。

      我必须告诉你,这不是最好的解决方案,但它是可行的,你可以使用 Linq to Sql 保持你的代码干净整洁,这不是很复杂......希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2012-08-17
        • 2014-06-07
        • 2014-10-23
        • 1970-01-01
        • 1970-01-01
        • 2010-09-28
        • 1970-01-01
        • 1970-01-01
        • 2014-08-10
        相关资源
        最近更新 更多