2012-07-02 60 views
0

我正在爲我的學校開發一個小程序,我對以下DB設計有疑問。高效的MySQL數據庫設計

管理員將通過在線表單向教師分配科目。

受試者的一個例子是這樣的:

  • 主題字段1:(5級數學:教學5/1,5/2和5/3)[文本領域
  • 主題字段2:(6年級數學:教學6/2和6/6)[文本字段]

我已經添加了7個科目字段,因爲沒有任何人會超過7個科目。

每個學科領域將有必要的事情來完成,如課程計劃,課程教學大綱等......

每個需求將具有以下要求:

  • 語言(語言1,語言2或兩者)[下拉]
  • 類型(打印,文件或兩者)[下拉]
  • 時間(第一學期,第二學期或兩者)[下拉]

Here is a Visual

到目前爲止,我想出了這個數據庫的設計:

  • ID(小學,自動遞增)
  • TID(教師ID)
  • Subject1

  • Subject1Requirement1
  • Subject1Requirement2
  • Subject1Requirement3
  • TimeSent
  • TimeReviewed

  • Subject2

  • Subject2Requirement1
  • Subject2Requirement2
  • Subject2Requirement3
  • TimeSent
  • TimeReviewed

  • Subject3

  • Subject3Requirement1
  • Subject3Requirement2
  • Subject3Requirement3
  • TimeSent
  • TimeReviewed

繼續科目7

我覺得有這樣做的更有效的方法但它只是想不到更好 辦法。

謝謝。

回答

2

如果有老師的科目之間沒有任何關係,你可以設計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'); 
--... 
0

在數據庫的關鍵方面是有relationships(鏈接)表之間 - 因此,如果一個表(行)需要引用到別的東西是不同的,那麼使用另一個表並與foreign keys聯繫在一起 - 這個表,在我們的例子TeacherSubject是junction table

爲了給你的我會如何實現您的要求,我認爲我們需要三張表簡單的介紹一下,和下面的SubjectsTeacher是連接表加入這兩個。

您可以定義每個主題和教師,然後將條目添加到TeacherSubject表中以將教師與主題相關聯。

enter image description here

要創建數據庫:

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