Что предлагается схеме базы данных для информации о заказе/счете?

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

Я обсуждаю, должны ли эти поля храниться дискретно, например (упрощенный пример):

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