将两个映射表映射在一起?
Mapping two mapping tables together?
我正在尝试设计一个复杂的数据库,但我有几个问题。
1:将两个映射 table 映射在一起有什么不对吗?不管是什么原因,我都在试图找出它是否反对规范化或最佳实践。
2:如何改进或避免像附图中那样将两个映射 table 映射在一起?
规则:
Course
- 包含每门课程(我们进行的培训)
课程可以有更多类型,类型存储在courseType
table
课程总会有更多类型的人(存储在people
table),每个人都会有一个角色(角色存储在role
table.
有些课程只接受某些类型的角色,这就是为什么我做了 courseTypes_has_roles
table。
people_has_role
table 被映射,这样我就可以看到哪个 people
可以是哪个 role
对于哪个 course
类型。
course_has_people_has_roles
是 people
分配给每个 course
的 role
的映射。重要的是要知道,有些人可以在一种课程中扮演更多角色,但他们在每门单独的课程中只会扮演一个角色。
我试图避免的事情:我不想具体说明每个人在 course
table 中的角色,因为会有人被分配角色但他们没有尚未属于任何课程。
你的设计没有问题。 Course_has_people_has_roles 似乎意味着 "person P is assigned role R for course C" 而 People_has_role 似乎意味着 "person P may be assigned role R"。这是两个不能从对方推导出来的关系。但是前者中的每一个P-R子行都必须出现在后者中,所以在{P,R}上存在从前者到后者的外键。
PS 您对 "map" 的使用很奇怪。 (尽管 "relationship" 被许多传统方法和工具类似地滥用。)那些箭头是外键。当一个列集的子行值必须显示为另一个列集的子行值时,外键成立。在 ER 样式图中,它们通常是实体 table 中的实体 ID 或其他 relationship/association table 中的实体 ID 集的外键。应用程序 relationships/associations(n-way "mappings")由 tables 表示。如果该条件成立,只需插入箭头即可说明。如果你想记录一个申请关系,做一个relationship/association/table。如果你可以用其他的方式表达一些,那么你就不需要它们了。
PPS "Has" 没有任何意义。它说有些东西是 related/associated。当然它们是相关的,任何数量的事物都以任何数量的方式相关。 哪种方式?在 table 名称中使用 "Has" 就像在布尔变量名称中使用 "Flag" 或在整数变量名称中使用 "Count" 一样。与布尔值 "Poisons" 或整数 "ThousandsOfVoltsAC" 进行比较。 table 包含使某些参数化语句--predicate--为真的行。它代表一个应用程序 relationship/association。用它的谓词来命名它所代表的particular(在endless中)relationship/association。
我正在尝试设计一个复杂的数据库,但我有几个问题。
1:将两个映射 table 映射在一起有什么不对吗?不管是什么原因,我都在试图找出它是否反对规范化或最佳实践。
2:如何改进或避免像附图中那样将两个映射 table 映射在一起?
规则:
Course
- 包含每门课程(我们进行的培训)
课程可以有更多类型,类型存储在courseType
table
课程总会有更多类型的人(存储在people
table),每个人都会有一个角色(角色存储在role
table.
有些课程只接受某些类型的角色,这就是为什么我做了 courseTypes_has_roles
table。
people_has_role
table 被映射,这样我就可以看到哪个 people
可以是哪个 role
对于哪个 course
类型。
course_has_people_has_roles
是 people
分配给每个 course
的 role
的映射。重要的是要知道,有些人可以在一种课程中扮演更多角色,但他们在每门单独的课程中只会扮演一个角色。
我试图避免的事情:我不想具体说明每个人在 course
table 中的角色,因为会有人被分配角色但他们没有尚未属于任何课程。
你的设计没有问题。 Course_has_people_has_roles 似乎意味着 "person P is assigned role R for course C" 而 People_has_role 似乎意味着 "person P may be assigned role R"。这是两个不能从对方推导出来的关系。但是前者中的每一个P-R子行都必须出现在后者中,所以在{P,R}上存在从前者到后者的外键。
PS 您对 "map" 的使用很奇怪。 (尽管 "relationship" 被许多传统方法和工具类似地滥用。)那些箭头是外键。当一个列集的子行值必须显示为另一个列集的子行值时,外键成立。在 ER 样式图中,它们通常是实体 table 中的实体 ID 或其他 relationship/association table 中的实体 ID 集的外键。应用程序 relationships/associations(n-way "mappings")由 tables 表示。如果该条件成立,只需插入箭头即可说明。如果你想记录一个申请关系,做一个relationship/association/table。如果你可以用其他的方式表达一些,那么你就不需要它们了。
PPS "Has" 没有任何意义。它说有些东西是 related/associated。当然它们是相关的,任何数量的事物都以任何数量的方式相关。 哪种方式?在 table 名称中使用 "Has" 就像在布尔变量名称中使用 "Flag" 或在整数变量名称中使用 "Count" 一样。与布尔值 "Poisons" 或整数 "ThousandsOfVoltsAC" 进行比较。 table 包含使某些参数化语句--predicate--为真的行。它代表一个应用程序 relationship/association。用它的谓词来命名它所代表的particular(在endless中)relationship/association。