我正在使用J2EE(servlet)进行大学时间表生成的项目。
一天有六个插槽(6小时)
4 x 1 HR Lectures
1 x 2 HR Lab
共分三批(3IT,5IT,7IT)
2 Classroom
1 LAB
时间表中的每个广告位都有
(Subject,Faculty)
对于实验,我将复制插槽。
桌子
Subject(SubjectID INT, SubjectName VARCHAR);
Faculty(FacultyID INT,FacultyName VARCHAR,NumOfSub INT,Subjects XYZ);
在这里,我无法确定主题的
DATATYPE
。我该怎么办 ?既然一个系可以教多个科目?另外如何与主题表链接?附言使用MySQL数据库
最佳答案
您实际上不想在NumOfSub
中存储Subjects
(主题数)或Faculty
。以这种方式存储主题违反了First Normal Form,并且处理它会引起严重的头痛。
相反,您想要的是另一个表:
FacultySubject
----------------
FacultyId -- fk for Faculty.FacultyId
SubjectId -- fk for Subject.SubjectId
由此,您可以轻松地获得主题的数量,或者列出主题的一组行(我相信MySQL也具有返回值列表的功能,但是我对这些没有经验):
此查询将检索由特定教师教授的科目数:
SELECT Faculty.FacultyId, COUNT(*)
FROM Faculty
JOIN FacultySubject
ON FacultySubject.FacultyId = FacultyId.FacultyId
WHERE Faculty.FacultyName = 'Really Cool Professor'
GROUP BY Faculty.FacultyId
...,此查询将获取他们教授的所有主题(命名):
SELECT Subject.SubjectId, Subject.SubjectName
FROM Faculty
JOIN FacultySubject
ON FacultySubject.FacultyId = FacultyId.FacultyId
JOIN Subject
ON Subject.SubjectId = FacultySubject.SubjectId
WHERE Faculty.FacultyName = 'Really Cool Professor'
(请注意,最后一个返回的主题是一组行,即:
SubjectId SubjectName
=========================
1 Tree Houses
2 Annoying Younger Sisters
3 Swimming Holes
4 Fishing
)