Я предполагаю, что вам нужно хранить product name
и price
во время заказа. Оба будут меняться с течением времени. Если это произойдет много , ваш текущий подход может быть достаточно хорошим.
Я бы рассмотрел нормализованный подход, особенно если у вас есть много строк в order_products
на (product name, price)
. Имейте дополнительную таблицу, которая хранит изменчивые состояния продукта каждый раз, когда они изменяются. Можно назвать product_history
, как вы уже намекнули. Просто сохраните дату (или метку времени) с каждым новым состоянием. Для сохранения ссылочной целостности используйте ссылку на внешнюю ссылку на таблицу product
. Как это:
create table product_history
(product_id integer -- or timestamp
,valid_from date
,product_name varchar
,price decimal
,PRIMARY KEY (product_id, valid_from)
,FOREIGN KEY (product_id) REFERENCES product(product_id)
ON DELETE CASCADE
ON UPDATE CASCADE)
Быстрый запрос для поиска применимых изменчивых атрибутов:
SELECT *
FROM product_history
WHERE product_id = $my_product_id
AND valid_from <= $my_date
ORDER BY valid_from DESC
LIMIT 1;
Вам обязательно нужен индекс для (product_id, valid_from) , чтобы ускорить этот запрос. Первичный ключ в моем примере, вероятно, подойдет.