【问题标题】:Database design for handling individual and recurring charges用于处理个人和经常性费用的数据库设计
【发布时间】:2012-07-19 01:53:45
【问题描述】:

我们有一个计费系统,我们可以在其中处理个别费用以及经常性费用(订阅)。

有两个SQL表:

StandardCharges
RecurringCharges

StandardCharges 表包含客户在当月购买的各个项目。

RecurringCharges 表包含按日期收费的经常性项目。到时候我们的系统会自动创建一个重复请求,该请求会在 StandardCharges 表中添加一行,并在 RecurringCharges 表中按日期将费用增加到下个月。

在每个月底,我们从 StandardCharges 表中获取每个客户的总价值并创建发票。

有没有一种设计模式或其他方式来做到这一点?这是正确的数据库设计吗?理想情况下,我想将所有费用保存在一个 Charges 表中,并从那里管理经常性费用?

谢谢

【问题讨论】:

  • 介意提供更多关于您正在建模的内容吗?

标签: c# sql design-patterns database-design sql-server-2008-r2


【解决方案1】:

我怀疑你的设计确实是正确的。

在考虑现实世界中的数据时,将“可能的”交易(即尚未发生且可能无法实现的交易,可能是因为客户已超出其信用额度)与已承诺的交易混在一起是没有意义的和实际交易。

将数据合并到单个表中也会使报告变得困难,因为您必须应用特殊的过滤条件并存储额外的元数据 - 例如 TransactionCompleted 和 TransactionIsFutureCharge。

如果我要提出建议,我会将 StandardCharges 重命名为更接近它所拥有的数据的名称,例如 CompletedTransactionsRecurringTransactions,例如 PendingTransactions

【讨论】:

  • 我投票保留第二个表名并按照建议更改第一个。
  • @ErikE,我对名称进行了辛勤工作,但认为挂起的交易在命名(未来、重复、OnEvent 等)方面提供了更多的灵活性,而不是经常性费用。如果没有更多上下文,很难说任何一种方式。
  • 待定意味着每次收费一行,不需要重复信息。它是一个模板,而不是仅仅等待的实际费用。
  • 可能是预定交易?
【解决方案2】:

目前的设计对我来说似乎是合理的。但是,如果您想合并这两个表,您可以简单地添加一个名为 IsRecurring 或 IsFuture 或 IsScheduled 的 BIT 列,或者您想使用的任何内容来指定本应在 RecurringCharges 中出现的费用。然后,当您的到期日因经常性费用而被击中时,您只需插入同一个表而不是不同的表。至于发票,您只需在查询中添加一个条件以过滤掉设置了 BIT 列的费用。

【讨论】:

  • 我不同意他们可以合理地在同一张桌子上。这没有充分的理由使事情复杂化。
猜你喜欢
  • 1970-01-01
  • 2020-05-14
  • 2015-11-03
  • 2011-07-03
  • 2019-05-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-05
  • 2011-06-29
相关资源
最近更新 更多