Разрабатываем CRM систему для клиента чтобы автоматизировать его отчеты. Сейчас пришли до такового степена что нужно придумать как правильно сохранить цены продуктов в БД чтобы история цены сохранилось и чтобы посчитать отчета было легко. Итак есть перечень продукции и есть не сколько склады и магазинов. Среди магазинов и складов есть тип отчетов - Приход Расход или Перемещение товаров с одного склада на другой склад. При добавление отчетов нужно указать цены товара и при этом нужно сохранить старые цены как история(у меня самому есть идея но я в этом новичок, поэтому хочу услышать мнения опытные разрабы). Я знаю сейчас многие CRM системы уже придумали данную структуру, но я ещё не в курсе как лучше сделать. Подскажите, если у вас есть опыт, или источник которые ответит на мои вопросы. За ранее спасибо.
из-за таких как "чего тут думать?" потом бывает дофига проблемы...
Мне интересует совет людей которые уже сталкивались с такими проблемами и решили как-то оптимально.
Дилик Пулатов, вполне рабочий совет. А "чего тут думать?" добавлено правильно - по причине абсолютной очевидности ответа и его почти что безальтернативности.
Вот если Ваша СУБД поддерживает версионность, тогда лучше, конечно, пользовать штатные средства вместо костылей. Но, судя по заданному вопросу, такой поддержки нет.
Или Вы не знаете возможности своей СУБД - а тогда надо не бросаться задачу решать, а сначала инструмент освоить. Потому как вот именно без этого "потом бывает дофига проблем"...
У каждой цены введи доп поле id_old_price, где будет храниться id старой цены, если она была, это позволит создавать цепочки истории цен любой длины.
И ввести поле current_price которое будет иметь флаг 1 или 0 и будет обозначать что именно эту цену нужно отображать на сайте, если стоит флаг 1.
... и используй рекурсивные CTE для получения среза цен на заданную дату... не лучшее решение, хотя и рабочее, конечно. Плюс сложности с контролем целостности (проверять, что цепь цен не раздвояется).
ввести поле current_price которое будет иметь флаг 1 или 0
Потенциальная точка рассогласования. Плюс переопределённые данные. Для получения актуальной цены достаточно взять ту, на которую нет ссылок.