类能否继承两个不同类?多身份类及对应数据库设计方案咨询
最优解决方案:采用角色关联模式替代多层继承
你之前考虑的新增4个组合类的方案本质是类爆炸问题,完全可以通过调整表关联逻辑避免,具体方案如下:
第一步:调整表结构,统一以Person为根实体
所有身份都直接绑定到Person主体,不要做多层继承:
- 保留
Person表作为基础表,存储所有人的公共属性(Id、Name、Email),Id为主键 - 给
Teacher表新增PersonId字段,作为外键关联Person.Id,存储拥有教师身份的人的专属属性(教职工号等) - 保留
Student表现有结构(已有PersonId外键),存储学生身份的专属属性 - 给
Doctor、Patient表各新增PersonId字段,作为非空外键关联Person.Id,满足你要求的「Doctor/Patient必然属于Person」的约束,存储两类角色的专属属性
第二步:通过多表关联实现身份组合
不需要新增任何组合类,4种身份组合直接通过关联查询实现:
- 「Person > Teacher > Doctor」:关联Person、Teacher、Doctor三张表,匹配同一个PersonId即可
- 「Person > Teacher > Patient」:关联Person、Teacher、Patient三张表
- 「Person > Student > Doctor」:关联Person、Student、Doctor三张表
- 「Person > Student > Patient」:关联Person、Student、Patient三张表
举个查询教师身份医生的SQL示例:
SELECT p.*, t.TeacherNumber, d.DoctorNumber FROM Person p INNER JOIN Teacher t ON p.Id = t.PersonId INNER JOIN Doctor d ON p.Id = d.PersonId
方案优势
- 无类爆炸问题:后续新增任何身份(比如行政人员、访客)只需要新增一张对应身份表,不需要新增N多组合类
- 灵活性极强:支持同一个人同时持有任意多个身份,比如在读博士同时有学生、教师、患者三个身份也能直接支持
- 冗余度极低:公共属性只在Person表存一次,各身份的专属属性独立存储,没有重复数据
可选优化(提升查询性能)
如果需要频繁判断某个人持有哪些身份,可以新增一张PersonRole中间表,字段为PersonId、RoleType(枚举值:1=学生、2=教师、3=医生、4=患者),查询身份时直接读取该表即可,不需要关联所有身份表。
内容的提问来源于stack exchange,提问作者KaasGierInFrankrijk
相关产品推荐
相关产品推荐

