非常规数据库布局的数据访问模式

时间:2011-07-07 12:07:42

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

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

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

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

对于非常长的帖子感到抱歉,感谢您的反馈。

3 个答案:

答案 0 :(得分:1)

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

例如,用户可以

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

然后你的setter看起来像

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();

答案 1 :(得分:0)

我的工作情况类似。

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

答案 2 :(得分:0)

这似乎是每个其他开发人员遇到的问题......这个不改变数据库的要求很糟糕,但如果你必须坚持下去,我可以分享一些我用非常接近的app做的事情我使用...我曾经有过具有Linq To Sql datacontext的DAO对象。我同意订单实体不需要完全加载,但我们解决它的方式是使用linq 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保持你的代码干净整洁,这不是非常复杂的......希望这会有所帮助。