【问题标题】:Mapping two mapping tables together?将两个映射表映射在一起?
【发布时间】:2016-05-13 08:51:06
【问题描述】:

我正在尝试设计一个复杂的数据库,但我有几个问题。

1:将两个映射表映射在一起有什么问题吗?不管是什么原因,我都试图找出它是否违反规范化或最佳实践。

2:如何改进或避免将两个映射表映射在一起,如附图所示?

规则:

Course - 包含所有课程(我们进行的培训)

课程可以有更多类型,类型存储在courseType表中

课程总是会有更多类型的人(存储在people 表中),每个人都有一个角色(角色存储在role 表中。

有些课程只接受某些类型的角色,这就是我制作courseTypes_has_roles 表的原因。

people_has_role 表被映射,以便我可以看到哪个people 可以是哪个role 哪个course 类型。

course_has_people_has_roles 是为每个course 分配role 的people 的映射。重要的是要知道,有些人可以为一种类型的课程担任更多角色,但他们在每个单独的课程中只有一个角色。

我要避免的事情:我不想在course 表中指定每个人的角色,因为有些人被分配了角色但他们还不属于任何课程。

【问题讨论】:

    标签: mysql database-design many-to-many relational-database


    【解决方案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”。与布尔值“Poisons”或整数“ThousandsOfVoltsAC”进行比较。一个表包含使某些参数化语句--谓词--true 的行。它表示应用程序关系/关联。使用它的谓词来命名它所代表的特定(在无尽中)关系/关联。

    【讨论】:

    • 谢谢!我真的是刚学这个东西,所以解释的都没有看懂,但是很庆幸数据库结构的逻辑没问题。我仍在努力并在此期间学习。
    猜你喜欢
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 2022-08-15
    • 1970-01-01
    • 2022-01-23
    • 2010-12-12
    • 1970-01-01
    相关资源
    最近更新 更多