Что предлагается схеме базы данных для информации о заказе/счете?
Я должен внести некоторые изменения в систему электронной коммерции, чтобы добавить дополнительную информацию, и хотел воспользоваться возможностью, чтобы сделать некоторые улучшения и сделать ее более гибкой. Когда клиент размещает заказ, мы должны хранить несколько элементов информации с каждым упорядоченным предметом; например, цена продукта, цена доставки, собранный налог, любые корректировки, которые были сделаны.
Я обсуждаю, должны ли эти поля храниться дискретно, например (упрощенный пример):
ORDER_LINE_ITEM
OrderLineItemID
ProductID
Qty
Price
Shipping
Handling
SalesTax
Adjustment
Например, я мог рассчитать общую цену, которую заплатил клиент:
SELECT Qty*(Price+Shipping+Handling+SalesTax) As TotalCollected FROM ORDER_LINE_ITEM
Или, если я должен использовать более непрямую структуру:
ORDER_LINE_ITEM
OrderLineItemID
ProductID
Qty
ORDER_LINE_ITEM_ENTRIES
OrderLineItemEntryID
OrderLineItemID
EntryType
Value
Например:
1 | 1 | Price | $10
2 | 1 | Shipping | $5
3 | 1 | Handling | $1
4 | 1 | SalesTax | $1
5 | 1 | Adjustment | -$3.50
Преимущество этого заключается в том, что я могу хранить дополнительную информацию позже без изменения схемы таблицы. Однако получение информации и выполнение отчетов становится более сложным и медленным.
Существует ли наилучшая практика для хранения этой информации в базах данных заказа/счета?
Спасибо заранее,
Dan
Ответы
Ответ 1
Я бы сделал смешанный подход, имея оба:
ORDER_LINE_ITEM
OrderLineItemID
ProductID
Qty
Price
Shipping
Handling
SalesTax
Adjustment
Extras
ORDER_LINE_ITEM_ENTRIES
OrderLineItemEntryID
OrderLineItemID
EntryType
Value
И затем сделав
SELECT Qty*(Price+Shipping+Handling+SalesTax+Extras) As TotalCollected FROM ORDER_LINE_ITEM
Тогда вы можете работать большую часть времени с помощью одной таблицы, но если вам нужно искать детали элемента (или добавлять новые вещи, которые влияют на цену), вы можете сделать это (используя дополнительное поле).
В другой теме я бы подумал, действительно ли все эти поля должны быть на ORDER_LINE_ITEM. Я не знаю вашего бизнеса, но в тех, которые я знаю, стоимость доставки, обработки и цены вычисляется по всему заказу, а не только по одному пункту (и не всегда можно разделить его на отдельные элементы). Также довольно часто бывает, что у пользователя или пароля есть "Администратор", который может приходить и продавать все, что захочет, вводить произвольные поля для всего и игнорировать все обычные бизнес-правила. Поэтому вы можете подумать о том, чтобы сделать что-то вроде:
ORDER_LINE_ITEM
OrderLineItemID
OrderId
ProductID
Qty
ORDER
OrderId
ItemsTotalPrice
Shipping
Handling
SalesTaxes
Adjusment
FinalPrince
Вы можете создать таблицу сведений, чтобы указать, как были созданы значения заказа (налоги, доставка и т.д.)...
В общем, я обнаружил, что лучший подход заключается в том, чтобы иметь сущность, которая имеет окончательную информацию обо всех заказах (или операции), а затем дополнительные субобъекты, которые определяют, как рассчитывались "итоговые" значения.
Ответ 2
Вы можете найти несколько довольно стандартных проектов баз данных для общих проблем в Database Answers. Нажмите здесь для своей модели данных.
Существует несколько моделей образцов, связанных с выставлением счетов.
Ответ 3
Концептуально, лучше ур второй aproach, потому что информация о заказе не принадлежит непосредственно продукту, продукт может существовать без "Shipping", "taxex", к тому же, таким образом, вы храните меньше данных, не нужно повторять продукт информация.
ORDERITEM
OrderItemID
ProductID
Qty
ORDERITEMENTRIES
OrderItemID
EntryType
Value