【问题标题】:Database design: Custom fee table数据库设计:自定义费用表
【发布时间】:2012-02-27 07:27:29
【问题描述】:

您会为自定义费用表的数据库选择哪种设计?为什么?

选项1)1表,UserId判断用户是否有自定义费用

ACCOUNT_FEE
TypeId
FixedRate
VariableRate
CurrencyId
UserId (UserId is null for default account fee, UserId is present for custom fee)

选项 2) 2 个单独的表格,一个用于默认费用,另一个用于用户自定义费用

ACCOUNT_DEFAULT_FEE
TypeId
FixedRate
VariableRate
CurrencyId

USER_ACCOUNT_FEE
TypeId
FixedRate
VariableRate
CurrencyId
UserId

【问题讨论】:

  • “Userid”对于每个用户来说都是唯一的,如果是这样,它怎么可能是空的,你将如何区分用户

标签: database database-design


【解决方案1】:

我会做不同的事情。创建一个名为“Default Account”的用户并为其指定一个特定的 ID,甚至是“0”(可能需要 identity_insert)。这允许表格遵循参照完整性规则并且 UserID 上的索引可以快速挑选出默认帐户费用。

否则,

  • 使用单个表,它必须进行表扫描才能获取 WHERE UserID 为空
  • 使用两个表,当它们实际上只是在逻辑上存储相同的数据时,您必须将它们分开但保持同步

【讨论】:

  • 或者可以只添加一个标志“IsSystem”(真)作为默认值,假是用户的自定义费用。
  • 这不是一个好主意。如果你不索引它,你会遇到同样的问题。如果您对其进行索引,它实际上将毫无用处 - 每当添加新的客户特定费用时,索引页面会经常拆分,因为索引只有 2 个分支,另一个分支将保存 N-1 个键,N 是总记录数。
【解决方案2】:

我会选择第一个设计,原因如下:

  1. 随着设计的发展,无需更改两个表。

  2. 一个表只需要前端 CRUD 代码。

  3. 获取客户“正确”的特定类型费用很简单:

    SELECT TOP 1 * FROM ACCOUNT_FEE
    WHERE  
      (UserId=333 OR UserId IS NULL)
      AND TypeId=2
    ORDER BY UserId DESC
    

【讨论】:

    【解决方案3】:

    我建议自定义费用使用单表方法,这意味着您可以根据需要添加更多自定义费用。

    一项额外的改进 - 考虑在费用中添加有效和到期日期,以便轻松找出自定义费用何时有效并允许在特定时间段内使用额外费用

    【讨论】:

      猜你喜欢
      • 2011-06-10
      • 1970-01-01
      • 1970-01-01
      • 2012-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-20
      • 1970-01-01
      相关资源
      最近更新 更多