Die HSAweb-Datenbank
(Beispiel für ein etwas umfangreicheres Datenmodell)

HSAweb-DB: Use-Cases

Für die HSA sol­le ein neu­er Web-Auf­tritt erstellt wer­den, der die Zusam­men­hän­ge zwi­schen Stu­di­en­gän­gen, Lehr­ver­an­stal­tun­gen, Leh­ren­den und Fakul­tä­ten erläu­tert. Im fol­gen­den Dia­gramm sehen Sie ein paar der mög­li­chen Use Cases. In Wikr­lich­keit gibt es natür­lich viel mehr.
HSAweb-DB: ModellHSA­web-DB: Use-Cases

Auf eine aus­führ­li­che Dar­stel­lung der Infor­ma­tio­nen, die der Benut­zer jeweils zu sehen bekommt, wird hier bewusst ver­zich­tet, da sich der Inhalt die­ser Sei­te sonst zu sehr auf­blä­hen wür­de. Die Attri­bu­te wer­den erst im Rela­tio­na­len Daten­bank­sche­ma auf­ge­führt.

Beach­ten Sie aber, dass nicht alle Use Cases auf die Daten­bank zugrei­fen. Die Rech­te­ver­wal­tung wird über LDAP abge­wi­ckelt. Daher ist eine Spei­che­rung von Log­in-Daten etc. nicht Bestand­teil des nach­fol­gen­den Daten­mo­dells.

HSAweb-DB: Datenmodell

An der Hoch­schu­le Augs­burg gibt es Fakul­tä­ten, Stu­di­en­gän­ge, Leh­ren­de und Lehr­ver­an­stal­tun­gen (sowie diver­se wei­te­re Insti­tu­tio­nen, die hier nicht berück­sich­tigt wer­den).

Jeder Stu­di­en­gang ist einer Fakul­tät zuge­ord­net. Es kön­nen sich aller­dings meh­re­re Fakul­tä­ten dar­an betei­li­gen. Bei­spiels­wei­se ist der Stu­di­en­gang „Inter­ak­ti­ve Medi­en“ der „Fakulät für Gestal­tung“ zuge­ord­net. Die Fakul­tä­ten für „Gestal­tung“ und „Infor­ma­tik“ sind dar­an betei­ligt. Am Stu­di­en­gang „Mecha­tro­nik“ sind sogar drei Fakul­tä­ten betei­ligt.

Für jede Stu­di­en­gang wer­den Lehr­ver­an­stal­tun­gen ange­bo­ten (zuge­ord­net). Umge­kehrt kann auch eine Lehr­ver­an­stal­tung für meh­re­re Stu­di­en­gän­ge ange­bo­ten wer­den. Bei­spiels­wei­se wird die Ver­an­stal­tung „Pro­jekt­ma­nage­ment“ von Wolf­gang Kowar­schick für4 Stu­di­en­gän­ge ange­bo­ten.

Leh­ren­de hal­ten die Lehr­ver­an­stal­tun­gen. Jeder Leh­ren­de kann meh­re­re Ver­an­stal­tun­gen abhal­ten und eine Ver­an­stal­tung, wie zum Bei­spiel das Medi­en­pro­jekt, kann von meh­re­ren Leh­ren­den gleich­zei­tig gehal­ten wer­den. Ein Leh­ren­der ist genau einer Fakul­tät zuge­ord­net und belie­big vie­len Stu­di­en­gän­gen. (Sie oder er kann auch Lehr­ver­an­stal­tun­gen an ande­ren Stu­di­en­gän­gen hal­ten, wird aber nicht an der Wei­ter­ent­wick­lung die­ser Stu­di­en­gän­ge mit­ar­bei­ten.)

