map*_*ike 4 django database-design data-modeling
我正在创建一个基于 Web 的销售点(例如收银机)解决方案,以 Django 作为后端。我一直采用“经典”方法对发票及其行项目进行建模。
\nInvoiceTable\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在尝试研究最佳实践后,我发现没有很多 - 至少没有广泛使用的明确来源。
\nKimball 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每行都需要重复发票 ID(这样我们就可以生成发票总计等数据)。这是这种数据建模方式的故意特征吗?
\nWe 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听起来您混淆了关系设计和维度设计。
关系设计是为了促进事务处理,并最大限度地减少数据异常和重复。这是您的操作数据库。尺寸设计是为了便于分析。
关系设计将具有发票表和 line_items 表,维度设计将具有带有发票行项目粒度的 company_invoices_customer 事实表。
由于这是针对 POS 的,我假设您首先需要一个关系设计。
至于你的问题:
首先,针对此场景有大量良好的数据建模模式。请参阅https://dba.stackexchange.com/questions/12991/ready-to-use-database-models-example/23831#23831
每行都需要重复发票 ID(这样我们就可以生成发票总计等数据)。这是这种数据建模方式的故意特征吗?
是的
我们经常有发票级别的数据,如备注、折扣、运费等。 - 我们如何使用这种方法表示这些数据?
发票表上有一个“注释”字段可能是最简单/最简单的。
对于费用和折扣,您应该使用抽象(请参阅表继承),并将它们添加为订单调整。请参阅上面链接中西尔弗斯顿所著的书。
有些折扣是特定于产品的 - 因此它们无论如何都属于订单项,其他折扣则属于发票范围(想想您购买两种单独的产品并获得这两种产品的折扣的交易) - 我们可以以某种方式将其分配给订单项吗?
商品的价格应在运行时根据其默认价格以及当前“场景”中适用的任何折扣或费用进行计算,例如政府折扣、附近的促销日折扣。您可以使用相互引用的分层行项目,以保持秩序。再次参见西尔弗斯顿的书。
我们如何处理发票“注释” - 我们已经打印和/或内部注释,我们是否会将数据放入行项目中并为每个行项目重复它?
如果您需要行项目注释,请在行项目表上添加注释列。
这似乎违背了数据标准化。把它放在相关的表中?
如果注释可以为空,并且您希望严格规范化,那么可以添加一个invoice_notes表。
归档时间: |
|
查看次数: |
4315 次 |
最近记录: |