我正在尝试设计一个复杂的数据库,我有几个问题。
1:将两个映射表映射到一起是否有误?无论是什么原因,我都试图找出它是否违反了规范化或最佳实践。
2:如何改进或避免将两个映射表映射到一起?如附图所示?
规则:
Course
- 包含每门课程(我们所做的培训)
课程可以是更多类型,类型存储在courseType
表
课程总是会有更多类型的人(存储在people
表中),每个人都有一个角色(角色存储在role
表中。
有些课程只会接受某些类型的角色,这就是我为courseTypes_has_roles
表做的原因。
people_has_role
表已映射,以便我可以看到哪个people
可以是role
哪个course
类型。
course_has_people_has_roles
正在映射people
为每role
分配哪个course
。知道某些人可以为某种类型的课程担任更多角色非常重要,但是每个单独的课程只会有一个角色。
我试图避免的事情:我不想在course
表格中指定每个人的角色,因为会有人被分配角色但他们不会t属于任何课程。
答案 0 :(得分:1)
您的设计没有任何问题。 Course_has_people_has_roles似乎意味着“人P被赋予课程C的角色R”,而People_has_role似乎意味着“人P可能被赋予角色R”。这两种关系不能相互推导出来。但前者中的每个P-R子行必须出现在后者中,因此在{P,R}上有一个从前者到后者的外键。
PS 你对“地图”的使用很奇怪。 (尽管“关系”类似地被许多传统方法和工具滥用。)这些箭头是外键。当列集的子行值必须显示为另一列的子列值时,外键保持不变。在ER样式的图中,它们通常是实体表中的实体ID的外键或其他关系/关联表中的实体ID的外键。应用程序关系/关联(n路“映射”)由表表示。如果这种情况成立,只需按箭头说明即可。如果要记录应用程序关系,请创建关系/关联/表。如果你可以用别人来表达一些,那么那么就不需要它们了。
PPS “有”并不意味着什么。它说有些事情是相关/相关的。当然它们是相关的,任何数量的东西都有很多相关的方式。 哪种方式?在表名中使用“Has”就像在布尔变量的名称中使用“Flag”或在整数变量的名称中使用“Count”。与布尔“毒药”或整数“ThousandsOfVoltsAC”相比较。表保存了构成参数化语句的行 - 谓词 - true。它代表应用程序关系/关联。使用其谓词来命名特定(在无尽的之间)它所代表的关系/关联。