Database design 如何实施计费系统

Database design 如何实施计费系统,database-design,business-logic,billing,application-design,web-application-design,Database Design,Business Logic,Billing,Application Design,Web Application Design,我在数据库中有两个集合收入基金和支出基金: income_funds timestamp amount status (not confirmed, confirmed, refunded) expenditure_funds timestamp amount 我需要得到经常账户余额,并得到关于使用的报告。如何更好地使用此集合实现计费逻辑 最简单的方法(无附加数据): 获取账户余额sum(已确认收入\资金)-sum(支出\资金) 获取报告按期间获取收入

我在数据库中有两个集合
收入基金
支出基金

income_funds
    timestamp
    amount
    status (not confirmed, confirmed, refunded)

expenditure_funds
    timestamp
    amount
我需要得到经常账户余额,并得到关于使用的报告。如何更好地使用此集合实现计费逻辑

最简单的方法(无附加数据):
  • 获取账户余额
    sum(已确认收入\资金)-sum(支出\资金)
  • 获取报告按期间获取收入和支出资金
  • 但我不喜欢这样,我必须一直计算账户余额

    添加帐户集合: 我将添加
    帐户
    集合:

    account
        balance
    
    period
        is_closed (yes, no)
        start_timestamp
        end_timestamp
        start_balance
        end_balance
    
  • 要获取帐户余额,只需获取帐户。余额
  • 按前面的方法获取报表
  • 但我不喜欢在任何资金发生变化(增加或改变状态)时,我必须随时改变余额。为了核实账户余额,我必须按照第一种方法计算所有资金。如果我犯了错误,我将不知道它是如何以及何时发生的

    添加期间集合: 我将添加
    期间
    集合:

    account
        balance
    
    period
        is_closed (yes, no)
        start_timestamp
        end_timestamp
        start_balance
        end_balance
    
  • 要获取帐户余额,请返回上次
    期间。结束\u余额
  • 按照前面的方法获取报告,但很容易按时段获取时间戳
  • 我必须随时更改
    期末余额
    。但我可以按时期核实余额,如果有错误,我会知道这是在这个时期发生的



    最后一种方法最喜欢我,但也许有人可以在我的结论中给我建议,或者知道其他解决方案。

    我想我已经在我的项目中使用了所有3种方法。根据项目的范围和可能性,您可以决定走哪条路

    如果您的数据库支持触发器,那么您可以使用单独的余额表,并在您的*资金表中使用更新/插入/删除触发器来更新余额表中的数据。这确保了无论数据如何变化,您的余额始终是正确的。我建议使用此选项

    如果你没有大量的数据,也不需要经常计算余额,那么你可以重新计算总数。依我看,将流入和流出的资金存储在一个表中会使事情变得更容易一些。添加指示交易方向的额外字段(交易)(1表示传入,1表示费用)。然后你就可以通过这样做来获得平衡

    SELECT SUM(amount*transaction) from funds
    

    第三,我在以前将数据存储在每月文件中时,使用了定期结余的选项。每当创建新文件时,第一条记录就是从上月数据现场计算的期初余额。我还提供了在上个月数据发生变化的少数情况下重新计算余额的可能性。当用户非常清楚自己在做什么时,这就行了——例如,在会计系统中,会计知道他需要重新计算余额。

    我认为您的设计有点问题。我会提出一些不同的建议(这里非常简单,请注意,我专业地构建会计软件):

    然后,您要做的是在日记账条目上设置一个触发器,使得此处的任何条目事务日期早于max(account\u checkpoint.end\u date)被拒绝。通过这种方式,您可以从上一个关闭的期间向前滚动,并通过打开的期间向前滚动。这使得报告变得更加容易,并将实际需要汇总的内容最小化


    也可以为时段添加其他检查点表,因此,如果业务需要,您可以更频繁地关闭AR而不是AP,反之亦然。这样,检查点既可以作为结束点,也可以作为向前滚动生成报告的点。

    只是一个旁注:不要调用时间戳“datetime”,与模块“datetime”一起使用时可能会导致问题。我的建议是将它们命名为“时间戳”。