如何以每个班级有一名教师和一名助教的方式设计数据库?

时间:2013-07-24 07:03:59

标签: 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)

UserType可以是教师,助教(TA)或学生。 现在我不知道在哪里可以添加TA属性,以便一个班级有一个TA和一个教师。我正在考虑将TAID作为外键放入User表中,因此它将是:

Class(CourseCode, Semester,Year,ClassTime,ProID,TAID)

但我不确定这是对的。因为当我想要教授特定课程的老师和TA的名字时,它不起作用。我已经尝试过以下查询:

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 

问题:有没有人知道这个问题?提前谢谢。

修改 我写道:

alter proc SelectFacultyNameByID
@CrsCode nvarchar(5),
@Semester nvarchar(20),
@Year int
as
SELECT 
u1.Name as Teacher,
u2.Name as Assistant
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

但它不起作用!

1 个答案:

答案 0 :(得分:1)

嗯,最直接的解决方案是让Class两次引用User来实现教师和TA。所以 - 两个字段,我推荐TeacherID和AssistandID。

另一方面,User应该引用Class来实现类成员身份。

但是,我认为您的User表格应为Student。 另一件事是你应该为教师准备另一张桌子,比如Teacher,在那里你可以填满你的老师和MAYBE TA。这取决于您的老师/ TA附带的字段是否相同。否则,应该有另一个表TeacherAssistantAssistant

最后,如果你必须有一个表格,数据库中的所有用户都在这里,那些是教师,TA和学生,请随时拥有Users表,但是应该从{Teachers表中引用它。 {1}},AssistantsStudents

总结一下,你应该有这些表来满足你的要求:

  • 班级(ID,TeacherID,AssistantID,...)
  • 教师(ID,姓名,...,用户ID)
  • 助理(ID,姓名,...,用户ID)
  • 学生(ID,姓名,ClassID,...,UserID)
  • 用户(ID,名称,......)

另一件事 - 在当代应用程序中,将ID作为PK更容易。我相信你的PK是一个有效的PK候选者,但是在你的表中将自动增量/身份/序列ID作为PK,并且真正的PK候选者作为唯一密钥更容易(并且正在成为惯例)。有关详细信息,请see this discussion。所以,如果我错了,请纠正我,但这确实让我的ORM(实体框架)感到高兴。

修改

在您当前的解决方案中,如果遵循......

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