Нужен совет по разработке таблиц в SQL-сервере - PullRequest
2 голосов
/ 17 декабря 2009

У меня есть цитата, которая содержит элементы (хранить в таблице QuoteItem):
QuoteItemId, QuoteId, ItemId, количество и т. Д.

Теперь мне нужно иметь возможность создать группу выбранных элементов в цитате и применить скидку к ней. Ну, это просто, я создаю еще две таблицы:
Group: GroupId, DiscountPercentage
GroupQuoteItem: GroupId, QuoteItemId

Допустим, у меня есть 30 пунктов в цитате. Я сделал группу, которая содержит пункты 1-20 из цитаты, и я применил скидку на нее. Теперь мне нужна другая группа, которая содержит позиции 10-30, проблема заключается в тех внутренних 10 товарах, мне нужно контролировать, должна ли скидка применяться на товары после другой скидки или она должна быть на базовой цене товаров.
Например, я собираюсь поговорить о пункте №. 15 в цитате: QuoteItem.Cost = 100 Я применил 1-ую скидку 10% = 90.
Теперь я хочу применить вторую скидку, мне нужно иметь возможность контролировать, должна ли скидка быть на 100 или на 90.
То же самое, когда у меня есть несколько групп скидок и когда я хочу применить сложную архитектуру скидок.

Любая помощь будет очень признательна.

Ответы [ 4 ]

1 голос
/ 17 декабря 2009

Я бы посмотрел на добавление столбца в таблицу GroupQuoteItem, GroupQuoteItem.Priority. Этот столбец будет использоваться в запросе, который определяет окончательную цену. Если у вас есть N скидок с одинаковым наивысшим приоритетом, они будут накладываться друг на друга (порядок не имеет значения благодаря ассоциативности умножения).

Если все эти высокоприоритетные скидки впоследствии будут удалены, их могут заменить их. Это должно помочь вам в создании довольно сложных структур скидок.

Я надеюсь, что, по крайней мере, у вас есть с чего начать.

0 голосов
/ 17 декабря 2009

Почему бы не сохранить в таблице групп столбец, в котором указано, может ли скидка накапливаться с другими скидками, а не должна ли она применяться только к базовой цене? Вы можете назвать это поле как-то вроде «ApplyToBasePriceOnly».

Кроме этого, я согласен с Джоном, что большая часть этой логики должна быть включена в бизнес-правила. Я думаю, что ваша общая структура базы данных выглядит довольно хорошо.

0 голосов
/ 17 декабря 2009

Это может быть один из тех редких случаев нормализации, когда вы хотите сохранить данные, которые вы могли бы рассчитать иначе. Таким образом, в QuoteItem у вас может быть поле Cost и поле DiscountsCost. Если они одинаковы, то вы знаете, что скидка не была применена, если нет, то скидка была применена. Имея это поле, вы также сможете сравнивать, какая скидка уже есть и хотите ли вы добавить дополнительную скидку. Фактически, вы также можете сохранить этот номер в поле ExistingDiscount.

0 голосов
/ 17 декабря 2009

Это действительно зависит от ваших собственных бизнес-правил. Хотите применить скидки по цене после скидки или по первоначальной цене. Когда вы задаете такие вопросы, это помогает с ДАННЫМИ ОБРАЗЦОВ, а затем показывает нам ожидаемые результаты.

...