发票数据库设计

3

几天前,我创建了一个涉及发票的应用程序。我想知道如何最好地将折扣整合到我的发票中。我应该将它作为负项(在invoice_items表中)还是应该在发票表中创建一个“折扣”列?


选择其中任何一个选项,将来对您会有什么后果?例如,您想要多个折扣还是非常特定的折扣? - Pelshoff
感谢您的快速回复。每张发票只能享受一次折扣。 - redmoon7777
1
如果每张发票只有一个折扣,那么我不会让它变得更加复杂化。 - Pelshoff
那么我应该把它放在哪里?在发票表上还是将其作为负项目添加? - redmoon7777
1
抱歉表述不够清晰。在我看来,将其放在发票表中更容易更清晰 - 将其作为负项目会使得项目的处理更加困难,我认为。 - Pelshoff
@Pelshoff:我建议您将您的评论提交为答案,这样redmoon7777就可以接受它作为正确答案 - 总体而言,它们是正确的。虽然整张发票只有一个折扣,但信息应该属于发票头部。如果规则稍后更改,使得单张发票上的不同商品应用不同的折扣,则可以将折扣存储在发票项目表中 - 要么替代,要么也可以同时存储。(“替代”意味着您将为每个项目存储一个折扣;“同时”意味着您将为发票存储一个折扣,但可以根据需要覆盖每个项目的折扣。) - Jonathan Leffler
3个回答

7
我认为将其作为负值项目更好,原因如下:
  • 开票时,计算出的值应该始终保持不变;即使您以后更改了计算公式,也可以正确重现任何给定的发票。即使值在当时被错误地计算了,它也是它本来的样子。
  • 具有数值金额意味着可以轻松处理特殊情况下的手动调整——例如,由于交货延迟,您的市场经理/会计师可能决定提供100美元的一次性折扣。使用负值非常简单,只需添加另一行即可,但使用折扣率则很困难。
  • 您可以在同一张发票上拥有多个折扣金额。
  • 这是完全灵活的——它有自己的空间存在,并且可以成为任何需要的东西。事实上,我会将折扣视为另一个“产品”(甚至可能是多个产品——每个不同的折扣原因都有一个,如圣诞节、优惠券、转介等)。
  • 有了自己的项目,您就可以像任何其他“产品”一样添加原因说明——例如,“付款现金享受10%的折扣”或其他说明。
  • 您不需要任何特殊的代码或数据库列!只需像以前一样将项目合计起来并打印在发票上。这是“没有勺子(折扣)”——它只是另一行项目——比不需要进行任何代码/数据库更简单。
  • 并非所有项目都应享受折扣——例如退款、退货、订阅(如果适用)。在数据库中表示折扣的业务逻辑变得过于复杂和不必要。将计算等操作留在应用程序代码中,将结果存储在数据库中即可。
  • 有了自己的项目,计算可以任意复杂。这意味着随着复杂性的增长,无需对数据库进行维护。与维护/更改数据库相比,维护/更改代码要容易得多。
  • 最后,我成功地建立了一个开票系统,并采用了“项目”方法,效果非常好。

2
+1,但只是刚好而已。这里提出了很多好的观点,但我不确定是否同意整个结论。这可能取决于发票开具所在的行业。发票的稳定性是一个关键点;这可能通过确保价格数据(特别是产品描述等)在发票时间准确无误(可能通过将相关数据从产品表复制到发票项目表或类似方式实现)。对于像一次性100美元折扣之类的“特殊产品代码”,这是可以接受的。[...继续...] - Jonathan Leffler
然而,我认为仅通过特定商品处理折扣是错误的;项目通常会有折扣,并且可以记录为百分比或金额。如果有整体折扣,可以在主发票中记录。在这两种情况下,没有必要使用NULL来记录折扣的缺失;零值通常是适当的默认值(除非确实是列表价格的例外)。 - Jonathan Leffler
@JonathanLeffler,你提出了很好的观点。如果有很多折扣,那么你可能是对的。然而,当列被定义但很少使用,即当折扣不是常规时,你最终会得到“稀疏”的数据,这是我设计上的“红旗”。 - Bohemian
很好 - “发票开具所在的行业”大致相当于“如果有很多折扣”,这意味着决策应该根据实际使用情况来做出。我怀疑一个通用的会计软件包(可以定制为许多不同的系统)将允许我们列出所有选项,因为我相信它们都在会计领域的不同部分中使用。 - Jonathan Leffler

2

这两种选择对你未来有什么后果?例如,您想获得多个折扣还是非常特定的折扣?如果每张发票只有一个折扣,那么我不会让它变得更加复杂。在我看来,把它放在发票表格中会更容易和清晰 - 把它作为负项目会使项目的处理更加困难。


1
我同意你的回答。当时客户决定可能想在未来享受多个折扣,因此我不得不使用商品方法。 - redmoon7777

2

我完全同意尽可能简化,但需要考虑的一件事是是否有任何项目应该免除折扣?在这种情况下,您需要在详细信息中添加一个布尔字段,以记住哪一行应该享受折扣。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接