Sql server 如何设计一个数据库,每个班级有一名教师和一名助教?
我有两张桌子:Sql server 如何设计一个数据库,每个班级有一名教师和一名助教?,sql-server,database,database-design,relational-database,Sql Server,Database,Database Design,Relational Database,我有两张桌子: User(LoginID,Password,Email,UserType) -- Primary key(LoginID) Class(CourseCode, Semester,Year,ClassTime,ProID) -- Primary key(CourseCode, Semester,Year) -- Foreign key(ProID) 用户类型可以是教师、助教(TA)或学生。 现在我不知道在哪里可以添加TA属性,这样一个类就有一个TA和一个老师。我正在考虑将TAI
User(LoginID,Password,Email,UserType) -- Primary key(LoginID)
Class(CourseCode, Semester,Year,ClassTime,ProID) -- Primary key(CourseCode, Semester,Year) -- Foreign key(ProID)
用户类型可以是教师、助教(TA)或学生。
现在我不知道在哪里可以添加TA属性,这样一个类就有一个TA和一个老师。我正在考虑将TAID作为外键放入用户表中,因此:
Class(CourseCode, Semester,Year,ClassTime,ProID,TAID)
但我不确定这是否正确。因为当我想知道教授特定课程的老师和助教的名字时,这是行不通的。我尝试了以下查询:
SELECT dbo.[User].Name
FROM dbo.Class INNER JOIN
dbo.[User] ON dbo.Class.ProID = dbo.[User].LoginID AND dbo.Class.TAID = dbo.[User].LoginID
WHERE CrsCode=@CrsCode and Semester=@Semester and Year=@Year
问题:有人知道这个问题吗?提前谢谢
编辑:
我写道:
但它不起作用 好吧,最严格的解决方案是让
类
两次引用用户
来实现教师和助教。所以-两个字段,我推荐TeacherID和AssistandID
在另一个方向,User
应该有一个对Class
的引用来实现类成员资格
但是,我认为您的User
表应该是Student
。
另一件事是你应该为老师准备另一张桌子,比如Teacher
,在那里你可以给你的老师和助教们塞满东西。这取决于您的老师/TA的字段是否相同。否则,应该有另一个表TeacherAssistant
或Assistant
最后,如果您必须有一个数据库中所有用户所在的表,这些用户是教师、助教和学生,可以随意使用用户
表,但应该有教师
、助理
和学生
对该表的引用
总而言之,您可能需要以下表格来满足您的需求:
- 班级(ID、教师ID、助教等)
- 教师(ID、姓名、…、用户ID)
- 助理(ID、姓名、…、用户ID)
- 学生(ID、姓名、ClassID、…、用户ID)
- 用户(ID、名称等)
SELECT u.Name
FROM
dbo.Class c
JOIN [User] u
ON c.ProID = u.LoginID
WHERE
c.CrsCode = @CrsCode
AND c.Semester = @Semester
AND c.Year = @Year
…指该学年/学期所有此类课程的教师姓名,然后
SELECT u.Name
FROM
dbo.Class c
JOIN [User] u
ON c.ProID = u.LoginID
AND c.TAID = u.LoginID
WHERE
c.CrsCode = @CrsCode
AND c.Semester = @Semester
AND c.Year = @Year
…意味着对于该年/学期的此类课程,查找所有具有相同教师和助教的课程,并输出其名称
您可能需要:
SELECT
Teacher = u1.Name,
Assistant = u2.Name
FROM
dbo.Class c
JOIN [User] u1
ON c.ProID = u1.LoginID
JOIN [User] u2
ON c.TAID = u2.LoginID
WHERE
c.CrsCode = @CrsCode
AND c.Semester = @Semester
AND c.Year = @Year
谢谢你回答我。我已经考虑过了,但是我的系统非常简单。用户可以登录到系统。如果他们是学生,他们可以看到自己的成绩。如果他们是教师/助教,他们可以添加分数。如果他们是管理员,他们可以管理登录帐户和类列表。因此,如果我创建3个单独的表(教师、助理和学生),这将是复杂的,而且没有必要。但是,如果我只是将AssistantID作为用户表的外键添加到类表中,这是错误的吗?这没有错,事实上它是完全有效的。但是,如果1班的学生是2班的助教怎么办?几个月后,当你看到自己的查询时,你会感到困惑吗?如果你觉得对,我也觉得对;)事实上,为了简单起见,我假设助教不可能是学生,即使它不实用。:)这有点奇怪,当我把它作为一个查询执行时,它起了作用。但我将它保存为一个过程并执行它。它什么也没表现出来。@@我在一所大学教书。一位教授上了我的课。这在您的模式中是如何工作的?
SELECT
Teacher = u1.Name,
Assistant = u2.Name
FROM
dbo.Class c
JOIN [User] u1
ON c.ProID = u1.LoginID
JOIN [User] u2
ON c.TAID = u2.LoginID
WHERE
c.CrsCode = @CrsCode
AND c.Semester = @Semester
AND c.Year = @Year