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、名称等)
另一件事——在当代应用中,将ID作为PK更容易。我相信你的PK是一个有效的候选PK,但是在你的表中使用autoincrement/identity/sequence ID作为PK,而使用真正的候选PK作为唯一的键更容易(并且已经成为惯例)。欲了解更多信息。所以,如果我错了,请纠正我,但这确实让我的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

谢谢你回答我。我已经考虑过了,但是我的系统非常简单。用户可以登录到系统。如果他们是学生,他们可以看到自己的成绩。如果他们是教师/助教,他们可以添加分数。如果他们是管理员,他们可以管理登录帐户和类列表。因此,如果我创建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