我有一个 PostgreSQL 表,Prices
其中包含以下列:
price
(十进制)product_id
(诠释)
还有created_at
和updated_at
列。
价格会定期更新,我会在表中保留旧价格。对于给定的产品,表中的最后一个价格是当前价格。
获得特定产品最新价格的最有效方法是什么:
- 最后一条记录的索引
product_id
和查询 - 添加第三列
active
(布尔值)以标记最新价格并创建复合索引(product_id
和active
) - 或者是其他东西?
我有一个 PostgreSQL 表,Prices
其中包含以下列:
price
(十进制)product_id
(诠释)还有created_at
和updated_at
列。
价格会定期更新,我会在表中保留旧价格。对于给定的产品,表中的最后一个价格是当前价格。
获得特定产品最新价格的最有效方法是什么:
product_id
和查询active
(布尔值)以标记最新价格并创建复合索引(product_id
和active
)
无论解决方案如何,您都需要 product_id 上的索引。
如果您在 updated_at 列上有一个索引,并且您只需要按照您所说的那样获取“特定产品”,那么我会这样做:
但是,如果我没有得到我想要的结果,或者如果我需要获得许多产品的当前价格,那么我会尝试添加一个活动列的选项,并将其设置为 N 用于除新价格之外的所有价格更新价格,然后我将创建一个部分索引,如 a_horse_with_no_name 所建议的那样处于活动状态。我只会在需要时去那里,因为它增加了更新先前价格行以使其不活跃等的复杂性。
在不了解数据库的其余部分的情况下,您可以使用一些非正常形式来加快产品价格获取(假设每个项目都有一个价格)。
只需在表中创建一个名为
last_price
type的新列并price
在表上product
创建触发器。每次创建新价格时,都会使用最新价格更新相关产品。这样,每次您获取产品时,您也会获取其最新价格。AFTER INSERT ON EACH ROW
price
从 9.3 版开始,PostgreSQL 支持物化视图。这是一种非规范化数据的好方法,保持正常的写入形式和非规范化的读取视图。视图的更新可以通过 Postgres 的 LISTEN/NOTIFY 机制来触发。
您确实应该在价格表中有一列 wef 日期和时间(生效日期)。用户将在更新价格时输入其值。之后仅获取 desc wef 限制为 1 的值。