多余的外键?

时间:2012-03-19 15:41:42

标签: mysql sql

我目前正在开发一个具有以下要求的数据库:有不同类型的帐户。他们可以根据类型有不同的付款计划。整个事情就像是一个有两个层次的层次结构。例如,如果帐户类型为A和B,则付款计划可以是A1,A2,B1和B2,其中Ax仅对帐户类型A有效,依此类推。

到目前为止,我有以下设置: 表格 account_types ID 名称。表格 payment_plans 包含 account_type_id ID ,两者都是PK的一部分。表格帐户 type_id plan_id 。我猜很明显是什么引用了什么。

我的问题是: accounts.type_id 是FK, accounts.type_id + accounts.plan_id 是复合FK。我不知道这是否是最佳解决方案。 type_id 有点多余,因为它由 plan_id 隐式定义,但仅限于 payment_plans 表中的约束。那么这里最好的做法是什么?我可以完全摆脱 type_id ,但是接下来需要另外加入 payment_plans 表来确定帐户的类型。

感谢您提前输入。也欢迎涉及完全不同结构的建议。 ; - )

1 个答案:

答案 0 :(得分:0)

我会有这些表格:

  • account_types
    • id:PK
    • name
  • payment_plans
    • id:PK
    • account_type_id:FK到account_types
  • accounts
    • 帐户需要的任何列
  • accounts2payment_plans
    • account_id:FK到accounts和PK的一部分
    • payment_plan_id:FK到payment_plans和PK的一部分

这背后的原因如下:

  1. 每种帐户类型都可以有多个付款方案,因此payment_plans表需要引用account_type表。通过此参考,定义了付款计划的类型。
  2. 每个帐户可以有多个付款方案,但每个付款方案可以由多个帐户使用,这就是需要映射表accounts2payment_plans的原因。通过从帐户到付款计划的映射,隐式定义帐户的所有帐户类型。
相关问题