2对多对多关系的数据库建模

时间:2016-02-09 13:20:11

标签: mysql database database-design

我有3个实体

teacher:存储学校教师的姓名。 (例如"老师1","老师2")
access:存储所有类型的访问类型的名称。 (例如" class_teacher"," sports_teacher"," head_master")
classroom:存储学校中不同班级的名称。 (例如"教室I","教室II")

关系如下:

  • 老师< - >访问是多对多的
  • 老师< - >课堂是多对多的

我现在对其进行建模的方式如下表

  1. 教师(id,用户名)(1 t1,2 t2)
  2. access(id,access)(1 a1,2 a2)
  3. 教室(id,class)(1 c1,2 c2)
  4. teacher_access(id,teacherId,accessId)(1 1 1,1 1 2)
  5. teacher_classroom(id,teacherId,classroomId)(1 1 1,1 1 2)
  6. teacher_access中的一行存储特定的" access"一位特定的老师"有。
    例如(1 1 1)表明t1有访问a1

    teacher_classroom中的一行允许特定的老师"访问特定的教室"使用他/她拥有的访问权限 例如(1 1 1)显示教师t1可以访问课堂c1

    这里的问题是我不想让教师t1访问教室c2的a2。

    在我目前的设计中,如果teacher_access中有一行,则该行中的tId将具有" access"这行所指定的所有教室我们都有一个排在" teacher_classroom"拥有相同的老师。所以,如果我在#34; teacher_access" with(tId = 1,aId = 1),(tId = 1,aId = 2)," teacher_classroom" with(tId = 1,cId = 1),(tId = 1,cId = 2),"老师"(1)同时拥有"访问"(1,2) #34;教室"(1,2)。但我想要做的是为cId(1)提供aId(1)到tId(1),为cId(2)提供aId(1,2)tId:teacherId aId:accessId cId:classroomId。

    我想说的是我想要一位老师"有不同的访问"到不同的"教室"。例如。老师可以同时拥有" class_teacher"和" sports_teacher"进入教室"教室I"并且只有" sports_teacher"进入"教室II"。我无法使用我目前的设计做到这一点,因为如果老师有"访问" (sports_teacher,class_teacher)每个teacher_access,同一位老师可以访问"教室" (课堂I,课堂II),我不能让老师只有" sports_teacher"为"第二课堂"。

    什么是更好的模型方法?

2 个答案:

答案 0 :(得分:1)

您可以通过教师,访问权限,教室和表格来描述正在进行的操作

"teacher TID has access AID to classroom CID"

根据您的编辑和评论:给定教师或访问权限或教室,其余部分不仅有一个值。给老师和教室,可以有多次访问。鉴于老师和访问权限,可能会有多个房间。如果有访问权限和空间,可能会有多名教师。因此,您无法将学校情况描述为组件的联接。 (那种关系是“所有(候选)关键”。)

如果描述默认值和例外情况,您可以用更少的数字来描述情况。

PS请参阅this answer重新默认值和特殊添加内容&减法。

(对你的问题的早期编辑引起的解决方案的一些猜测如下。我使用了一些新的表名,尽管一些带有新名称的表可能最终成为你的旧表。我使用最小的id。)

也许您只需要两个实体表和多对多表:

teacher "TEACHER identifies a teacher named NAME"
classroom "CLASSROOM identifies a classroom"
has_access "teacher TEACHER has access to classroom CLASSROOM"
    FK (TEACHER) references teacher
    FK (CLASSROOM) references classroom

还要记录实际允许的访问权限:

is_accessing "teacher TEACHER is accessing classroom CLASSROOM"
    FK (TEACHER, CLASSROOM) references teacher_access

另一方面,“访问”可能是1:1,带有一组教室,并且允许访问这些房间的访问装置。这种情况可以记录在上面的数据库中。但它的组织可能不那么冗余如下。

teacher "TEACHER identifies a teacher named NAME"
classroom "CLASSROOM identifies a classroom"
access "ACCESS identifies an access"

access_classroom "access ACCESS acesses classroom CLASSROOM"
    FK (ACCESS) references access
    FK (CLASSROOM) references classroom
teacher_access "teacher TEACHER has access ACCESS"
    FK (TEACHER) references teacher
    FK (ACCESS) references access

现在

has_access "teacher TEACHER has access to classroom CLASSROOM"

select TEACHER, CLASSROOM
from teacher_access natural join access_classroom

还要记录实际允许的访问权限:

is_accessing "teacher TEACHER is accessing classroom CLASSROOM"

然后我们仍然希望:

    FK (TEACHER, CLASSROOM) references has_access

但在大多数DBMS中,这不能以声明方式强制执行。

答案 1 :(得分:0)

您的模型现在的方式是教师是否可以访问资源。您需要做的是设置一个连接所有三个实体的关系表。例如。 teacher_room_access(id,teacherId,classId,accessId)(1 1 1 1,2 1 1 2,3 2 1 1,4 2 2 2)