我已经开始维护一个应用程序,它带有一个大型数据库,部分不规范/非常混乱。大量重复数据和一些包含大量字段(30+)的表。例如,我有一个名为Orders的表,其中包含许多字段。我去分割这个表,但不允许更改数据库布局。现在,如果我坚持使用存储库模式,我相信我应该为它创建一个Order实体和CRUD方法。问题是,业务逻辑几乎从不要求加载/更新整个订单实体,而只需要一个子集。这将构成很多实体(如FullOrder,OrderMetaInfo,OrderProcessingDetails等)。
我的问题是,处理这种数据库混乱的最佳方法是什么?我正在考虑创建一个名为Orders的简单类,以前提到的实体作为POCO,而不是像UpdateOrderMetaInfo()或GetOrderProcessingDetails()这样的方法。这似乎是一个非常好的方法,直到你开始思考,有两个表,一个是订单,另一个是ArchivedOrders(不,这些字段不相同但很相似 - 甚至不问)。似乎我将运行大量的重复代码。现在我开始考虑编写一个非常简单的数据库访问类,在这里您可以传递一个手工制作的SQL查询并获取记录集,就像过去那样。你有比这更好的想法吗?
事实和限制:它是一个Sql数据库,项目是用C#编写的。还有另一个系统使用相同的数据库,因此更改数据库布局不是一个选项。使用EF或任何第三方产品进行数据访问不也是一种选择。
对于非常长的帖子感到抱歉,感谢您的反馈。
答案 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的一些好东西,如下所述:
特别注意数据加载选项和编译的查询。
我必须告诉你,这不是最好的解决方案,但是可行,你可以使用Linq to Sql保持你的代码干净整洁,这不是非常复杂的......希望这会有所帮助。