我有两种常规类型的“用户”,Person
和Page
。他们可以执行相同的操作(投票,评论,发布等),但它们具有本质上不同的信息。简而言之,Person
有first_name
,last_name
,gender
和birthday
。 Page
有title
,description
和basic_info
。
Person和Page都可以在整个系统中执行相同的操作,因此在设计数据库模式时,我认为有必要将所有内容与中央id
列相关联。否则,我认为系统的复杂性会急剧增加(尽管我说这个可能不正确。)
鉴于此,我想有一个“映射”表。例如,我们调用此表Map
。 Map
有一个id
(所有内容都由中心ID标识),destination_id
(个人或网页的ID,具体取决于下一列...)和{ {1}}(人或页面)。
例如,如果type
是“Person”,我知道要查看User表,如果type
是“Page”,我知道要查看Page表以获取必要的信息。
我对这种设计不满意,因为它引入了“两用外键”。 - 我在type
表中有一个“外键”,可以引用任意数量的其他表。
我如何重构这个以便我可以:
可能的替代方法:在Map
表中有两列,Map
和page_id
,这两列都是实际的外键,但只有一列不为空。无论哪个不为null,显然都是正确的user_type信息(页面或人物)的真正外键。
这似乎是中等合理的,但它并不一定能满足我的第一个条件,因为它“干净利落”,而且看起来相当笨重。
我该如何重构这个?
答案 0 :(得分:1)
我会删除映射表,将Type列移动到User表,并在Person表和Page表上引用外键列,这些列引用User表上的主键。