我想设计一个数据库,描述如下:
每个产品在一个时间点仅具有一种状态。但是,产品的状态可能会在其生命周期内发生变化。如何设计产品和状态之间的关系,以便在当前时间轻松查询所有具有特定状态的产品?另外,有人可以给我一些与设计时间有关的设计数据库的详细信息吗?谢谢你的帮助
最佳答案
这是一个满足您陈述的要求的模型。
Link to Time Series Data Model
Link to IDEF1X Notation 适用于不熟悉关系建模标准的人员。
第一个模型已经完成; (ProductId,DateTime)足以为主键提供唯一性。但是,由于您要求在某些查询条件下提高速度,因此我们可以在物理级别上增强模型,并提供:
我已提供您要求的讨论。当然,您需要尝试使用合理大小的数据集并做出自己的决定。如果这里有您不了解的内容,请询问,我会继续进行。
对评论的回应
报告当前状态为2的所有产品
SELECT ProductId,
Description
FROM Product p,
ProductStatus ps
WHERE p.ProductId = ps.ProductId -- Join
AND StatusCode = 2 -- Request
AND DateTime = ( -- Current Status on the left ...
SELECT MAX(DateTime) -- Current Status row for outer Product
FROM ProductStatus ps_inner
WHERE p.ProductId = ps_inner.ProductId
)
ProductId
已索引,领先col,双方DateTime
,涵盖查询选项StatusCode
已索引,涵盖查询选项StatusCode
是DESCending,因此只需要一次访存就可以满足内部查询这是普通的SQL,是一个子查询,它利用SQL引擎的强大功能进行关系集处理。这是一种正确的方法,没有更快的方法,而其他任何方法都将更慢。任何报告工具都只需单击几下,无需键入即可生成此代码。
ProductStatus中的两个日期
DateTimeFrom和DateTimeTo等列是严重错误。让我们按重要性排序。
请注意,如果保留了最高阶规则(归一化),则将消除整个较低阶问题集。
从集合的角度思考
SELECT ProductId,
Description,
[DateFrom] = DateTime,
[DateTo] = (
SELECT MIN(DateTime) -- earliest in subset
FROM ProductStatus ps_inner
WHERE p.ProductId = ps_inner.ProductId -- our Product
AND ps_inner.DateTime > ps.DateTime -- defines subset, cutoff
)
FROM Product p,
ProductStatus ps
WHERE p.ProductId = ps.ProductId
AND StatusCode = 2 -- Request