如何使用两用外键重构数据库模式

时间:2014-05-07 01:14:09

标签: sql database

我有两种常规类型的“用户”,PersonPage。他们可以执行相同的操作(投票,评论,发布等),但它们具有本质上不同的信息。简而言之,Personfirst_namelast_namegenderbirthdayPagetitledescriptionbasic_info

Person和Page都可以在整个系统中执行相同的操作,因此在设计数据库模式时,我认为有必要将所有内容与中央id列相关联。否则,我认为系统的复杂性会急剧增加(尽管我说这个可能不正确。)

鉴于此,我想有一个“映射”表。例如,我们调用此表MapMap有一个id(所有内容都由中心ID标识),destination_id(个人或网页的ID,具体取决于下一列...)和{ {1}}(人或页面)。

例如,如果type是“Person”,我知道要查看User表,如果type是“Page”,我知道要查看Page表以获取必要的信息。

我对这种设计不满意,因为它引入了“两用外键”。 - 我在type表中有一个“外键”,可以引用任意数量的其他表。

我如何重构这个以便我可以:

  1. 最好允许添加其他user_types(例如,Person,Page,然后是Group)
  2. 摆脱那个两用外键
  3. 可能的替代方法:在Map表中有两列,Mappage_id,这两列都是实际的外键,但只有一列不为空。无论哪个不为null,显然都是正确的user_type信息(页面或人物)的真正外键。

    这似乎是中等合理的,但它并不一定能满足我的第一个条件,因为它“干净利落”,而且看起来相当笨重。

    我该如何重构这个?

1 个答案:

答案 0 :(得分:1)

我会删除映射表,将Type列移动到User表,并在Person表和Page表上引用外键列,这些列引用User表上的主键。