13

我必须对电子商务系统进行一些更改以添加一些额外的信息,并希望借此机会进行一些改进并使其更加灵活。当客户下订单时,我们必须为每个订购的商品存储几项信息;例如,产品价格、运费、征收的税款、所做的任何调整。

我正在争论这些字段是否应该离散存储,例如(简化示例):

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

这样做的好处是我可以稍后在不更改表模式的情况下存储其他信息。然而,检索信息和运行报告变得更加复杂和缓慢。

是否有将此信息存储在订单/发票数据库中的最佳做法?

提前致谢,

4

3 回答 3

9

您可以在 Database Answers 中找到一些针对常见问题的相当标准的数据库设计。 单击此处查看他们的数据模型页面。

有几个与发票有关的示例模型。

于 2012-07-21T15:07:10.070 回答
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

您可以创建一个详细信息表来指定如何创建订单值(税金、运费等)...

一般来说,我发现最好的方法是拥有一个具有所有订单(或操作)的最终信息的实体,然后是指定如何计算“总”值的附加子实体。

于 2012-07-21T03:53:31.483 回答
0

从概念上讲,第二种方法更好,因为订单信息不直接属于产品,产品可能没有“ Shipping”,“taxex”而存在,此外,这样存储的数据更少,不需要重复的产品信息。

ORDERITEM
    OrderItemID
    ProductID
    Qty

ORDERITEMENTRIES
    OrderItemID
    EntryType
    Value
于 2012-07-21T00:59:48.040 回答