Ein Pro­fes­sor ist ein spe­zi­el­ler Leh­ren­der. Er (oder sie) hält nicht nur Lehr­ver­an­stal­tun­gen ab, son­dern kann auch Ämter an sei­ner Stamm­fa­kul­tät (wie Dekan oder Biblio­theks­be­auf­trag­ter) oder an sei­nen Stu­di­en­gän­gen (wie Prü­fungs­kom­mis­si­ons­vor­sit­zen­der oder Prak­ti­kan­ten­be­auf­trag­ter) über­neh­men.

HSAweb-DB: ModellHSA­web-DB: Daten­mo­dell

Sie sehen, dass die­ses Modell sechs Enti­ty-Tabel­len defi­niert und, neben fk_amt und sg_amt, vier wei­te­re m:n-Beziehungen, d.h. ins­ge­samt sechs Rela­ti­ons­ship-Tabel­len:

  • amt_fk
  • amt_Stg
  • fk_beteiligt_stg
  • lehr_zugeordnet_stg
  • lehr_haelt_lv
  • stg_zugeordnet_lv

(Im obi­gen Dia­gramm sind aus Grün­den der Über­sicht­lich­keit jeweils nur die Kurz­be­zeich­nun­gen beteiligt, haelt und (mehr­fach) zugeordnet ein­ge­tra­gen.

Das Rela­tio­na­le Daten­bank­sche­ma, das in Kurz­form die zu defi­nie­ren­den Tabel­len beschreibt, sieht ent­spre­chend fol­gen­der­ma­ßen aus (aus Über­sicht­lich­keits­grün­den wur­den in dem nach­fol­gen­den Dia­gramm 14 For­eign-Key-Pfei­le weg­ge­las­sen; es wur­de nur tex­tu­ell beschrie­ben, wel­che Pfei­le noch hin­zu­ge­fügt wer­den müs­sen):

HSAweb-DB: ModellHSA­web-DB: Rela­tio­na­les Daten­bank­sche­ma

Das voll­stän­di­ge Rela­tio­na­le Daten­bank­sche­ma wird in Text­form ange­ge­ben:

DOMAIN D_ANREDE           = CHAR(4)      
  CHECK (VALUE IN ('Herr', 'Frau'))
DOMAIN D_ABSCHLUSS        = VARCHAR(8)   
  CHECK (VALUE IN ('Bachelor', 'Master'))
DOMAIN D_STATUS_LEHRENDER = VARCHAR(16)  
  CHECK (VALUE IN ('Professor', 'Lehrbeauftragter'))
DOMAIN D_KUERZEL          = VARCHAR(10)  
  CHECK (VALUE ~* '\A[\wäöüß_.\-$]+\Z')
DOMAIN D_TITEL            = VARCHAR(20)
  CHECK (VALUE ~* '\A[\wäöüß_.@$+\-/()\s]+\Z')
DOMAIN D_NAME             = VARCHAR(100)
  CHECK (VALUäöü ~* '\A[\wäöüß_.@$+\-/()\s]+\Z')
DOMAIN D_EMAIL            = VARCHAR(100)
  CHECK (VALUE~*'\A[a-z0-9.!#$%&''*+/=?^_`{|}~-]+@[a-z0-9-]+(?:\.[a-z0-9-]+)*\Z')
  -- W3C: https://www.regextester.com/97767
DOMAIN D_TELEFON          = VARCHAR(100)
  CHECK (VALUE ~ '\A[0-9][0-9\-/()\s]*\Z')
DOMAIN D_DIENSTZIMMER     = VARCHAR(6)
  CHECK (VALUE ~ '\A[A-Z][0-9][.][0-9][0-9][a-z]?\Z')
DOMAIN D_SPRECHSTUNDE     = VARCHAR(50)
  CHECK (VALUE ~* '\A[\wäöüß_.!:,;+\-/()\s]+\Z')

fakultaet:
  f_id INTEGER, f_kuerzel D_KUERZEL, f_name D_NAME,
  f_email D_EMAIL*, f_tel D_TELEFON,
  PK: f_id, UNIQUE: f_kuerzel

studiengang: 
  s_id INTEGER, s_kuerzel D_KUERZEL, s_name D_NAME,
  s_abschluss D_ABSCHLUSS, s_titel D_NAME, 
  s_zugeordnet_zu INTEGER,
  PK: s_id, UNIQUE: s_kuerzel, 
  FK: s_zugeordnet_zu -> fakultaet(f_id)

lehrender:
  l_id INTEGER, l_kuerzel D_KUERZEL, l_anrede D_ANREDE,
  l_titel _TITEL*, l_name D_NAME, l_email D_EMAIL*,    
  l_zugeordnet_zu INTEGER, 
  l_status D_STATUS_LEHRENDER = 'Lehrbeauftragter',
  PK: l_id, UNIQUE: l_kuerzel, 
  FK: l_zugeordnet_zu -> fakultaet(f_id)

professor:
  l_id INTEGER, p_dienstzimmer D_DIENSTZIMMER, p_sprechstunde D_SPRECHSTUNDE,
  PK: l_id, FK: l_id -> lehrender(l_id)

lehrveranstaltung:
  lv_id INTEGER, lv_kuerzel D_KUERZEL, lv_titel D_NAME,
  lv_zugeordnet_zu INTEGER,
  PK: lv_id, FK: lv_zugeordnet_zu -> fakultaet(f_id)

amtsbeschreibung:
  ab_id INTEGER,
  ab_bez_weiblich VARCHAR(50), 
  ab_bez_maennlich VARCHAR(50), 
  ab_bez_plural VARCHAR(50),
  PK (ab_id)

amt_fk:
  f_id INTEGER, l_id INTEGER, ab_id INTEGER,
  PK: l_id, ab_id,
  FK: f_id  -> fakultaet(f_id),
  FK: l_id  -> professor(l_id),
  FK: ab_id -> amtsbeschreibung(ab_id)

amt_stg:
  s_id INTEGER, l_id INTEGER, ab_id INTEGER,
  PK: s_id, l_id, ab_id,
  FK: s_id  -> studiengang(s_id),
  FK: l_id  -> professor(l_id),
  FK: ab_id -> amtsbeschreibung(ab_id)

fk_beteiligt_stg:
  f_id INTEGER, s_id INTEGER,
  PK: f_id, s_id,
  FK: f_id  -> fakultaet(f_id),
  FK: s_id  -> studiengang(s_id)
            
lehr_zugeordnet_stg:
  l_id INTEGER, s_id INTEGER,
  PK: l_id, s_id,
  FK: l_id  -> lehrender(l_id),
  FK: s_id  -> studiengang(s_id)

lehr_haelt_lv:
  l_id INTEGER, lv_id INTEGER,
  PK: l_id, lv_id,
  FK: l_id  -> lehrender(l_id),
  FK: lv_id -> lehrveranstaltung(lv_id)

stg_zugeordnet_lv
  s_id INTEGER, lv_id INTEGER,
  PK: s_id, lv_id,
  FK: s_id  -> studiengang(s_id),
  FK: lv_id -> lehrveranstaltung(lv_id)

SQL-Dateien

hsaweb-create.sql(Daten­bank erstel­len)
hsaweb-data.sql(Daten ein­fü­gen)
hsaweb-query.sql(Prak­ti­kums­auf­ga­be HSA-Web)
hsaweb-query-solution.sql(Lösungs­vor­schlä­ge zur Prak­ti­kums­auf­ga­be)
hsaweb-trigger.sql(Prak­ti­kums­auf­ga­be HSA-Web-Trig­ger)
hsaweb-trigger-solution.sql(Lösungs­vor­schlä­ge zur Trig­ger­auf­ga­be)
hsaweb-fulltext.sql(Prak­ti­kums­auf­ga­be HSA-Web-Voll­text­su­che)
hsaweb-fulltext-solution.sql(Lösungs­vor­schlä­ge zur Voll­text­auf­ga­be)