2011-07-07 39 views
0

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

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

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

对不起,对于广泛的长篇文章,并感谢您的反馈。

+1

卖给他们,让你用db改变另一个应用程序! – Nick

回答

1

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

例如,用户可以做

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

那么你的setter看起来就像

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

,最后你的更新方法决定的基础上,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(); 
0

我在工作中有类似的情况我。

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

0

这似乎是每个其他开发者遇到的问题...这个不改变数据库的要求很糟糕,但是如果你必须坚持下去,我可以分享一些我曾经用过的非常接近的应用程序所做的一些事情......我曾经有过一个Linq To Sql的DAO对象datacontext的。我同意Order实体不需要满载,但我们得到周围的方式是使用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这不是很复杂......希望这有助于。