数据建模 - 发票和行项目

map*_*ike 4 django database-design data-modeling

我正在创建一个基于 Web 的销售点(例如收银机)解决方案,以 Django 作为后端。我一直采用“经典”方法对发票及其行项目进行建模。

\n
InvoiceTable\n  id\n  date\n  customer\n  salesperson\n  discount\n  shipping\n  subtotal\n  tax\n  grand_total\n  [...]\n\nInvoiceLineItems\n  invoice_id // foreign key\n  product_id\n  unit_price\n  qty\n  item_discount\n  extended_price\n  [...]\n
Run Code Online (Sandbox Code Playgroud)\n

在尝试研究最佳实践后,我发现没有很多 - 至少没有广泛使用的明确来源。

\n

Kimball Group 建议:“我们建议您将标题的所有维度都归结为行项目,而不是保留交易标头 \xe2\x80\x9c 对象、\xe2\x80\x9d 的操作概念。”

\n

请参阅http://www.kimballgroup.com/2007/10/02/design-tip-95-patterns-to-avoid-when-modeling-headerline-item-transactions/http://www.kimballgroup.com/ 2001/07/01/design-tip-25-为父子应用程序设计维度模型/

\n

我是开发新手(之前只使用过桌面数据库软件) - 但根据我的理解,这是有道理的,因为我们可以以任何我们想要的方式钻取数据以用于报告目的(尽管我想我们可以对第一个做同样的事情)方法通过连接表)。

\n

我的问题

\n
    \n
  • 每行都需要重复发票 ID(这样我们就可以生成发票总计等数据)。这是这种数据建模方式的故意特征吗?

    \n
  • \n
  • We often have invoice level data like notes, discounts, shipping charges, etc. - How do we represent these using this method? Some discounts are product specific - so they belong on the line item anyway, others are invoice wide (think of a deal where you buy two separate products and receive a discount on the two) - we could we somehow allocate it across the line items? Same with shipping charges, allocate it by dividing it among the line items?

    \n
  • \n
  • 我们如何处理发票“注释” - 我们已经打印和/或内部注释,我们是否会将数据放入行项目中并为每个行项目重复它?这似乎违背了数据标准化。把它放在相关的表中?

    \n

    有没有使用这种方法的开源项目我可以看一下?不知道如何搜索它们。

    \n
  • \n
\n

Nei*_*gan 7

听起来您混淆了关系设计和维度设计。

关系设计是为了促进事务处理,并最大限度地减少数据异常和重复。这是您的操作数据库。尺寸设计是为了便于分析。

关系设计将具有发票表和 line_items 表,维度设计将具有带有发票行项目粒度的 company_invoices_customer 事实表。

由于这是针对 POS 的,我假设您首先需要一个关系设计。

至于你的问题:

首先,针对此场景有大量良好的数据建模模式。请参阅https://dba.stackexchange.com/questions/12991/ready-to-use-database-models-example/23831#23831

每行都需要重复发票 ID(这样我们就可以生成发票总计等数据)。这是这种数据建模方式的故意特征吗?

是的

我们经常有发票级别的数据,如备注、折扣、运费等。 - 我们如何使用这种方法表示这些数据?

发票表上有一个“注释”字段可能是最简单/最简单的。

对于费用和折扣,您应该使用抽象(请参阅表继承),并将它们添加为订单调整。请参阅上面链接中西尔弗斯顿所著的书。

有些折扣是特定于产品的 - 因此它们无论如何都属于订单项,其他折扣则属于发票范围(想想您购买两种单独的产品并获得这两种产品的折扣的交易) - 我们可以以某种方式将其分配给订单项吗?

商品的价格应在运行时根据其默认价格以及当前“场景”中适用的任何折扣或费用进行计算,例如政府折扣、附近的促销日折扣。您可以使用相互引用的分层行项目,以保持秩序。再次参见西尔弗斯顿的书。

我们如何处理发票“注释” - 我们已经打印和/或内部注释,我们是否会将数据放入行项目中并为每个行项目重复它?

如果您需要行项目注释,请在行项目表上添加注释列。

这似乎违背了数据标准化。把它放在相关的表中?

如果注释可以为空,并且您希望严格规范化,那么可以添加一个invoice_notes表。