2011-12-28 2 views
0

Это сценарий, который я часто встречается:Проектирование таблиц для заказа системы

Нормализация часто требует от нас разработки таблиц таким образом, что данные не повторится.

Пример типичного ввода заказа, который показывает следующую информацию:

  1. Описание продукта.
  2. Цена товара.

Пример нормализованной базы данных, таблица заказов, вероятно, будет иметь PK таблицы продуктов (которая содержит описание продукта, цены).

Однако цена товара может увеличиться/уменьшиться после того, как клиент сделает заказ.

Должен ли я хранить цены на продукт во время транзакции в таблице заказов?

Есть ли лучшее решение для этого типа проблем?

+1

Одна вещь: ** не ** вызывать вашу таблицу 'Order', так как это зарезервированное ключевое слово SQL (как в' ORDER BY') - назовите его 'Orders' или что-то еще! –

+1

@marc_s Nooooo не плюрализует имена моих таблиц! – Yuck

+1

@Yuck: ну, тогда назовите его 'OrderHead' или что-то ..... –

ответ

2

Хотя нормализация уменьшает избыточную информацию, «избыточность» является техническим термином с узким значением. В этом контексте redundant означает те же значения с тем же значением.

Должно быть ясно, что «текущая цена» и «цена на момент размещения заказа» (или «цена, которую клиент согласился заплатить») не имеют того же значения, даже если значения оказываются идентичны.

Существует несколько способов моделирования этого. Но критическое понимание заключается в том, что вы говорите о двух совершенно разных вещах, когда говорите о ценах таким образом.

1

Вы верны. Я бы использовал таблицу OrderLine для хранения каждой строки в заказе. Сохраните цену, которую продал prodcut. Вы также можете хранить любые скидки, которые были предоставлены.

0

Ответ на вызов Catcall является удивительным. Должен быть дан правильный ответ. Но чтобы расширить точку, имена столбцов также должны быть разными. Если у вас есть два столбца в двух таблицах с тем же именем, я ожидаю, что данные в них означают одно и то же. Наличие столбца под названием «цена» не помогает никому, кто пытается понять вашу модель. Extended_price, Price_at_sale, MSRP и т. Д. Все помогают мне понять данные с первого взгляда.

Другой способ взглянуть на это, как вы будете учитывать купоны/скидки/предложения/комплекты bogo? Если я куплю товар за 5 долларов, но купон на 1 доллар. Я продал этот продукт за 5 или 4 доллара? Если вы скажете $ 5, тогда у вас может быть отдельная позиция в таблице подробностей для - $ 1, но если вы изучите прибыльность этого продукта, вы можете пропустить эти скидки.

Смежные вопросы