知識への投資が最大の利益をもたらします。
ベンジャミンフランクリン
現代の世界では、教育は遍在しています。今まで以上に、それは私たちの社会で重要な役割を果たしています。実際、私たちの多くが学校や大学を卒業した後も教育を継続することは非常に重要です。
私たちは皆、生涯学習、ノンフォーマル教育、そしてすべての年齢のためのワークショップについて聞いたことがあります。これらの方法は、多くの点で正式な教育とは異なりますが、共通点もあります。クラス、レッスン、教師、そして学生がいます。また、従来の設定と同様に、クラスのスケジュール、出席データ、インストラクターまたは生徒の成績を追跡する必要があります。これらのニーズを満たすデータベースをどのように設計できますか?それがこの記事で取り上げる内容です。
教育データベースモデルの紹介
この記事で紹介するモデルを使用すると、次のデータを保存できます。
- クラス/講義
- インストラクター/講師
- 学生
- 講義への出席
- 学生/講師の成果
このモデルは、学校の時間割として、他のグループ活動(水泳レッスン、ダンスワークショップ)、または個別指導などの1対1の活動にも使用できます。クラスの場所データやワークショップの期間の保存など、改善の余地はまだたくさんあります。これらについては、今後の記事で取り上げます。
基本的なEducationデータベース要素であるテーブルから始めましょう。
ビッグスリー:学生、インストラクター、クラステーブル
学生
、インストラクター
、および class
テーブルはデータベースのコアを構成します。
学生
上記の表は、学生に関する基本的なデータを格納するために使用されますが、特定のニーズに応じて拡張できます。 3つの連絡先属性を除いて、テーブル内のすべての属性が必要です。
-
first_name
–生徒の名前 -
last_name
–生徒の名前 -
birth_date
–学生の生年月日 -
contact_phone
–学生の電話番号 -
contact_mobile
–学生の携帯電話番号 -
contact_mail
–学生のメールアドレス -
category_id
–はカテゴリへの参照です
カタログ。この構造では、生徒ごとに1つのカテゴリのみに制限されます。これはほとんどの場合に機能しますが、状況によっては、複数のカテゴリをリストする余地が必要になる場合があります。ご覧のとおり、studentを接続する多対多の関係を追加します
カテゴリのテーブル
辞書はこの問題を解決します。ただし、このシナリオでは、データを処理するために、かなり複雑なクエリを作成する必要があります。
言及したので、先に進んでカテゴリについて説明しましょう。
ここに表があります。
このテーブルは、特定の基準に基づいて学生をグループ化するために使用される辞書です。 名前コード> テーブル内のデータは属性のみです(
id
を除く) 、主キー)そしてそれは必須です。ここに保存できる値のセットの1つは、学生の雇用状況です。「学生」、「雇用」、「失業」、「退職」です。また、「ヨガが好き」、「ハイキングが好き」、「自転車に乗るのが好き」、「何も好きではない」など、非常に具体的な基準に基づいて他のセットを使用することもできます。
インストラクター
表には、組織内のすべてのインストラクター/講師のリストが含まれています。表の属性は次のとおりです。
-
first_name
–インストラクターの名前 -
last_name
–インストラクターの名前 タイトル
–インストラクターの役職(ある場合)-
birth_date
–インストラクターの生年月日 -
contact_phone
–インストラクターの電話番号 -
contact_mobile
–インストラクターの携帯電話番号 -
contact_mail
–インストラクターのメールアドレス
title
そして3つすべてのcontact
属性は必須ではありません。
学生
テーブルとインストラクター
テーブルは同様の構造を共有しますが、この情報を整理するための別の可能性があります。 2番目のアプローチは、人を持つことです。
テーブル(すべての従業員と学生のデータを格納します)であり、その人に割り当てられたすべての役割を示す多対多の関係があります。 2番目のアプローチの最も重要な利点は、データを1回だけ保存することです。誰かが1つのクラスのインストラクターであり、別のクラスの学生である場合、それらはデータベースに1回だけ表示されますが、両方の役割が定義されています。
教育データベースモデルに2テーブルアプローチを選択したのはなぜですか?一般に、学生とインストラクターは、実際の生活とデータベースの両方で異なる動作をします。そのため、データを個別に保存するのが賢明かもしれません。両方のテーブルに表示される同一人物情報をマージする他の方法を見つけることができます(たとえば、社会保障番号やVAT番号などの外部IDに基づく挿入/更新クエリのペア)。
クラス
表は、すべてのクラスに関する詳細を含むカタログです。各クラスタイプの複数のインスタンスを持つことができます。表の属性は次のとおりです( end_date
を除くすべてが必須です ):
-
class_type_id
–はclass_typeへの参照です
辞書。 名前コード> –はクラスの短縮名です。
説明
–この説明は、class_typeの説明よりも具体的です
テーブル。-
start_date
–クラスの開始日。 -
end_date
–クラスの終了日。各クラスの正確な終了日が事前にわかっているとは限らないため、必須ではありません。 完了
–は、計画されたすべてのクラスアクティビティが終了したかどうかを示すブール値です。これは、計画されたend_time
に到達したときに便利です。 クラスの場合ですが、他のクラスのアクティビティはまだ完了していません。
class_type
表は、学生に提供される講義またはクラスに関する基本的な情報を格納することを目的とした単純なカタログです。 「英語(グループ)」、「ポーランド語(グループ)」、「クロアチア語(グループ)」、「英語(対面)」、「ダンスレッスン」などの値を含めることができます。必須の属性はname
の2つだけです。 およびdescription
、どちらもこれ以上の説明は必要ありません。
class_schedule
表には、講義とクラスの特定の時間が含まれています。表のすべての属性は必須です。 class_id
属性はクラスへの参照です
テーブル、 start_time
およびend_time
その特定の講義の開始時間と終了時間です。
誰がここにいますか?出席関連の表
出席
テーブルには、どの生徒がどのクラスに参加したか、および最終結果に関する情報が格納されます。表の属性は次のとおりです。
-
student_id
–は学生への参照です
テーブル -
class_id
–はクラスへの参照です
テーブル -
class_enrollment_date
–生徒がそのクラスに参加し始めた日付です -
class_drop_date
–生徒がクラスを辞めた日付。この属性は、生徒がクラスの終了日より前にクラスをドロップした場合にのみ値を持ちます。その場合、drop_class_reason_id
属性値も設定する必要があります。 -
drop_class_reason_id
–はdrop_class_reasonへの参照です
テーブル 出席_outcome_id
–は出席_outcomeへの参照です
テーブル
class_drop_date
を除くすべてのデータ およびdrop_class_reason_id
必要とされている。これらの2つは、生徒がクラスをやめた場合にのみ満たされます。
drop_attendance_reason
表は、学生がコースをドロップする可能性があるさまざまな理由を含む辞書です。 reason_text
という1つの属性しかありません。 、およびそれは必須です。値のセットの例には、「病気」、「関心の喪失」、「十分な時間がない」、「その他の理由」などがあります。
出席_結果
表には、特定のコースでの学生の活動に関する説明が含まれています。 outcome_text
テーブル内の唯一の属性であり、必須です。可能な値のセットは、「進行中」、「正常に完了」、「部分的に完了」、「クラスを完了していません」です。
担当者は誰ですか?教育関連の表
教える
、 drop_teach_reason
およびTeacher_outcome
テーブルは、参加と同じロジックを使用します
、 drop_attendance_reason
および出席_outcome
テーブル。これらのテーブルにはすべて、インストラクターのコース関連のアクティビティに関するデータが格納されています。
教える
テーブルは、どのインストラクターがどのクラスを教えているかに関する情報を格納するために使用されます。表の属性は次のとおりです。
-
instructor_id
–はインストラクターへの参照です
テーブル。 -
class_id
–はクラスへの参照です
テーブル。 -
start_date
–インストラクターがそのクラスの作業を開始した日付です。 -
end_date
–インストラクターがそのクラスでの作業を停止した日付です。インストラクターがクラスの終了日まで教えるかどうかを事前に知ることができないため、必須ではありません。 -
drop_teach_reason_id
–はdrop_teach_reasonへの参照です
テーブル。インストラクターはクラスを落とさない可能性があるため、必須ではありません。 -
Teacher_outcome_id
–はTeacher_outcome_reasonへの参照です
テーブル。
drop_teach_reason
表は単純な辞書です。インストラクターが終了日より前にクラスの指導を終了した理由について、考えられる一連の説明が含まれています。必須の属性は1つだけです: reason_text
。これは、「病気」、「他のプロジェクト/仕事に移された」、「やめた」、または「他の理由」である可能性があります。
Teacher_outcome
表は、特定のコースでのインストラクターの成功を示しています。 outcome_text
テーブルの唯一の属性であり、必須です。このテーブルの可能な値は、「進行中」、「正常に完了」、「部分的に完了」、「教育クラスを完了していません」です。
student_presence
テーブルは、特定の講義の学生のプレゼンスに関するデータを格納するために使用されます。講義ごとに、インストラクターはすべての学生の存在および/または不在に注意することを想定できます。表の属性は次のとおりです。
-
student_id
–は学生への参照です
テーブル -
class_schedule_id
–はclass_scheduleへの参照です
テーブル 現在コード> –は、学生が講義に出席しているかどうかを示すブール値です
次のようなクエリを使用して、特定のクラスでの生徒のプレゼンスを監視できます(@id_classに必要なクラスIDが含まれていると仮定します)。
SELECT a.id、CONCAT(a.first_name、''、a.last_name)AS student_name、a.number_total、CONCAT(CONVERT(a.number_present / a.number_total * 100、DECIMAL(5,2))、 '%')ASパーセンテージ、a.attendance_outcomeFROM(SELECT student.id、student.first_name、student.last_name、SUM(CASE WHEN student_presence.present =True THEN 1 ELSE 0 END)AS number_present、COUNT(DISTINCT class_schedule.id)AS number_total、attendance_outcome.outcome_textASattendance_outcomeFROMクラスINNERJOIN出席ONclass.id=出席.class_idINNERJOIN学生ONattend.student_id=student.id LEFT JOIN class_schedule ON class_schedule.class_id =class.id LEFT JOIN student_presence ON student_ .id AND student_presence.class_schedule_id =class_schedule.id LEFTJOIN出席_outcomeON出席_outcome.id=出席.attendance_outcome_idWHEREclass.id=@id_classGROUP BY student.id、student.first_name、student.last_name、attendance_outcome.outcome_
「instructor_presence」テーブルは「student_presence」テーブルと同じロジックを使用しますが、ここではインストラクターに焦点を当てます。表の属性は次のとおりです。
-
instructor_id
–はインストラクターへの参照です
テーブル -
class_schedule_id
–はclass_scheduleへの参照です
テーブル 現在コード> –は、講師が講義に出席するかどうかを表すブール値です。
以下のクエリを使用して、クラスでのインストラクターのアクティビティを監視できます。
SELECT a.id、CONCAT(a.first_name、''、a.last_name)AS instructor_name、a.number_total、CONCAT(CONVERT(a.number_present / a.number_total * 100、DECIMAL(5,2))、 '%')ASパーセンテージ、a.teach_outcomeFROM(SELECT instructor.id、instructor.first_name、instructor.last_name、SUM(CASE WHEN instructor_presence.present =True THEN 1 ELSE 0 END)AS number_present、COUNT(DISTINCT class_schedule.id)AS number_total、teach_outcome.outcome_textASteach_outcomeFROMクラスINNERJOINTeacher ON class.id =Teacher.class_idINNERJOINインストラクターONteach.instructor_id=instructor.id LEFT JOIN class_schedule ON class_schedule.class_id =class.id LEFT JOIN instructor_pre .id AND instructor_presence.class_schedule_id =class_schedule.id LEFT JOIN Teacher_outcome ON Teacher_outcome.id =Teacher.teach_outcome_idWHERE class.id =@id_classGROUP BY instructor.id、instructor.first_name、instructor.last_name、teach_outcome。では、最後に担当者テーブルについて説明します。
誰に電話できますか?担当者テーブル
ほとんどの場合、緊急連絡先情報を保存する必要はありません(つまり、緊急の場合は、この担当者に連絡してください)。しかし、私たちが子供たちに教えるとき、これは変わります。法律または慣習により、私たちは教えている子供ごとに連絡担当者を置く必要があります。モデルテーブル内–
contact_person
、contact_person_type
およびcontact_person_student
–これを行う方法を示します。
contact_person
表は学生と関係のある人のリストです。もちろん、すべての親戚をリストする必要はありません。ほとんどの場合、学生ごとに1つか2つの連絡先があります。これは、学生が早めに出発する必要がある場合や希望する場合に、「誰に電話するか」を見つける良い方法です。表の属性は次のとおりです。
-
first_name
–は担当者の名前です -
last_name
–はその人の名前です -
contact_phone
–はその人の電話番号です -
contact_mobile
–はその人の携帯電話番号です -
contact_mail
–はその人のメールアドレスです
連絡先の詳細は必須ではありませんが、非常に便利です。
contact_person_type
tableは、 type_name
という単一の必須属性を持つ辞書です。 。このテーブルに格納されている値の例は、「mother」、「father」、「brother」、「sister」、または「uncle」です。
contact_person_student
テーブルは、担当者とそのタイプを学生と結び付ける多対多の関係です。表の属性は次のとおりです(すべて必須):
-
contact_person_id
–はcontact_personへの参照です
テーブル -
student_id
–は学生への参照です
テーブル -
contact_person_type_id
–はcontact_person_typeへの参照です
テーブル
この多対多の関係が3つのテーブルを相互に接続していることは言及する価値があるかもしれません。属性ペアcontact_person_id
およびstudent_id
代替(UNIQUE)キーとして使用されます。そうすることで、個々の学生を同じ担当者に接続する重複エントリを無効にします。属性contact_person_type_id
代替キーの一部ではありません。もしそうなら、同じ担当者と同じ学生に対して(異なるタイプの関係を使用して)複数の関係を持つ可能性があり、それは実際の状況では意味がありません。
この記事で紹介するモデルは、最も一般的なニーズをカバーできるはずです。それでも、モデルの一部が除外される場合があります。学生が大人の場合、連絡担当者セグメント全体はおそらく必要ありません。前にも言ったように、これにはやがて改善を加える予定です。自由に提案を追加し、ディスカッションセクションで経験を共有してください。