【问题标题】:Efficient MySQL Database Design高效的 MySQL 数据库设计
【发布时间】:2012-07-02 08:06:30
【问题描述】:

我正在为我的学校开发一个小程序,我对以下数据库设计有疑问。

管理员将通过在线表格将科目分配给教师。

一个主题的例子是这样的:

  • 主题字段 1:(5 年级数学:教学 5/1、5/2 和 5/3)[文本字段]
  • 主题字段 2:(6 年级数学:教学 6/2 和 6/6)[文本字段]

我根据他们的要求添加了 7 个主题字段,因为不会有任何人超过 7 个主题。

每个学科领域都需要完成一些事情,例如课程计划、课程大纲等......

每个要求都有以下要求:

  • 语言(语言 1、语言 2 或两者)[下拉菜单]
  • 类型(打印、文件或两者)[下拉]
  • 时间(第 1 学期、第 2 学期或两者)[下拉]

到目前为止,我已经想出了这个数据库设计:

  • ID(主要,自动递增)
  • TID(教师 ID)
  • 年份

  • 主题1

  • 主题1要求1
  • 主题1要求2
  • 主题1要求3
  • 发送时间
  • 审核时间

  • 主题2

  • Subject2Requirement1
  • Subject2Requirement2
  • Subject2Requirement3
  • 发送时间
  • 审核时间

  • 主题3

  • 主题3要求1
  • 主题3要求2
  • 主题3要求3
  • 发送时间
  • 审核时间

继续主题 7。

我觉得有一种更有效的方法,但就是想不出更好的方法。

谢谢。

【问题讨论】:

    标签: mysql database-design


    【解决方案1】:

    如果老师的科目之间没有关系,可以设计如下3个表格

    Teachers    TeacherSubjects SubjectRequirements
    ----------  --------------- --------------------
    ID          SubjectID ----> SubjectID
    TID --\     SubjectName     SubjectRequirement
    Year   \--> TID             Language
                TimeSent        Type
                TimeReviewed    Time
    

    在这样的设计中

    • 每位教师可以有多个科目(不限于 7 个科目)
    • 每个老师的科目都有多个要求(不限于 5 个要求)

    样本数据

    INSERT INTO Teachers(ID, TID, Year) VALUES (1,'LiuYan', 2012);
    INSERT INTO Teachers(ID, TID, Year) VALUES (2,'Emily',  2012);
    
    INSERT INTO TeacherSubjects (SubjectID, SubjectName, TID) VALUES ('SubjectID_1', 'SubjectName1', 'LiuYan');
    INSERT INTO TeacherSubjects (SubjectID, SubjectName, TID) VALUES ('SubjectID_2', 'SubjectName2', 'LiuYan');
    -- ...
    INSERT INTO TeacherSubjects (SubjectID, SubjectName, TID) VALUES ('SubjectID_N', 'SubjectNameN', 'LiuYan');
    
    INSERT INTO TeacherSubjects (SubjectID, SubjectName, TID) VALUES ('SubjectID_N+1', 'SubjectName N+1', 'Emily');
    INSERT INTO TeacherSubjects (SubjectID, SubjectName, TID) VALUES ('SubjectID_N+2', 'SubjectName N+2', 'Emily');
    -- ...
    INSERT INTO TeacherSubjects (SubjectID, SubjectName, TID) VALUES ('SubjectID_M', 'SubjectName M', 'Emily');
    
    INSERT INTO SubjectRequirements (SubjectID, SubjectRequirement, Language, Type, Time) VALUES ('SubjectID_1', 'Curriculum', 'Language 1', 'Printed', 'Semester 1');
    INSERT INTO SubjectRequirements (SubjectID, SubjectRequirement, Language, Type, Time) VALUES ('SubjectID_1', 'Course Syllabus', 'Language 2', 'File', 'Semester 2');
    INSERT INTO SubjectRequirements (SubjectID, SubjectRequirement, Language, Type, Time) VALUES ('SubjectID_1', 'Learning Management', 'Both Language', 'Both Type', 'Both Semester');
    --...
    
    INSERT INTO SubjectRequirements (SubjectID, SubjectRequirement, Language, Type, Time) VALUES ('SubjectID_N+1', 'Curriculum', 'Language 2', 'Both Type', 'Semester 2');
    --...
    

    【讨论】:

      【解决方案2】:

      数据库的一个关键方面是在表之间有relationships(链接)-因此,如果表(行)需要引用其他不同的东西,则使用另一个表并与foreign keys一起链接-这个表,在我们的例子中,TeacherSubject 是junction table

      为了让您简要了解我将如何实现您的要求,我认为我们需要三个表,下面的 SubjectsTeacher 是一个链接表来连接这两个表。

      您定义每个科目和教师,然后将条目添加到 TeacherSubject 表以将教师与科目相关联。

      创建数据库:

      CREATE TABLE `Subject` (
      `SID` INTEGER NOT NULL AUTO_INCREMENT ,
      `Name` VARCHAR(100) NOT NULL ,
      `Curriculum` INTEGER NOT NULL ,
      `Syllabus` INTEGER NOT NULL ,
      `LearnManagement` INTEGER NOT NULL ,
      `Individual Analysis` INTEGER NOT NULL ,
      PRIMARY KEY (`SID`)
      );
      
      CREATE TABLE `Teachers` (
      `TID` INTEGER NOT NULL AUTO_INCREMENT ,
      `Name` VARCHAR(100) NOT NULL ,
      PRIMARY KEY (`TID`)
      );
      
      CREATE TABLE `TeacherSubject` (
      `id` INTEGER NOT NULL AUTO_INCREMENT ,
      `SID_Subject` INTEGER NOT NULL ,
      `TID_Teachers` INTEGER NOT NULL ,
      PRIMARY KEY (`id`)
      );
      

      然后添加外键,告诉数据库您的字段是如何链接的 - 这一步很重要,因为它将确保您保持数据完整性并且不会将错误数据插入到该数据中。

      ALTER TABLE `TeacherSubject` ADD FOREIGN KEY (SID_Subject) REFERENCES `Subject` (`SID`);
      ALTER TABLE `TeacherSubject` ADD FOREIGN KEY (TID_Teachers) REFERENCES `Teachers` (`TID`);
      

      然后设置几行进行测试。

       INSERT INTO `Subject` (`SID`, `Name`, `Curriculum`, `Syllabus`, `LearnManagement`, `Individual Analysis`) VALUES
          (1, 'Subject1', 1, 2, 3, 4),
          (2, 'Subject1', 1, 2, 3, 4),
          (3, 'Subject2', 1, 2, 3, 4),
          (4, 'Subject3', 1, 2, 3, 4),
          (5, 'Subject4', 1, 2, 3, 4);
      INSERT INTO `Teachers` (`Name`) VALUES ('Teacher 1');
      INSERT INTO `Teachers` (`Name`) VALUES ('Teacher 2');
      
      INSERT INTO `TeacherSubject` (`id`, `SID_Subject`, `TID_Teachers`) VALUES
          (1, 1, 1),
          (2, 2, 1),
          (3, 3, 2),
          (4, 4, 2),
          (5, 1, 2);
      

      最后要找出#1 老师有哪一科:

       select * from TeacherSubject
      INNER JOIN Teachers on TID=TID_Teachers
      WHERE TID_Teachers=1
      

      【讨论】:

        猜你喜欢
        • 2011-12-21
        • 1970-01-01
        • 2013-09-25
        • 1970-01-01
        • 2016-12-04
        • 1970-01-01
        • 2015-11-03
        • 1970-01-01
        • 2013-11-29
        相关资源
        最近更新 更多