价格比较数据库 - 将价格数据放在主表、一个单独的表还是多个产品表中?

问题描述 投票:0回答:2

我正在尝试建立一个价格比较数据库,其中包含 n 个产品以及销售这些产品的确定但不断变化的供应商数量。

对于我的价格比较数据库,我需要存储不同供应商产品的当前价格和历史价格(一个最低价格)。

据我所知,我有两种选择来设计数据库表:

1. 将所有供应商价格放入主表中。

我知道会有多少供应商,如果我添加或删除供应商,我可以添加或删除列。

历史价格(所有供应商在特定日期的最低价格),进入一个单独的表,其中包含产品名称、价格和日期。

2. 一张产品表和一张价格表

我将在主表中仅包含静态属性数据,例如类别、属性等,然后将价格添加到单独的产品表中,在其中存储价格、供应商、日期,并且我可以将最低价格存储为伪供应商每个日期都放在该表中,或者我也可以将其存储在单独的表中。

您建议使用哪种方法?我是否遗漏了什么?

sql database
2个回答
1
投票

您应该以包含所有历史记录的标准化格式存储基础数据。这意味着您有以下表格:

  • 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
表中的最低价格——大概使用触发器。

另一个方法是使用触发器为每个产品和供应商维护一个汇总表。然而,这可能不是您应该开始努力的方式。

但是,您可能会对上述查询对数据的执行效果感到惊讶。


0
投票

使用数据库架构示例实现选项 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 ;

© www.soinside.com 2019 - 2024. All rights reserved.