sql >> Databáze >  >> RDS >> Database

Jak pomáhá návrh databáze organizovat učitele, hodiny a studenty?

Investice do znalostí se vyplatí nejlépe.

Benjamin Franklin

V moderním světě je vzdělání všudypřítomné. Nyní více než kdy předtím hraje důležitou roli v naší společnosti. Ve skutečnosti je tak důležité, že mnoho z nás pokračuje ve vzdělávání i po ukončení školy nebo vysoké školy.

Všichni jsme slyšeli o celoživotním vzdělávání, neformálním vzdělávání a workshopech pro všechny věkové kategorie. Tyto metody se v mnoha ohledech liší od formálního vzdělávání, ale mají také něco společného. Existují třídy, lekce, učitelé a studenti. A stejně jako v tradičním prostředí budeme chtít sledovat rozvrh hodin, údaje o docházce a úspěchy instruktora nebo studentů. Jak můžeme navrhnout databázi, aby vyhovovala těmto potřebám? Tomu se budeme věnovat v tomto článku.

Představujeme model naší vzdělávací databáze




Model uvedený v tomto článku nám umožňuje ukládat data o:

  • třídy/přednášky
  • lektoři/lektoři
  • studenti
  • návštěvnost přednášek
  • úspěchy studentů / lektorů

Tento model bychom také mohli použít jako školní rozvrh, pro jiné skupinové aktivity (lekce plavání, taneční workshopy) nebo dokonce pro individuální aktivity, jako je doučování. Stále je zde spousta prostoru pro vylepšení, jako je ukládání dat o poloze třídy nebo trvání workshopu; budeme se jim věnovat v nadcházejících článcích.

Začněme s našimi základními prvky databáze Education:tabulkami.

Velká trojka:Stoly pro studenty, učitele a třídy

student , instructor a class tabulky tvoří jádro naší databáze.

student výše uvedená tabulka slouží k ukládání základních údajů o studentech, lze ji však rozšířit podle konkrétních potřeb. S výjimkou tří atributů kontaktu jsou všechny atributy v tabulce povinné:

  • first_name – jméno studenta
  • last_name – příjmení studenta
  • birth_date – datum narození studenta
  • contact_phone – telefonní číslo studenta
  • contact_mobile – číslo mobilního telefonu studenta
  • contact_mail – e-mailová adresa studenta
  • category_id – je odkaz na category katalog. S touto strukturou jsme omezeni pouze na jednu kategorii na studenta. Ve většině případů to funguje, ale v některých situacích můžeme potřebovat místo pro seznam více kategorií. Jak vidíte, přidání vztahu many-to-many, který spojuje student tabulka s category slovník tento problém řeší. V tomto scénáři však budeme muset napsat poněkud složitější dotazy, abychom mohli zpracovávat naše data.

Když už jsme to zmínili, pojďme si probrat category tabulka zde.

Tato tabulka je slovník používaný k seskupování studentů na základě určitých kritérií. name atribut je jediným údajem v tabulce (kromě id , primární klíč) a je to povinné. Jedna sada hodnot, které zde mohou být uloženy, je zaměstnanecký status studenta:„student“, „zaměstnaný“, „nezaměstnaný“ a „v důchodu“. Mohli bychom také použít jiné sestavy založené na některých vysoce specifických kritériích, jako je „má rád jógu“, „má rád turistiku“, „rád jezdí na kole“ a „nic se mi nelíbí“.

instructor tabulka obsahuje seznam všech lektorů/lektorů v organizaci. Atributy v tabulce jsou:

  • first_name – jméno instruktora
  • last_name – příjmení instruktora
  • title – titul instruktora (pokud existuje)
  • birth_date – datum narození instruktora
  • contact_phone – telefonní číslo instruktora
  • contact_mobile – číslo mobilního telefonu instruktora
  • contact_mail – e-mailová adresa instruktora

title a všechny tři contact atributy nejsou povinné.

student stůl a instructor tabulka sdílí podobnou strukturu, ale existuje další možnost, jak tyto informace uspořádat. Druhým přístupem by bylo mít person tabulka (ve které jsou uložena všechna data zaměstnanců a studentů) a má vztah many-to-many, který nám říká všechny role přiřazené dané osobě. Nejdůležitější výhodou druhého přístupu je, že data uložíme pouze jednou. Pokud je někdo vyučujícím v jedné třídě a studentem v jiné, objeví se v databázi pouze jednou, ale s definovanými oběma rolemi.

Proč jsme pro náš model vzdělávací databáze zvolili dvoutabulkový přístup? Obecně se studenti a lektoři chovají odlišně, a to jak v reálném životě, tak v naší databázi. Z tohoto důvodu by mohlo být rozumné ukládat jejich data odděleně. Můžeme najít jiné způsoby, jak sloučit jakékoli informace o stejné osobě, které se objevují v obou tabulkách (např. dvojice dotazů pro vložení/aktualizaci na základě externího ID, jako je rodné číslo nebo DIČ).

