将两个映射表映射在一起?

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_rolespeople 分配给每个 courserole 的映射。重要的是要知道,有些人可以在一种课程中扮演更多角色,但他们在每门单独的课程中只会扮演一个角色。

我试图避免的事情:我不想具体说明每个人在 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。