0

私は学校の小さなプログラムに取り組んでおり、次の DB 設計について質問があります。

管理者は、オンライン フォームを介して教師に科目を割り当てます。

件名の例は次のようになります。

  • 科目フィールド 1: (5 年生の数学: 5/1、5/2、および 5/3 の教育) [テキスト フィールド]
  • 科目フィールド 2: (Grade 6 Math: Teaching 6/2 and 6/6) [テキスト フィールド]

7科目を超える人はいないので、リクエストごとに7科目フィールドを追加しました.

各教科には、授業計画、コース シラバスなど、完了する必要のある項目があります。

各要件には、次の要件があります。

  • 言語 (言語 1、言語 2、またはその両方) [ドロップダウン]
  • タイプ (印刷、ファイル、またはその両方) [ドロップダウン]
  • 時間(セメスター1、セメスター2、またはその両方)[ドロップダウン]

ビジュアルはこちら

これまでのところ、この DB 設計を思いつきました。

  • ID (プライマリ、自動インクリメント)
  • TID(教師ID)
  • 件名1

  • 件名1要件1
  • 件名1要件2
  • 件名1要件3
  • 送信時間
  • レビュー時間

  • 件名2

  • 件名2要件1
  • 件名2要件2
  • 件名2要件3
  • 送信時間
  • レビュー時間

  • 件名3

  • 件名3要件1
  • 件名3要件2
  • 件名3要件3
  • 送信時間
  • レビュー時間

件名 7 に続きます。

もっと効率的な方法があると思いますが、もっと良い方法が思い浮かびません。

ありがとう。

4

2 に答える 2

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');
--...
于 2012-07-02T08:57:25.777 に答える
0

データベースの重要な側面の 1つは、テーブル間の関係(リンク) を持つことです。そのため、テーブル (行) が別のものを参照する必要がある場合は、別のテーブルを使用し、外部キーと一緒にリンクします。この場合、このテーブルです。 TeacherSubject はジャンクション テーブルです

要件をどのように実装するかを簡単に説明すると、3 つのテーブルが必要だと思います。下の SubjectsTeacher は、2 つを結合するためのリンク テーブルです。

各科目と教師を定義してから、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
于 2012-07-03T06:07:38.693 に答える