【问题标题】:Database design: Custom fee/billing charge rates数据库设计:自定义费用/计费费率
【发布时间】:2011-06-10 04:47:52
【问题描述】:

用户可以有自定义的计费费率,这可能因用户而异。

您很可能有一个默认的账单费用表,看起来像这样

FEE
Id
FeeTypeId
FixedCharge
VariableCharge

当您向客户收费时,您可能会向他们发送发票等,然后您有一个表格来存储可能看起来像这样的计费/收费金额!

USER_TRANSACTION_CHARGE
Id
UserId
FeeId
ChargeName
ChargeAmount
DateTime

您如何设计每个特定用户的自定义计费费率?

【问题讨论】:

  • USER_TRANSACTION_CHARGE 似乎没有最佳安排。如果可变费用/固定费用存储在费用中,并且 U_T_C 中的条目本质上包含一项费用……那么您为什么还要将 ChargeAmount 也存储在那里。如果 U_T_C 代表费用表中的多个条目,那将是有意义的。
  • 不!,收费金额是收费金额,在 FEE 表中您可能有固定收费 $0.50 和可变收费 1%,购买项目为 $100.00 然后在 USER_TRANSACTION_CHARGE 中,收费金额为 $100x0。 01%+0.50 美元 = 1.50 美元。如果购买项目为 $500,则“ChargeAmount”为 $5.50

标签: c# sql-server sql-server-2005 sql-server-2008 database-design


【解决方案1】:

您的 FEE 表似乎没有任何历史记录。能够在 7 或 10 年前开具发票是一项常见的法律要求。 FEE 记录可以更改,那么这对发票表中的链接(feeid)有什么影响?

FEE: Id, FeeTypeId, FixedCharge, VariableCharge
USER_FEE: Id, UserId, FeeTypeId, FixedCharge, VariableCharge

您可以创建一个“覆盖”特定用户的 FEE 表的 USER_FEE 表。因此,对于每个给定的 FeeTypeId,用户可能在 USER_FEE 中有一个叠加层,或者可能只是回退到 FEE。

至于 USER_TRANSACTION_CHARGE,我严重挑战其中的链接列 FeeId,除非您维护针对 FEE 的历史记录,FeeId + DateTime 将链接到该列。我会把那张桌子扔到只是

Id, UserId, ChargeName, ChargeAmount, DateTime

我假设 ChargeName 以某种方式与 FeeTypeId 相关联? ChargeAmount 是从 Fixed/VariableCharge 中得出的任何值

因此,从本质上讲,(USER_)FEE 表用于查找值,但除此之外,它们被存储为没有反向链接到 (USER_)FEE 表的值,因为这似乎是一个简单的系统,没有版本控制。

【讨论】:

  • 有趣,您提出了版本控制/历史记录这一点很好。出于法律原因,也需要这样做!为此,只需在 FEE 和 USER_FEE 表中添加“DateTime”字段,然后获取 FeeType 的最新 DateTime,即可解决!
  • 法律要求是您可以如实复制发票。至于收费的基础......它不那么僵化,所以你可以在不知道创造收费的历史“公式”的情况下逃脱。是的,版本化的 FEE 表(Id、DateTime、FeeTypeId)将允许您使用最后 2 个进行查找(datetime desc)和第一个作为 USER_TRANSACTION_CHARGE 中的链接。
【解决方案2】:

保留默认费用表并添加交叉引用列表用户、费用类型和覆盖。在计费时确定费用(http://database-programmer.blogspot.com/2008/04/advanced-table-design-resolutions.html)该博客条目实际上使用了计时系统作为示例,接近你正在做的事情。

谨防错误的标准化 - 我的意思是您应该实现实际费用并将其永久保存在发票上。这是因为在创建发票时,实际收取的费用已成为交易的历史事实,因此将其保存为非规范化。外键仅用于识别项目/活动/费用类型,并非用于获取费用,费用保存在发票上并永久保存。

【讨论】:

    【解决方案3】:

    默认费用应该与实际收取的费用无关,因此 User_Transaction_Charge 必须丢失 FeeID 外键。

    如果您需要存储用于生成 User_Transaction_Charge 的组件,请将它们存储在 Charge 中或作为单独的实体。

    DEFAULT_FEE
    Id
    UserId
    FeeTypeId
    FixedCharge
    VariableCharge
    

    和

    USER_TRANSACTION_CHARGE
    Id
    UserId
    ChargeName
    ChargeAmount
    DateTime
    
    USER_TRANSACTION_CHARGE_FEE
    Id
    UserTransactionChargeId
    FixedAmount
    VariableRate
    

    或

    USER_TRANSACTION_CHARGE
    Id
    UserId
    ChargeName
    ChargeAmount
    FixedAmount
    VariableRate
    DateTime
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-12
      • 2021-10-03
      • 2016-01-24
      • 1970-01-01
      • 1970-01-01
      • 2017-11-26
      • 2015-11-03
      相关资源
      最近更新 更多