【问题标题】:Derived status field on table?表上的派生状态字段?
【发布时间】:2011-10-20 16:32:22
【问题描述】:

我的客户是一家长期租赁机构。 所以我们有

 Goods 
    pk modelId

 Stock
    pk stockId, fk modelId

 Rentals ( rented stock)
    pk rentalId fk stockId

此外,库存可能会呈现其他状态,例如正在维修等,并且可能同时具有多个状态。

将状态字段放在 stock 表上会让我的生活更轻松,但最终它是我可以从其他表中推断出的派生数据。 一个示例是查找库存商品(未租用)的总数,包括库存数量为 0 的商品。 我应该

  • 将rented、onRepair 等状态字段添加到库存表中
  • 保持现货场
  • 每次都查一下?

    ps 库存和货物表是分开的,因为对于库存类型(即制造商等),分类法比我在此处解释的更复杂

【问题讨论】:

    标签: database database-design relational-database


    【解决方案1】:

    如果状态或其他属性可以从其他表派生,更容易实现的选项是保持原样并“每次都查找”。您的表格保持标准化。并且您不必使用触发器等复杂的解决方案维护任何派生值。

    您何时必须考虑其他选择?当上述方法变得缓慢时 - 即使您已经优化了查询。如果您必须计算 10 年股票价格的平均值以及数千种股票和商品的平均值,那么查询将不够快,无法即时计算。

    因此,您可以先添加包含您需要的聚合或其他派生数据的表或字段。您可以使用索引视图(大多数 RDBMS 具有该功能)或用于聚合数据的附加表 - 这可以很好地用于无法再更改的数据,例如前几天/几个月/几年的股票价格统计数据。当一天/月/年结束时,计算完成(一次)并更新表格。然后,您可以为旧数据快速搜索这些表,为较新数据快速搜索“活动”表。

    用于更复杂情况的其他选项包括维护派生值的触发器。我会将此作为最后的资源,但我确信在这个问题上存在相反的观点。

    【讨论】:

    • 谢谢,我没想过使用视图。
    猜你喜欢
    • 2023-03-23
    • 2011-08-16
    • 2018-01-07
    • 2015-03-12
    • 1970-01-01
    • 2019-05-03
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多