2011-12-28 213 views
3

我前几天创建了一个处理发票的应用程序。我想知道如何最好地将折扣与我的发票相结合。我应该将其作为负项目(在invoice_items表中)还是应在发票表中创建“折扣”列?发票数据库设计

+0

什么这些选择对你来说会有什么后果?例如,您想要多次折扣还是以后特别打折? – Pelshoff 2011-12-28 20:13:21

+0

感谢您的快速回复。每张发票只会有一个折扣。 – redmoon7777 2011-12-28 20:25:18

+1

如果每张发票只有一个折扣,那么我不会让它变得比需要更复杂。 – Pelshoff 2011-12-28 20:27:19

回答

6

我将它作为一个负值项目。原因是:

  • 随着开具发票,这是非常重要的是,计算值永远保持永恒;即使您的计算公式稍后发生变化,您也可以正确复制任何给定的发票。如果这个值是不正确的在这个时候计算出来的 - 这是真的。
  • 具有值量意味着对于特殊情况下手动调整很容易处理 - 例如,你的营销经理/会计师可能决定放弃,因为延迟交货的100 $一折的折扣。这是微不足道的价值 - 只需增加一行,但很难/打折折扣
  • 您可以有多个折扣金额每张发票
  • 它是完全灵活的 - 它有自己的空间来存在和无论它需要是。事实上,我会做折扣的另一个“副产品”(甚至多个产品 - 一个为每个不同的折扣原因,如圣诞节,优惠券,转诊等
  • 凭借自己的项目,你可以添加一个原因说明就像任何其他“产品” - 如:或什么
  • 你不需要任何特殊代码或数据库列“现金支付10%的折扣”就总笔数达和以前一样把它们打印在发票上“没有勺子(折扣)“:?这只是一个行项目 - 什么比这更简单的比需要的任何代码/ DB变化
  • 并非所有的项目应该被忽略 - 如退款,退货,订阅(如果适用)它变得太复杂,没有必要在数据库中表示折扣的商业逻辑,保留计算等在应用程序代码中,将结果存储在分区中拥有自己的项目意味着计算可以任意复杂。这意味着随着复杂性的增长,不需要维护数据库。这一大堆的更易于维护/修改代码比它是维持/改变数据库
  • 最后,我成功地建立了一个进销存系统,我就拿“项目”的方式,它真的很好
+2

+1,但只是只是。这里提出了很多优点,但我不确定我是否同意整个结论。这可能取决于开具发票的行业。发票的稳定性是一个关键点;这可能会通过确保价格数据(尤其是产品描述等)在发票时刻准确无误(可能通过将相关数据从产品表中复制到发票项目表中)或类似的东西来处理)。对于诸如一次性100美元折扣之类的东西,具有“特殊产品代码”是可以的。 [...继续...] – 2012-01-01 02:50:07

+0

[...延续...]但是,我认为仅仅通过特殊项目来处理折扣是错误的;该项目通常有折扣,并且可以与项目一起记录为百分比或金额。如果有整体折扣,可以用主发票记录。在这两种情况下,都不需要NULL来记录没有折扣;零值通常是合适的默认值(除非确实是列表价格是例外)。 – 2012-01-01 02:52:58

+0

@JonathanLeffler你提出了很好的观点。如果有很多折扣,那么也许你是对的。然而,当列被定义但很少使用,即当折扣不是标准时,最终会得到“稀疏”数据,这对我来说是一个“红旗”设计。 – Bohemian 2012-01-01 10:05:39

2

这些选择对你来说会有什么后果?例如,您想要多次折扣还是以后特别打折?如果每张发票只有一个折扣,那么我不会让它变得比需要更复杂。在我看来,将它放在发票表中会更容易和更清楚 - 我认为,将其作为负项目会使物品的处理更加困难。

+1

我同意你的答案,当客户决定他可能想要多次折扣时,我即将这样做。因此我必须使用项目方法。 – redmoon7777 2012-01-02 04:22:47

+0

很好,你问这个问题,做得好:) – Pelshoff 2012-01-02 19:05:03

2

我使其尽可能简单完全同意,但有一点要考虑的是,如果任何项目应该从折扣免征?在这种情况下,您需要在细节中添加一个布尔字段来记住哪一行应该有折扣。