0

我有 2 张桌子:

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和一个Teacher。我正在考虑将 TAID 作为外键放入 User 表中,这样可以:

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 

问题:有人对这个问题有任何想法吗?提前致谢。

编辑: 我写道:

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

但它不起作用!

4

1 回答 1

1

好吧,最直接的解决方案是让 aClass引用User两次来实施教师和助教。所以 - 两个字段,我推荐 TeacherID 和 AssisstandID。

在另一个方向,User应该有一个Class实现类成员的引用。

但是,我认为您的User表应该是Student. 另一件事是您应该为老师准备另一张桌子,例如Teacher,您可以在其中塞满老师和 MAYBE TA。这取决于您的老师/助教的字段是否相同。否则应该有另一个表TeacherAssistantAssistant.

最后,如果您必须有一些表,其中所有用户都驻留在数据库中,并且这些用户是教师、助教和学生,请随意使用该Users表,但应该从TeachersAssistants和中引用它Students

总而言之,您可能应该有这些表来满足您的要求:

  • 班级(ID、TeacherID、AssistantID、...)
  • 教师(ID、姓名、...、用户 ID)
  • 助理(ID、姓名、...、用户 ID)
  • 学生(ID、姓名、班级 ID、...、用户 ID)
  • 用户(ID、姓名、...)

另一件事 - 在当代应用程序中,将 ID 作为 PK 更容易。我相信您的 PK 是一个有效的 PK 候选者,但是将自动增量/身份/序列 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
于 2013-07-24T07:29:56.327 回答