通常,我处理具有从其成分或子女成员中衍生的属性的汇总或家长实体。例如:

  • byte_countpacket_count 一个 TcpConnection 对象是根据其两个组成部分的相同属性计算的 TcpStream 对象又是根据其组成的计算的 TcpPacket 对象。

  • 一个 Invoices 对象可能有一个 total 基本上是其组成的总和() InvoiceLineItems价格,有一些货物,折扣和税收逻辑。

在处理数百万数据包或数百万个发票的订单项(我希望!)时,这些派生属性的按需计算 - 在视图中或更常见的是在演示逻辑(例如报告或Web接口)中 - 通常是不可接受的。

您如何在表现涉及您的手之前决定是否将派生的属性“促进”到预先计算的领域?

有帮助吗?

解决方案

我个人不会在性能权衡迫使我的手(因为不符号的缺点太大的IMHO)之后才能达到规律,但是您也可能会考虑:

  1. 方便: :例如,如果两个不同的客户端应用想要计算相同的派生属性,则它们都必须对查询进行编码以计算它们。还是标以更简单的方式提供两个客户端应用程序的派生属性。
  2. 随着时间的推移稳定: :例如,如果计算派生属性的公式是可变的,则构成规范化使您可以在时间点捕获和存储派生值,因此将来的计算永远不会弄错
  3. 更简单的查询: :在DB结构中添加复杂性可能意味着您的选择查询在客户端端更简单。
  4. 表现: :在非规范数据上选择查询可以更快。

参考: 数据库程序员:命名的参数. 。请务必阅读他的文章 保持不正当值正确 - 他的建议是使用触发器。这使您需要的那种违反否定性需要。

其他提示

基本上,您不这样做。您离开表演涉及您的手。

这是最好的答案,因为99%的时间,您应该 不是 这样的预先优化,最好是即时进行计算。

但是,客户端应用开发人员通常会以错误的先入之词进入服务器端非常普遍。...派生属性的按需计算...- 经常 令人难以置信的缓慢“,这是不正确的。这里正确的措辞将是”很少 令人难以置信的缓慢".

因此,除非您是该专家(DB开发建筑师等),否则您不应进行过早优化。等到 明显的 那是必须固定的, 然后 查看预聚合。

当前必须如何确定您如何实施数据。

我将假设2个简单的状态:当前或非当前。

  • 当前:索引视图,触发器,存储的Procs维护聚合表等
  • 不是当前:报告服务快照,日志运输/复制,数据仓库等

也就是说,我会根据与POR相同的数据进行开发,因此我对响应时间有信心。您的代码性能很少感到惊讶...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top