Как хранить старые данные, и это правильный путь? - PullRequest
0 голосов
/ 22 мая 2019

Проблема: сохранить стартовую цену с указанием даты.Цена может изменяться несколько раз, и также должна быть сохранена причина для изменения цены.

Я не могу придумать другой способ сделать это, кроме как создать таблицу изменения цен?

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)
);

Я получаю сообщение об ошибке в таблице цен, также я не знаю, как на самом деле использовать sql, чтобы сохранить цену от цены в ценовом обмене и сохранить новую цену как цену.

например, цена = 100. newprice =50 причина: слишком дорого.Должно выглядеть так:

таблица цен: current_price: 50 price_date: отметка времени создания цены

pricechange: start_price: 100 new_price: 50 date: отметка времени изменения цены Причина: слишком дорого

Ответы [ 3 ]

0 голосов
/ 22 мая 2019

Начните с таблицы изменения цен, потому что это то, что вам действительно нужно:

create table price_changes (
    price_change_id int auto_increment primary key,
    start_price decimal(4,2) NOT NULL,
    new_price decimal(4,2) NOT NULL,
    price_date date NOT NULL,
    reason varchar(100)
);

Вы просто вставили бы новые цены в эту таблицу.

Тогда вы можете вести таблицу current_prices, используя триггер. Или, если хотите, просмотр:

create view price_date, current_price as
    select pc.new_price as price
    from price_changes pc
    order by change_date desc
    limit 1;
0 голосов
/ 24 мая 2019

Я не согласен с другими ответами (пока).Я подозреваю, что ваш пример упрощен и / или со временем станет более сложным.Следовательно, запросы будут запутанными и / или медленными.

Я предлагаю 2 таблицы.Думайте об одном как о «текущем», а о другом как о «истории».Всякий раз, когда происходит изменение цены, history получает INSERTed и current обновляется.Я сделал бы эти два шага в коде приложения или Хранимого Процесса или с помощью TRIGGER.

. Составьте столбцы каждой таблицы на основе того, чтозапросы будут применяться к каждому.Не думайте о FOREIGN KEYs, пока не найдете нужного в них.Имейте в виду, что две таблицы, возможно, никогда не будут использоваться в одном запросе.

0 голосов
/ 22 мая 2019

Как насчет одной таблицы с price, effective_from и reason столбцами.Затем вы можете использовать представление, чтобы показать 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 намо.

... но это должно быть иллюстративно (достаточно)!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...