database - 发票数据库设计

标签 database database-design invoice discount

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

最佳答案

我会把它当作负值元素。原因是:

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

关于database - 发票数据库设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8660733/

相关文章:

javascript - 操作 MongoDB 中引用数组中元素的顺序

c# - IDENTITY_INSERT 设置为 OFF - Visual Studio

C# 应用程序 - 在数据库或配置文件中存储首选项?

database-design - 数据库用户和组模型

c++ - 想要在发票程序中使用 while 或 for 循环将字符串项与 C++ 中的整数值匹配

iphone - 使用新文档支持 API 的 iOS 应用程序到应用程序数据传输

ORACLE - 将程序/包导出到文件

mysql - 使用可选列正确规范化数据库

variables - 每月向用户收取可变费用

php - 使用 PHP 将 "jQuery Editable Invoice"的值提交到 MySQL DB