我必须对电子商务系统进行一些更改以添加一些附加信息,并希望借此机会进行一些改进并使其更加灵活。当客户下订单时,我们必须为每件订购的商品存储几项信息;例如,产品价格、运费、征收的税费、所做的任何调整。
我正在争论这些字段是否应该离散存储,例如(简化示例):
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
这样做的优点是我可以稍后存储附加信息而无需更改表架构。然而,检索信息和运行报告变得更加复杂和缓慢。
是否有将此信息存储在订单/发票数据库中的最佳实践?
提前致谢,
丹
您可以在数据库答案中找到几种针对常见问题的相当标准的数据库设计。 单击此处查看其数据模型页面。
有几个与发票有关的示例模型。
我会采取混合方法,两者兼而有之:
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
您可以创建一个详细信息表来指定如何创建订单值(税费、运费等)...
一般来说,我发现最好的方法是拥有一个具有所有订单(或操作)的最终信息的实体,然后是指定如何计算“总计”值的附加子实体。
从概念上讲,第二种方法更好,因为订单信息不直接属于产品,产品可能没有“Shipping”、“taxex”而存在,而且,这样,您存储的数据更少,不需要重复的产品信息。
ORDERITEM
OrderItemID
ProductID
Qty
ORDERITEMENTRIES
OrderItemID
EntryType
Value