【问题标题】:Database Design for Time Table Generation时间表生成的数据库设计
【发布时间】:2013-11-25 19:14:40
【问题描述】:

我正在做一个使用 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 数据库

【问题讨论】:

    标签: mysql sql jakarta-ee database-design timetable


    【解决方案1】:

    您不想在Faculty 中实际存储NumOfSub(主题数) Subjects。以这种方式存储主题违反了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
    

    )

    【讨论】:

    • 那么FacultySubject主题表将包含这样的数据对吗?? IT101 ABC IT102 ABC
    • 否 - 它只会保存指向现有 id 的 fk 链接,您已指出它们是整数;它将完全不透明,例如1 1, 2 3, 88 1。为了获得实际的“显示”数据(因为内部数据库 ID 应该很少/永远不会逃逸),您将需要加入其他表。假设IT101Subject 中,而ABCFaculty 中。
    • thx 现在知道了 CREATE TABLE `facsub` ( `fid` int(11) NOT NULL, `sid` int(11) NOT NULL, KEY `fid_idx` (`fid`), KEY `sid_idx` (`sid`), CONSTRAINT `sid` FOREIGN KEY (`sid`) REFERENCES `subject` (`sid`) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT `fid` FOREIGN KEY (`fid`) REFERENCES `faculty` (`fid`) ON DELETE NO ACTION ON UPDATE NO ACTION ) ENGINE=InnoDB DEFAULT CHARSET=latin1; create sql 查询 foe=r FacultySubjectfid 和 'sid 是 FacultyID 和 StudentID
    • 您可能需要对这对值进行唯一键约束,这样您就不会得到重复值(通常,您不希望表中出现重复值),但您得到了它。当然,您将拥有多个相同的学科和教师。哦,如果数据库支持它,请不要使用简短/神秘的表名或带引号的标识符。
    • 感谢@Clockwork-Muse .. 我现在可以通过选择每个教师并添加他们相应的科目来将数据添加到 FacultySubject。你能告诉我我的数据库是哪种范式吗??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 2011-12-07
    • 2019-11-13
    相关资源
    最近更新 更多