TN_OUSL Asked: 2021-11-30 05:15:36 +0800 CST2021-11-30 05:15:36 +0800 CST 2021-11-30 05:15:36 +0800 CST ERD - 如何将属性添加到递归关系的一侧? 772 ERD 的简化方案 一家公司有员工(每个人都有唯一的 id emp_id) 每个员工都由另一名员工监督 主管员工具有特殊属性SID 这是我的场景和员工表的 ERD。但问题是每个不是主管的员工都会有一个不必要的SID列NULL。我觉得应该有另一张桌子emp_id和他/她SID来解决这个问题。为此,我该如何修改 ERD? erd 2 个回答 Voted Gerard H. Pille 2021-11-30T08:35:55+08:002021-11-30T08:35:55+08:00 您创建一个主管实体。它与员工具有相同的标识。每个主管都是员工,员工可以是主管。在数据模型中,主管的 ID 是对应员工的外键。 Best Answer David Spillett 2021-11-30T08:51:38+08:002021-11-30T08:51:38+08:00 对于像这样的简单情况,对于非主管,我只会将列保留为 NULL。 对于更复杂的实体,请查看遵循以下模式的单表继承: Entity SubType1 =========== ================ Id (PK) <---- Id (PK,FK) SharedProp1 | ST1SpecificProp1 SharedProp2 | ST1SpecificProp2 SharedProp3 | ... ... | | SubType2 | ================ `-- Id (PK,FK) ST2SpecificProp1 ... 所有常见的属性都放在基表中,特定于子类型的属性(在您的示例中,主要类型是人员,子类型是主管和其他)。 共享表中也可能有一个鉴别器属性,它说明当前记录的子类型。 许多 ORM 使用此模型来管理子类型。一些数据库系统具有内置支持(IIRC postgres 通过可选模块提供),但自己组装起来并不难。
您创建一个主管实体。它与员工具有相同的标识。每个主管都是员工,员工可以是主管。在数据模型中,主管的 ID 是对应员工的外键。
对于像这样的简单情况,对于非主管,我只会将列保留为 NULL。
对于更复杂的实体,请查看遵循以下模式的单表继承:
所有常见的属性都放在基表中,特定于子类型的属性(在您的示例中,主要类型是人员,子类型是主管和其他)。
共享表中也可能有一个鉴别器属性,它说明当前记录的子类型。
许多 ORM 使用此模型来管理子类型。一些数据库系统具有内置支持(IIRC postgres 通过可选模块提供),但自己组装起来并不难。