Имеются таблицы "Товары" и "Поставки". Планируется выгружать отчет с маржой (Розн.цена минус закуп. цена).
Вопрос: как реализовать хранение данных закупочной цены, если она может постоянно меняться? Допустим, данные по розничной цене я могу получить из завершенного заказа, но как брать закупочную цену? Где её хранить в такой ситуации?
Элементарно. Если какой-то атрибут может менять значение со временем, то он обретает вид табличных данных.
Таблица "Цена":
id_cost - идентификатор цены;
id_cost_next - следующая цена;
id_good - идентификатор товара (внешний ключ таблицы "Товары");
id_delivery - идентификатор поставки (внешний ключ таблицы "Поставки");
id_type - тип цены: розничная/закупочная (внешний ключ таблицы "Типы цен");
date_set - дата/время установки цены;
id_currency - идентификатор валюты: р. руб/евро/доллар (внешний ключ таблицы "Валюта").
value - значение цены.
При добавлении нового значения цены необходимо предыдущей записи цены по текущему товару устанавливать id_cost_next равный текущему значению id_cost.
Текущая цена на товар будет определяться id_cost_next is null, ретроспективные - id_cost_next is not null.
Самая ранняя установленная цена по товару будет определяться по min(id_cost) в пределах текущего товара.
Спасибо. Единственное, что не понял - это последнее предложение. Куда вы предлагаете поместить внешние ключи id_good и id_delivery? Или я не так понял и это было пояснение к первой таблице "Цена".
В таблицах "Товары" и "Поставки" не нужно создавать дополнительных внешних ключей к таблице "Цена". Текущих полей таблицы "Цена" достаточно, чтобы определять начальную цену товара (как розничной, так и закупочной) в момент создания записей в таблицах "Товары" и "Поставки", так и добавлять динамику изменения цен.
Я убрал лишний комментарий. Добавил комментарий, как пользоваться id_cost_next.