【发布时间】:2011-05-19 06:05:58
【问题描述】:
我在使用以下数据结构优化数据查找时遇到问题:
Order
-----
Id
Customer
Date
... etc
OrderStatus
------
Id
OrderId
Date
UpdatedBy
StatusTypeId
...etc
订单列表页面让我头疼,该页面基本上显示了Orders 的列表。列表中的每个订单摘要都显示了来自Order和当前OrderStatus的一堆字段,即OrderStatus和最新的Date链接到Order。
Order List
-------------------------------------------------------
Order Id | Customer | Order Date | CurrentStatus |
-------------------------------------------------------
1 | Someone | 1.10.2010 | Completed |
-------------------------------------------------------
2 | Someone else | 12.10.2010 | In Progress |
-------------------------------------------------------
3 | Whoever | 17.10.2010 | On Hold |
-------------------------------------------------------
现在,假设我想列出今年的所有订单。我的存储库获取 Order 对象
var orders = _repository.GetAllOrdersSinceDate(dt);
现在我得到了类似的东西
foreach (Order order in orders)
{
OrderSummary summary = new OrderSummary();
summary.Customer = order.Customer;
summary.Date = order.Date;
// ...etc
// problem here!!
summary.OrderStatus = order.OrderStatus
.OrderByDescending(s => status.Date).First();
}
所以我最终得到的是在Order 上的SELECT 声明,然后在OrderStatus 上为每个Order 返回一个SELECT 声明。
因此,要显示今年所有记录的摘要,需要大约 20,000 个单独的 SQL 查询,并且需要很长时间才能加载。
有什么好办法解决这个问题吗?
我正在考虑重写数据库以在Order 表中保存当前 OrderStatus,所以我最终得到类似
Order
-----
Id
Customer
Date
CurrentStatusTypeId
CurrentStatusDate
CurrentStatusUpdatedBy
...etc
OrderStatusHistory
------
Id
OrderId
Date
UpdatedBy
StatusTypeId
...etc
这是我能看到的解决问题的唯一方法,但似乎是一个非常讨厌的解决方案。
这里最好的方法是什么?
【问题讨论】:
标签: linq-to-sql database-design optimization orm entity-relationship