数据库设计:定制费用表

时间:2012-02-27 07:27:29

标签: database database-design

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

选项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

3 个答案:

答案 0 :(得分:1)

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

否则,

  • 使用单个表,它必须进行表扫描才能获得WHERE UserID为空
  • 使用两个表,当它们真正逻辑上存储相同的数据时,你必须将它们分开但仍然是同步的

答案 1 :(得分:0)

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

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

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

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

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

答案 2 :(得分:0)

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

额外的改进 - 考虑在费用中添加有效期限和到期日,以便在定制费用有效时很容易找到,并允许在特定时间段内使用额外费用