数据库设计/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
。更好的方法可能是让 father
和 mother
table 具有引用 person_id
的 parent_id
和 child_id
字段,或者单个 parent
table 具有 parent_id, child_id, relationship_type
个字段。
对于已婚人士,您可以使用 table 和 husband_id, wife_id
字段。与 father
和 mother
table 一样,这不能确保每个角色中只记录匹配性别的人。在这两种情况下都可以通过为 person
的性别创建不相交的子类型 table 来强制执行此操作。但是,这并不常见(如今,数据模型的灵活性更可能被视为优势而不是问题),我怀疑这对您的项目来说可能是过大的杀伤力。
就业模型更好。我看到的主要问题是 agreement_type
和 employment_condition
之间的一对一关联。我假设 agreement_type
是为了记录 mandatory contract
和 employment contract
。但是,对于一对一关联,您不能有两个或更多具有 mandatory contract
的员工。我相信每个 agreement_type
应该可以用于多个 employment_conditions
.
我也很关心 employment_condition
的键。 condition_id
和 agreement_name
都表示为外键(橙色)和主键的一部分(键图标)。 condition_id
指的是什么,为什么包含在 PK 中?我希望 person_id, company_id
的组合足以识别公司与员工之间的多对多关系。
同样,company
中的person_id
也包含在PK中。根据给定的描述,我预计 company_id
将同时确定 name
和主席 (person_id
)。顺便说一句,我建议您将该字段的名称更改为 chairperson_id
以更具描述性。想象一下,如果我们有更多的人担任不同的角色——我们不能称每个字段为 person_id
,对吧?根据角色而不是域来命名字段通常更有用,尽管这两者通常是一致的。
如果您能看一下我的与描述相关的 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
。更好的方法可能是让 father
和 mother
table 具有引用 person_id
的 parent_id
和 child_id
字段,或者单个 parent
table 具有 parent_id, child_id, relationship_type
个字段。
对于已婚人士,您可以使用 table 和 husband_id, wife_id
字段。与 father
和 mother
table 一样,这不能确保每个角色中只记录匹配性别的人。在这两种情况下都可以通过为 person
的性别创建不相交的子类型 table 来强制执行此操作。但是,这并不常见(如今,数据模型的灵活性更可能被视为优势而不是问题),我怀疑这对您的项目来说可能是过大的杀伤力。
就业模型更好。我看到的主要问题是 agreement_type
和 employment_condition
之间的一对一关联。我假设 agreement_type
是为了记录 mandatory contract
和 employment contract
。但是,对于一对一关联,您不能有两个或更多具有 mandatory contract
的员工。我相信每个 agreement_type
应该可以用于多个 employment_conditions
.
我也很关心 employment_condition
的键。 condition_id
和 agreement_name
都表示为外键(橙色)和主键的一部分(键图标)。 condition_id
指的是什么,为什么包含在 PK 中?我希望 person_id, company_id
的组合足以识别公司与员工之间的多对多关系。
同样,company
中的person_id
也包含在PK中。根据给定的描述,我预计 company_id
将同时确定 name
和主席 (person_id
)。顺便说一句,我建议您将该字段的名称更改为 chairperson_id
以更具描述性。想象一下,如果我们有更多的人担任不同的角色——我们不能称每个字段为 person_id
,对吧?根据角色而不是域来命名字段通常更有用,尽管这两者通常是一致的。