数据库设计/ERD图验证

Database design/ ERD diagram verification

如果您能看一下我的与描述相关的 ERD 图,我将不胜感激:

Database contains persons records (since 1900). Each person can have mother and/or father. Women can have one husband and men can have one wife. Persons work in companies, which contain name and one chairman. One person can work in one or more companies, employe on mandatory contract or employment contract.

示例查询是: 找出拥有最多孙辈的人(姓名和姓氏)。

及以下是我的 ERD 图,但我不确定 mother/father 和 wife/husband 部分。

提前致谢

您的 "ERD" 虽然通常这样称呼,但实际上是 table 图。正确的 ER 图必须能够表示 ER 模型,这意味着它应该能够表示其他事物之间的三元和更高关系。我建议使用 Chen 的 ER 图表示法。这并不意味着我反对 table 图 - 它们只是用于不同的目的。概念模型的 ER 图,物理模型的 table 图。在它们之间是逻辑模型的关系图。

您的图表也没有很好地实现给定的描述。考虑一下“每个人都可以有一个母亲and/or父亲”。您的 relationship table 允许 person 与多个 relationship_types 相关联,但它不会在父角色和子角色中关联两个 persons。更好的方法可能是让 fathermother table 具有引用 person_idparent_idchild_id 字段,或者单个 parent table 具有 parent_id, child_id, relationship_type 个字段。

对于已婚人士,您可以使用 table 和 husband_id, wife_id 字段。与 fathermother table 一样,这不能确保每个角色中只记录匹配性别的人。在这两种情况下都可以通过为 person 的性别创建不相交的子类型 table 来强制执行此操作。但是,这并不常见(如今,数据模型的灵活性更可能被视为优势而不是问题),我怀疑这对您的项目来说可能是过大的杀伤力。

就业模型更好。我看到的主要问题是 agreement_typeemployment_condition 之间的一对一关联。我假设 agreement_type 是为了记录 mandatory contractemployment contract。但是,对于一对一关联,您不能有两个或更多具有 mandatory contract 的员工。我相信每个 agreement_type 应该可以用于多个 employment_conditions.

我也很关心 employment_condition 的键。 condition_idagreement_name 都表示为外键(橙色)和主键的一部分(键图标)。 condition_id 指的是什么,为什么包含在 PK 中?我希望 person_id, company_id 的组合足以识别公司与员工之间的多对多关系。

同样,company中的person_id也包含在PK中。根据给定的描述,我预计 company_id 将同时确定 name 和主席 (person_id)。顺便说一句,我建议您将该字段的名称更改为 chairperson_id 以更具描述性。想象一下,如果我们有更多的人担任不同的角色——我们不能称每个字段为 person_id,对吧?根据角色而不是域来命名字段通常更有用,尽管这两者通常是一致的。