class tabulka je katalog, který obsahuje podrobnosti o všech třídách. Můžeme mít více instancí každého typu třídy. Atributy v tabulce jsou následující (všechny jsou povinné kromě end_date ):

  • class_type_id – je odkaz na class_type slovník.
  • name – je krátký název třídy.
  • description – tento popis je konkrétnější než popis v class_type stůl.
  • start_date – datum zahájení kurzu.
  • end_date – datum ukončení lekce. Není to povinné, protože nemusíme vždy znát přesné datum ukončení každé třídy předem.
  • completed – je logická hodnota, která označuje, zda jsou dokončeny všechny plánované aktivity třídy. To je užitečné, když dosáhneme plánovaného end_time pro třídu, ale další aktivity třídy musí být ještě dokončeny.

class_type tabulka je jednoduchý katalog, určený k ukládání základních informací o přednáškách nebo hodinách nabízených studentům. Může obsahovat hodnoty jako „Anglický jazyk (skupina)“, „Polský jazyk (skupina)“, „Chorvatský jazyk (skupina)“, „Anglický jazyk (osobně)“ nebo „Výuka tance“. Má pouze dva povinné atributy – name a description , oba nepotřebují další vysvětlení.

class_schedule tabulka obsahuje konkrétní časy pro přednášky a hodiny. Všechny atributy v tabulce jsou povinné. class_id atribut je odkaz na class tabulka, zatímco start_time a end_time jsou časy začátku a konce konkrétní přednášky.

Kdo je tady? Tabulky související s docházkou

attend tabulka ukládá informace o tom, který student navštěvoval kterou hodinu, a konečný výsledek. Atributy v tabulce jsou:

  • student_id – je odkaz na student stůl
  • class_id – je odkaz na class stůl
  • class_enrollment_date – je datum, kdy student začal navštěvovat daný kurz
  • class_drop_date – datum, kdy žák vyučoval. Tento atribut bude mít hodnotu pouze v případě, že student ukončil kurz před datem ukončení kurzu. V takovém případě drop_class_reason_id musí být také nastavena hodnota atributu.
  • drop_class_reason_id – je odkaz na drop_class_reason stůl
  • attendance_outcome_id – je odkaz na attendance_outcome stůl

Všechna data kromě class_drop_date a drop_class_reason_id je požadováno. Tyto dvě položky budou vyplněny tehdy a pouze tehdy, když student kurz opustí.

drop_attendance_reason tabulka je slovník obsahující různé důvody, proč by student mohl ukončit kurz. Má pouze jeden atribut, reason_text a je to povinné. Příkladem souboru hodnot může být:„nemoc“, „ztracený zájem“, „nemám dostatek času“ a „jiné důvody“.

attendance_outcome tabulka obsahuje popis aktivity studentů v daném kurzu. outcome_text je jediný atribut v tabulce a je povinný. Sada možných hodnot je:"probíhá", "dokončeno úspěšně", "dokončeno částečně" a "nedokončeno třída".

Kdo to má na starosti? Tabulky související s výukou

teach , drop_teach_reason a teach_outcome tabulky používají stejnou logiku jako attend , drop_attendance_reason a attendance_outcome tabulky. Všechny tyto tabulky ukládají data o aktivitách instruktorů souvisejících s kurzem.

teach tabulka slouží k uložení informací o tom, který instruktor vyučuje kterou třídu. Atributy v tabulce jsou:

  • instructor_id – je odkaz na instructor stůl.
  • class_id – je odkaz na class stůl.
  • start_date – je datum, kdy instruktor začal na dané hodině pracovat.
  • end_date – je datum, kdy instruktor přestal pracovat na dané hodině. Není to povinné, protože nemůžeme předem vědět, zda bude instruktor učit do data ukončení kurzu.
  • drop_teach_reason_id – je odkaz na drop_teach_reason stůl. Není to povinné, protože vyučující nesmí lekci zrušit.
  • teach_outcome_id – je odkaz na teach_outcome_reason stůl.

drop_teach_reason tabulka je jednoduchý slovník. Obsahuje sadu možných vysvětlení, proč instruktor ukončil výuku před datem jejího ukončení. Existuje pouze jeden povinný atribut:reason_text . Může to být „nemoc“, „přesunuto na jiný projekt/práci“, „skončit“ nebo „jiný důvod“.

teach_outcome tabulka popisuje úspěch instruktora na konkrétním kurzu. outcome_text je jediným atributem tabulky a je povinný. Možné hodnoty pro tuto tabulku mohou být:„probíhá“, „úspěšně dokončeno“, „částečně dokončeno“ a „nedokončeno vyučování“.

student_presence tabulka slouží k ukládání dat o přítomnosti studentů na konkrétní přednášce. Můžeme předpokládat, že u každé přednášky vyučující zaznamená přítomnost a/nebo nepřítomnost všech studentů. Atributy v tabulce jsou:

  • student_id – je odkaz na student stůl
  • class_schedule_id – je odkaz na class_schedule stůl
  • present – je booleovské označení, zda je student na přednášce přítomen či nikoli

