|
Проектирование базы предложений
|
|||
---|---|---|---|
#18+
Приветствую! Столкнулся с проблемой проектирования базы и приложения. Есть таблица с ценами: id create_date shop_id product_id price Таблица показывает актуальные цены на конкретные продукты в конкретном магазине. Подразумевается, что цена в течение времени может изменяться. В этом случае в таблицу добавляется новая запись с новым значением create_date. Приложение вытаскивает актуальные (действующие на конкретную дату) и предлагает их купить или заказать. Вопрос. Как лучше спроектировать базу, чтобы хранить информацию об истории изменения цен в магазине по продукту, но при этом указать приложению, что данный продукт в конкретном магазине на дату запроса больше не продается? Я думал сделать это простым занулением цены, что будет означать, что товар снят с продажи. Но иногда товар может продаваться бесплатно. Как лучше организовать? Как это делают интернет-магазины? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2021, 23:11 |
|
Проектирование базы предложений
|
|||
---|---|---|---|
#18+
Добавь к create_date ещё и delete_date. Заодно и запросы цены на определённую дату упростятся, поскольку достаточно будет BETWEEN. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2021, 23:36 |
|
Проектирование базы предложений
|
|||
---|---|---|---|
#18+
Вы имеете ввиду сделать поля "Дата начала" и "Дата окончания"? Тогда возникает новая проблема: нужно контролировать пересечения периодов при попытке добавить новую запись... Но вариант наверное неплохой... ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2021, 01:48 |
|
Проектирование базы предложений
|
|||
---|---|---|---|
#18+
ElfixТогда возникает новая проблема: нужно контролировать пересечения периодов при попытке добавить новую запись... Можно, но не нужно (ибо напряжно для СУБД). Это задача приложения - корректно завершить один период и начать новый. В некоторых случаях пользователи могут даже найти применение для двух одновременно действующих цен. Их фантазия иногда неописуема. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2021, 02:18 |
|
Проектирование базы предложений
|
|||
---|---|---|---|
#18+
И добавьте поле "тип цены", т.к. в общем случае цен может быть несколько (оптовые, ВИП, акционные и пр.). ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2021, 10:26 |
|
Проектирование базы предложений
|
|||
---|---|---|---|
#18+
Elfix, Если правильно понял: https://habr.com/ru/post/101544/ https://en.wikipedia.org/wiki/Temporal_database#Bitemporal_Relations ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2021, 13:20 |
|
Проектирование базы предложений
|
|||
---|---|---|---|
#18+
ElfixКак лучше спроектировать базу, чтобы хранить информацию об истории изменения цен в магазине по продукту, но при этом указать приложению, что данный продукт в конкретном магазине на дату запроса больше не продается?Не смешивать сущности цены и количества (признак отсутствия). Ибо экономия копеечная, а гемор реальный (для всех). ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2021, 16:53 |
|
Проектирование базы предложений
|
|||
---|---|---|---|
#18+
Elfix, Если "отсутствие цены" и "цена = 0" это разные понятия, то вполне можно для отсутствия цены использовать значение NULL ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2021, 00:05 |
|
Проектирование базы предложений
|
|||
---|---|---|---|
#18+
Elfix Я думал сделать это простым занулением цены, что будет означать, что товар снят с продажи. Но иногда товар может продаваться бесплатно. Как лучше организовать? Как это делают интернет-магазины? Самый простой и быстрый способ- логическое поле (продается/не продается, по умолчанию продается) В САМОМ КЛАССИФИКАТОРЕ ТОВАРА а не в таблице цен... Функционал можно расширить, используя вместо логики целое (0 - не продается, 1- продается, 2- ожидается в ближайшее время, 3- только под заказ, ...) Плюсы: - самый тупой менеджер без всякого анализа может найти продукт и установить нужное значение. - не искажаются цено-временные параметры интервалов (не нужно ничего занулять) Хотя и сомнительна постановка такого вопроса, но всё же не исключена... Elfix но при этом указать приложению, что данный продукт в конкретном магазине на дату запроса больше не продается? то можно признак (продается/не продается) поместить и в таблицу с ценами, тогда это будет хотя бы осмысленно, например с 01.10.21 по 21.10.21 признак 2 (ожидается... ещё едет в магазин) Вообще-то за прошлые периоды, узнать о том, что товар не продавался можно и по отчетам о продаже и по остаткам на дату... Наличие расширенного признака в ценах делает анализ более функциональным (сроки доставки например) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2021, 13:04 |
|
Проектирование базы предложений
|
|||
---|---|---|---|
#18+
vmag, В самом классификаторе нельзя, так как тогда придется в связанной с ним таблице хранить информацию в каких именно магазинах продается, а в каких нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2021, 17:20 |
|
Проектирование базы предложений
|
|||
---|---|---|---|
#18+
Elfix Есть таблица с ценами: Я бы задумался, зачем в ней поле id. Смысла у него, в общем-то, нет. Elfix Вопрос. Как лучше спроектировать базу, чтобы хранить информацию об истории изменения цен в магазине по продукту Для этого нужно добавить к записи пару полей date_from / date_to - цена действует с такого-то момента по такой-то. Соответственно, если на данный момент для данного магазина цены нет - он не может продавать этот товар. Elfix Я думал сделать это простым занулением цены Это плохая практика. Она была вынужденной в шестидесятых-семидесятых годах прошлого века, когда вопрос экономии ресурсов стоял неизмеримо острее, чем сейчас. В 21-м веке баланс изменился, и простая-ясная структура данных, порождающая надёжный безошибочный код, стоит куда дороже, чем экономия пары байтов. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2021, 16:59 |
|
|
Start [/forum/topic.php?fid=32&tid=1539770]: |
0ms |
get settings: |
2ms |
get forum list: |
7ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
18ms |
get topic data: |
4ms |
get forum data: |
1ms |
get page messages: |
20ms |
get tp. blocked users: |
0ms |
others: | 71ms |
total: | 125ms |
0 / 0 |