mysql - 如何存储旧数据,这是正确的方法吗?

标签 mysql sql database-design

问题:存储带有日期的 start_price。价格可以多次更改,并且还应该存储价格更改的原因。

除了制作价格变动表之外,我想不出其他方法吗?

CREATE TABLE price (
    start_price decimal(4,2) NOT NULL,
    price_date timestamp,
    PRIMARY KEY (start_price, price_date)
);

CREATE TABLE pricechange (
    start_price decimal(4,2) NOT NULL,
    new_price decimal(4,2) NOT NULL,
    price_date date NOT NULL,
    reason varchar(100),
    FOREIGN KEY (start_price, price_date)
    REFERENCES price(start_price, price_date)
);

我在pricechange表中遇到错误,而且我不知道如何实际使用sql将价格从price存储到pricechange并将新价格存储为价格。

例如价格= 100。新价格= 50 原因:太贵了。应该看起来像:

价格表: 当前价格:50 Price_date:价格创建的时间戳

价格变化: 起始价格:100 新价格:50 日期:价格变化的时间戳 原因:太贵

最佳答案

使用包含 price effective_fromreason 列的单个表怎么样?然后,您可以使用一个 View 来显示current_prices,使用一点狡猾!

CREATE TABLE product_prices (
   product_id     int          NOT NULL
 , effective_date datetime     NOT NULL DEFAULT Current_Timestamp
 , price          decimal(4,2) NOT NULL
 , reason         varchar(400) NOT NULL
 , CONSTRAINT pk_product_prices PRIMARY KEY (product_id, effective_date)
 , CONSTRAINT fk_product_prices_products FOREIGN KEY (product_id) REFERENCES products (product_id)
);

CREATE VIEW current_product_prices
  AS
SELECT product_prices.product_id
     , product_prices.price
FROM   product_prices
 INNER
  JOIN (
        SELECT product_id
             , Max(effective_date) AS max_effectve_date
        FROM   product_prices
        WHERE  effective_date <= Current_Timestamp
        GROUP
            BY product_id
       ) AS current_price_date
    ON current_price_date.product_id = product_prices.product_id
   AND current_price_date.max_effectve_date = product_prices.effective_date
;

这是空中代码(即概念性的且未经测试的),因为我现在不可以运行 MySQL。

...但它应该具有说明性(足够)!

关于mysql - 如何存储旧数据,这是正确的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56257765/

相关文章:

mysql - NodeJS Express 内连接问题

MySQL 从最后到开始检查条件是否为真,如果停止则返回

c - Learn C the Hard Way 的 ex17 数据库设计问题

mysql - 类别和标签的数据结构

sqlite - 指示一对多表中的 "canonical"记录

php - 从 mysql 中提取值并以 php 形式编辑

php - 在 PHP 中做一些数学运算

sql - 是否可以将数据库列中的值更改为小写?

mysql - 我想将 AUTO_INCRMENT 更改为 UUID

sql - MySQL 查找相关文章