Mohli bychom monitorovat přítomnost studentů v konkrétní třídě pomocí dotazu, jako je ten, který následuje (za předpokladu, že @id_class obsahuje požadované ID třídy).

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 procento, 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, docházka_outcome.outcome_text AS docházka_outcomeFROM class INNER JOIN navštěvovat ON class.id =navštěvovat.class_id INNER JOIN student ON visit.student_id =student.id LEVÉ PŘIPOJENÍ class_schedule ON class_schedule.class_id =class.id LEFT JOIN student_presence. .id AND student_presence.class_schedule_id =class_schedule.id LEFT PŘIPOJIT SE prezence_outcome ON docházka_outcome.id =navštěvovat.attendance_outcome_idWHERE class.id =@id_classGROUP BY student.id, student.first_name, student.last_name, docházka_outcome. 

Tabulka „instructor_presence“ používá stejnou logiku jako tabulka „student_presence“, ale zde se chceme zaměřit na instruktory. Atributy v tabulce jsou:

  • instructor_id – je odkaz na instructor stůl
  • class_schedule_id – je odkaz na class_schedule stůl
  • present – je booleovská hodnota představující, zda je vyučující na přednášce přítomen nebo ne

Dotaz níže bychom mohli použít ke sledování aktivity instruktora ve třídě:

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)), '%') JAKO procento, 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) number_total, learn_outcome.outcome_text AS learn_outcomeFROM class INNER JOIN učit ON class.id =learn.class_id INNER JOIN instructor ON learn.instructor_id =instructor.id LEFT JOIN class_schedule ON class_schedule.class_id =class.id LEFT instructor_presence id in =instructorinstructor JOIN .id AND instructor_presence.class_schedule_id =class_schedule.id VLEVO PŘIPOJIT SE UČIT_outcome ON learn_outcome.id =learn.teach_outcome_idWHERE class.id =@id_classGROUP BY instructor.id, instructor.first_name, instructor.outNyní skončeme diskusí o tabulkách kontaktních osob.

Komu můžeme zavolat? Tabulky kontaktní osoby

Ve většině případů nepotřebujeme ukládat nouzové kontaktní informace (tj. v případě nouze kontaktujte tuto osobu). To se však mění, když učíme děti. Podle zákona nebo zvyklostí musíme mít pro každé dítě, které vyučujeme, kontaktní osobu. V našich modelových tabulkách – contact_person , contact_person_type a contact_person_student – předvedeme, jak toho lze dosáhnout.

contact_person tabulka je seznam lidí, kteří mají vztah ke studentům. Samozřejmě nemusíme uvádět všechny příbuzné; většinou budeme mít jeden nebo dva kontakty na studenta. Je to dobrý způsob, jak najít „komu zavoláte“, když student potřebuje nebo chce odejít dříve. Atributy v tabulce jsou:

  • first_name – je jméno kontaktní osoby
  • last_name – je příjmení osoby
  • contact_phone – je telefonní číslo osoby
  • contact_mobile – je číslo mobilního telefonu dané osoby
  • contact_mail – je e-mailová adresa osoby

Kontaktní údaje nejsou povinné, i když jsou velmi užitečné.

contact_person_type table je slovník s jediným povinným atributem:type_name . Příklady hodnot uložených v této tabulce jsou:„matka“, „otec“, „bratr“, „sestra“ nebo „strýc“.

contact_person_student tabulka je vztah mnoho k mnoha, který spojuje kontaktní osoby a jejich typ se studenty. Atributy v tabulce jsou (všechny jsou povinné):

  • contact_person_id – je odkaz na contact_person stůl
  • student_id – je odkaz na student stůl
  • contact_person_type_id – je odkaz na contact_person_type stůl

Možná stojí za zmínku, že tento vztah many-to-many spojuje dohromady tři tabulky. Dvojice atributů contact_person_id a student_id se používá jako alternativní (UNIQUE) klíč. Tímto způsobem zakážeme duplicitní záznamy, které spojují jednotlivé studenty se stejnou kontaktní osobou. Atribut contact_person_type_id není součástí alternativního klíče. Pokud ano, mohli bychom mít více vztahů pro stejnou kontaktní osobu a stejného studenta (pomocí různých typů vztahů), a to v situacích skutečného života nedává smysl.

Model uvedený v tomto článku by měl být schopen pokrýt většinu běžných potřeb. Části modelu však mohou být v některých případech vyloučeny, např. pravděpodobně bychom nepotřebovali celý segment kontaktních osob, pokud jsou naši studenti dospělí. Jak jsem již řekl, časem k tomu přidáme vylepšení. Neváhejte přidávat návrhy a sdílet své zkušenosti v diskusních sekcích.


  1. Nahraďte první výskyt podřetězce v řetězci v SQL

  2. Změňte oddělovač na čárku ve výsledcích dotazu SQLite

  3. MySQL COUNT DISTINCT

  4. Jak PERIOD_ADD() funguje v MariaDB