我有3个实体
teacher
:存储学校教师的姓名。 (例如"老师1","老师2")
access
:存储所有类型的访问类型的名称。 (例如" class_teacher"," sports_teacher"," head_master")
classroom
:存储学校中不同班级的名称。 (例如"教室I","教室II")
关系如下:
我现在对其进行建模的方式如下表
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"为"第二课堂"。
什么是更好的模型方法?
答案 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)