我正在尝试建立一个价格比较数据库,其中包含 n 个产品以及销售这些产品的确定但不断变化的供应商数量。
对于我的价格比较数据库,我需要存储不同供应商产品的当前价格和历史价格(一个最低价格)。
据我所知,我有两种选择来设计数据库表:
1. 将所有供应商价格放入主表中。
我知道会有多少供应商,如果我添加或删除供应商,我可以添加或删除列。
历史价格(所有供应商在特定日期的最低价格),进入一个单独的表,其中包含产品名称、价格和日期。
2. 一张产品表和一张价格表
我将在主表中仅包含静态属性数据,例如类别、属性等,然后将价格添加到单独的产品表中,在其中存储价格、供应商、日期,并且我可以将最低价格存储为伪供应商每个日期都放在该表中,或者我也可以将其存储在单独的表中。
您建议使用哪种方法?我是否遗漏了什么?
您应该以包含所有历史记录的标准化格式存储基础数据。这意味着您有以下表格:
products
,每个产品一行,以及产品的静态信息。vendors
,每个供应商一行以及有关供应商的静态信息。prices
,每个价格占一行以及日期、产品和供应商。您可以使用查询获取当前价格和最低价格,例如:
select pr.*
from (select pr.*, min(price) over (partition by product) as min_price
row_number() over (partition by product, vendor order by price_datetime desc) as seqnum
from prices pr
where pr.product_id = XXX
) pr
where seqnum = 1;
为了性能,您需要
prices(product, vendor, price_datetime desc)
上的索引。
最终,您可能会发现该查询运行得太慢。在这种情况下,您将考虑优化。一种优化只是使用触发器存储每个价格/供应商组合的最新日期,以及
products
表中的最低价格——大概使用触发器。
另一个方法是使用触发器为每个产品和供应商维护一个汇总表。然而,这可能不是您应该开始努力的方式。
但是,您可能会对上述查询对数据的执行效果感到惊讶。
使用数据库架构示例实现选项 2 这是一个简化的架构:
产品表:存储静态产品数据。
product_id(主键) 产品名称 类别 属性
价格表:存储当前和历史价格。
price_id(主键) 产品 ID(外键) 供应商 ID 价格 日期
供应商表:
vendor_id(主键) 供应商名称 其他_供应商_详细信息
触发器记录最低历史价格的 SQL 示例
CREATE TABLE historical_prices (
product_id INT,
price DECIMAL(10, 2),
date DATE,
PRIMARY KEY (product_id, date)
);
DELIMITER $$
CREATE TRIGGER update_lowest_price
AFTER INSERT ON prices
FOR EACH ROW
BEGIN
DECLARE lowest_price DECIMAL(10,2);
-- Check for existing lowest price on the same date
SELECT price INTO lowest_price FROM historical_prices
WHERE product_id = NEW.product_id AND date = NEW.date;
IF lowest_price IS NULL OR NEW.price < lowest_price THEN
-- Insert or update the historical_prices table
INSERT INTO historical_prices (product_id, price, date)
VALUES (NEW.product_id, NEW.price, NEW.date)
ON DUPLICATE KEY UPDATE price = LEAST(price, NEW.price);
END IF;
END$$
DELIMITER ;