什么是订单/发票信息的建议数据库架构?

Dan*_*n C 12 database-design

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

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

ORDER_LINE_ITEM
    OrderLineItemID
    ProductID
    Qty
    Price
    Shipping
    Handling      
    SalesTax
    Adjustment
Run Code Online (Sandbox Code Playgroud)

例如,我可以计算客户支付的总价:

SELECT Qty*(Price+Shipping+Handling+SalesTax) As TotalCollected FROM ORDER_LINE_ITEM
Run Code Online (Sandbox Code Playgroud)

或者如果我应该使用更间接的结构:

ORDER_LINE_ITEM
    OrderLineItemID
    ProductID
    Qty

ORDER_LINE_ITEM_ENTRIES
    OrderLineItemEntryID
    OrderLineItemID
    EntryType
    Value
Run Code Online (Sandbox Code Playgroud)

例如:

1 | 1 | Price      | $10
2 | 1 | Shipping   | $5
3 | 1 | Handling   | $1
4 | 1 | SalesTax   | $1
5 | 1 | Adjustment | -$3.50
Run Code Online (Sandbox Code Playgroud)

这样做的好处是我可以在以后存储其他信息而无需更改表模式.但是,检索信息和运行报告会变得更加复杂和缓慢.

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

提前致谢,

Wal*_*tty 7

您可以在Database Answers中找到几个相当标准的数据库设计来解决常见问题. 单击此处查看其数据模型页面.

有几个样本模型与开发票有关.

  • @DanC - 我坦率地从数据库答案中获取任何模型,并且含有大量的盐.我发现他们的模型对于真实世界的应用来说往往是不切实际的.在开始新设计时,最好看一下通用模型.它可能会引起你注意到你没有想到的东西.在一天结束时,您应该根据业务需求而不是其他人的模型来建模您的架构. (4认同)

use*_*736 1

我会采取混合方法,两者兼而有之:

ORDER_LINE_ITEM
    OrderLineItemID
    ProductID
    Qty
    Price
    Shipping
    Handling      
    SalesTax
    Adjustment
    Extras

ORDER_LINE_ITEM_ENTRIES
    OrderLineItemEntryID
    OrderLineItemID
    EntryType
    Value    
Run Code Online (Sandbox Code Playgroud)

然后做

SELECT Qty*(Price+Shipping+Handling+SalesTax+Extras) As TotalCollected FROM ORDER_LINE_ITEM
Run Code Online (Sandbox Code Playgroud)

然后,您可以在大部分时间使用单个表,但如果您需要搜索项目的详细信息(或添加影响价格的新内容),您可以这样做(使用额外的字段)。

在另一个主题中,我会考虑所有这些字段是否真的应该位于 ORDER_LINE_ITEM 上。我不了解您的业务,但在我知道的业务中,运输、处理甚至价格是针对整个订单计算的,而不是仅针对一件商品(并且并不总是可以将其拆分为单独的商品)。拥有“管理员”用户或密码也很常见,他可以来出售他想要的任何东西,为所有东西输入任意字段,并忽略所有正常的业务规则。所以你可能会考虑做类似的事情:

ORDER_LINE_ITEM
    OrderLineItemID
    OrderId
    ProductID
    Qty

ORDER
    OrderId
    ItemsTotalPrice
    Shipping
    Handling
    SalesTaxes
    Adjusment
    FinalPrince
Run Code Online (Sandbox Code Playgroud)

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

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