进销存数据库设计

red*_*777 3 database database-design invoice discount

几天前我创建了一个处理发票的应用程序.我想知道如何最好地将折扣整合到我的发票中.我应该将其作为否定项目(在invoice_items表中)或者我应该在发票表中创建"折扣"列吗?

Boh*_*ian 6

我会把它作为一个负值的项目.原因是:

  • 通过开发票,计算值永远保持不变是非常重要的; 即使您的计算公式稍后更改,您也可以正确地再现任何给定的发票.如果当时错误地计算了值,那就更是如此- 它就是这样.
  • 拥有一个价值金额意味着可以轻松处理特殊情况的人工调整 - 例如,您的营销经理/会计师可能决定因延迟交付而给予100美元的一次性折扣.这是微不足道的负值 - 只需添加另一行,但折扣率很难/麻烦
  • 每张发票可以有多个折扣金额
  • 它非常灵活 - 它有自己的存在空间,无论它需要什么.事实上,我会打折另一个"产品"(甚至可能是多个产品 - 每个不同的折扣原因一个,例如圣诞节,优惠券,推荐等.
  • 使用自己的项目,您可以像任何其他"产品"一样添加原因描述 - 例如"支付现金的10%折扣"或其他
  • 您不需要任何特殊代码或数据库列!只需按照以前的总项目将其打印在发票上."没有勺子(折扣)":这只是另一个项目 - 可能比没有代码/数据库更改更简单吗?
  • 并非所有项目都应打折 - 例如退款,退货,订阅(如果适用).它变得太复杂,没有必要在数据库中表示折扣的业务逻辑.将计算等保留在应用程序代码中,将结果存储在db中
  • 拥有自己的项目意味着计算可以是任意复杂的.这意味着随着复杂性的增加,无需维护数据库 维护/修改代码要比维护/修改数据库容易得多
  • 最后,我成功构建了一个发票系统,我采用了"项目"方法,它运作得非常好

  • +1,但只是.这里有很多好处,但我不确定我是否同意整个结论.这可能取决于开具发票的行业.发票的稳定性是关键点; 这可能是通过确保价格数据(特别是产品说明等)在发票开具时准确(可能是通过将产品表中的相关数据复制到发票项目表中,或类似的东西)来处理的).对于像一次性100美元的折扣这样的"特殊产品代码"是可以的.[...继续...] (2认同)