### "Textbausteine" der Klausurkorrektur: ### ER-Diagramm Es musste nicht das ganze ER-Diagramm nachgebaut werden. Termin als isolierter Entitätstyp ohne Bezug zu Person/Impfzentrum ist etwas problematisch, besser einfach als attrs zu Impfung, dann ist nur Datum local key. Impfung weak entity zu Person mit einer id. Beziehung -1 Impfung: weak, ja -> Kardinalität zu Person <1,1> -1/2 Impfung: weak, ja -> braucht eine <>-Beziehung -1/2 Nicht weak zu Impfzentrum -1/2 Key fehlt -1 Kardinalität zu Person <1,1> -1/2 Kardinalität zu Impfzentrum <1,1> -1/2 Kardinalität zu Arzt/Impfstoff <0,1> da zuerst noch nicht ausgefüllt -1/2 (nur 1x 1/2 abziehen) Kardinalität Impfzentrum zu Impfung <0,*> da am Anfang 0 -1/2 Kardinalität Impfstoff zu Impfung <0,*> (nach Zulassung noch nicht verimpft) -1/2 Kardinalität Person und Arzt zu Impfung <0,*>, am Anfang ja nichts. -1/2 -1/2 datum muss key sein -1/2 (wenn Datum und Uhrzeit getrennt, muss Uhrzeit nicht PK sein - SQL: beides in einem DATE) Attr abweichender "ort" "adresse" fehlt -1/2 (Dosis/Anzahl/Nummer kann man auch weglassen - ergibt sich aus Datum) Verbindung zu Arzt (incl Kardinalitäten) fehlt -1.5 Impfstoff nicht als attr, sondern als Bez. -1/2 (und -1 für Kardinalitäten) Arzt nicht als attr, sondern als Bez. -1/2 (und -1 für Kardinalitäten) Impfung kann man auch als Beziehung machen (Entitätstyp ist aber besser) (dann pro falsche Kardinalität 1P abgezogen, weil es ja nur 4 sind) Anbindung Arzt fehlt -1 (und -1 für Kardinalität) Anbindung Impfstoff fehlt -1 (und -1 für Kardinalität) Anbindung an Impfzentrum fehlt -1 (und -1 für Kardinalität) Nebenwirkungen? -4P Nebenwirkungen? nicht einfaches attr zu Impfung (hat ja mehrere Spalten und kann zu einer Impfung mehrfach auftreten) -4 Nebenwirkung: "wie in Aufgabe 3 beschrieben" keine Verbindung zum Impfstoff (diesen kann man ja über Person->Impfung rausfinden) -> es müsste ein Entitätstyp sein, keys? (2P) muss weak zu Person + <>-Beziehung sein -1 Wenn weak, muss es eine <1,1>-id-Beziehung haben -1/2 -1/2 Wenn weak, muss die <>-Beziehung <1,1> sein -1/2 Kardinalität <1,1> zu Person, immer wenn weak -1/2 Beschreibung auch key (man kann an einem Tag mehrere Nw haben) -1/2 key? -1 Datum auch key (man kann eine Nw an mehreren Tagen haben) -1/2 attr gefährlichkeit fehlt -1/2 Kardinalität Person zu Nebenwirkungen <0,*> (manche haben ja keine) Nebenwirkungen: Nicht zu Impfung. Dort ist (person, datum) key, aber das passt nicht zu der vorgegebenen Nebenwirkungen-Tabelle, man kann Nebenwirkungen an mehreren Tagen nach der Impfung haben; sondern zu Person -1 ### Transformation ins Relationale Modell PK fehlt -1 Person muss auch key sein (jede Person wird 2x geimpft, mit demselben Impfstoff, ggf selbes Impfzentrum) -1/2 Datum muss auch key sein -1/2 Impfstoff nicht zum PK (kann ja zu einem Datum nur einen bekommen) -1/2 Impfzentrum nicht zum PK (kann ja zu einem Datum nur eines sein) -1/2 FKs fehlen -2 Foreign key: 4 separate, mit Zielen angeben -1P Person muss auch FK sein -1/2 FK Person -> Person.ID auf PK -1/2 FKs: Arzt muss FK sein -1/2 FK Arzt muss auf dessen PK Person.id gehen -1/2 FK Arzt -> Person.ID, denn es gibt keine Tabelle Arzt -1/2 FK Impfzentrum fehlt -1/2 FK Impfstoff fehlt -1/2 FKs mit Zielen angeben -1 (wenn Datum und Uhrzeit getrennt, muss Uhrzeit nicht PK sein - SQL: beides in einem DATE) Spalte ort fehlt -1/2 Spalte Nebenwirkungen geht ja nicht, wenn jemand mehrere hatte -1/2 (Tab dafür war ja vorgegeben) (Tabellen für Nebenwirkungen und Impfung sollten hier nicht angegeben werden) Beispieltupel fehlen -1/2 Eingetragene Tupelwerte für Arzt müssen deren id sein, nicht der Name -1/2 +1/2 Zusatzpunkt von CREATE TABLE hier dazugebucht - bei Aufg 3 dazugebucht ### Anfragen (1) distinct -1/2 distinct name-> distinct kreis -1/2 Impfung hat aber keinen Kreis -> über Impfzentrum gehen + join-Bed -1 Impfung hat aber keinen Kreis (Tabelle Impfzentrum, join, pi) -1.5 rename impfzentrum[name->impfzentrum] -1/2 rename person[id->person] -1/2 person rho[id->person] muss mit dem PK joinen und Spaltenname übereinstimmen -1/2 "Person" und "Impfzentrum" haben beide eine Spalte "Stadt", die darf beim natürlichen Join nicht dabei sein -1/2 Join-Bedingung "und in diesem Impfzentrum" innen mit aussen -1/2 "arzt ist not null" +1/2 TODO ### Anfragen (2) count(*) statt sum(*) -1/2 woran erkennt man "bisher" und nicht "Termin in den nächsten Tagen"? -1/2 (sysdate: kann ein nicht wahrgenommener Termin sein, besser Arzt/Impfstoff is not null) Kreis, nicht Impfzentrum.Name (grp by Kreis!) Join-Bedingung fehlt -1/2 group by fehlt -1 das zählt die Impfzentren, aber nicht die Impfungen. -> Tabelle, join, woran erkennt man "bisher" und nicht "Termin in den nächsten Tagen"? noch 2P (nach einem grp by braucht man kein distinct mehr) +1 für die Kreise mit 0 es war aber die Summe über die Kreise gefragt => Tabelle Impfzentrum joinen, bedingung -1 ### Anfragen (3) MINUS (distinct braucht man nach Mengen-Ops nicht) Join-Bed innen mit aussen? -1 Innen nicht auf Tabelle "Impfzentrum" zugreifen, das ist ja die von draussen -1 aussen FROM Impfzentrum (falls in einem noch nie geimpft wurde, macht das einen Unterschied) -1/2 In der äußeren Subquery braucht man "Impfung" nicht. Es würde sogar dazu führen, dass Impfzentren, wo noch nicht geimpft wurde, im Ergebnis fehlen würden. -1/2 Das ergibt die Impfzentren, in denen irgendeine Personen, mit einem anderen Impfstoff geimpft wurde -> noch 1P ### Anfragen (4) MINUS-Baum (selbes Problem wie bei der SQL-Lösung) beide Seiten pi unter dem minus -1 Filter auf mRNA-1273 fehlt -1/2 Kommentar: "schon geimpft" wurde hier nicht (nochmal) bewertet, die Aufgabenstellung geht ja sowieso davon aus, dass Impfstoff null ist, wenn die Impfung noch nicht durchgeführt wurde. renaming vor dem minus -1/2 linker Unterbaum: Projektion vor dem minus -1/2 ### Anfragen (6) Komplexe Anfrage Subquery Impfungen: count(DISTINCT person) -1/2 Aussen: count(DISTINCT person) -1/2 Subquery Nebenwirkungen: count(DISTINCT person) -1/2 (jemand kann mehrere Nebenwirkungen haben) Beide subqueries: count(DISTINCT person) anstatt count(*) (wenn jemand mehrere Nw hat, bzw mehrmals geimpft wurde) -1 aussen: WHERE derselbe Impfstoff -1/2 In beiden Unterbäumen noch nach Impfstoff gruppieren -1 In beiden Unterbäumen noch nach Impfstoff gruppieren und im WHERE kombinieren und ausgeben -1.5P Select aussenherum, dann in beiden Unterbäumen noch nach Impfstoff gruppieren und im WHERE kombinieren und ausgeben -2P Select aussenherum, dann in beiden Unterbäumen noch nach Impfstoff gruppieren, in beiden count DISTINCT(person) und im WHERE kombinieren und ausgeben -3.5P (subquery: group by impfstoff braucht man nicht, es ist nur derselbe wie aussen) erste subquery: hier nicht mit Nebenwirkungen joinen (viele haben ja garkeine Nw) -1/2 aussen: group by impfstoff -1/2 subquery: WHERE derselbe Impfstoff wie aussen, nicht mit group by -1/2 innere subquery muss zur äußeren über Impfstoff korreliert werden -1 Problem, wenn für einen Impfstoff nie Nebenwirkungen registriert wurden -> Tupel fehlt, weil der Impfstoff beim Join total "wegfällt" -1/2 datum=datum muss nicht sein. Kann ja in den nächsten Tagen sein. -1/2 das zählt nur, wieviele Personen für einen Impfstoff Nebenwirkungen hatten. 2P (das DISTINCT braucht man dann nicht, ist ja nur je ein Tupel pro Impfstoff) (* 100 für Prozent) (division andersrum: neben / alle *100) ### CREATE TABLE ##################################################### PK fehlt -1 PK +Datum -1/2 PK +Kreis -1/2 PK (impfstoff,kreis,datum) -1/2 PK incl Datum -1/2 PK (impfstoff,kreis,datum) als Tabellenbedingung -1/2 PK (+impfstoff,kreis, datum) als Tabellenbedingung -1 PK (impfstoff,kreis,+datum) als Tabellenbedingung -1 anzahl im PK ist ein Entwurfsfehler: Wenn man mehrere Lieferungen pro Tag abbilden will, könnten die ja dieselbe Anzahl (nämlich 1 Paket) haben. Dann müsste man eher die Uhrzeit noch dazunehmen -1/2 FKs Impfstoff und Kreis fehlen -1 FKs einzeln, einzelne Constraints -1/2 FK Impfstoff fehlt -1/2 FK Kreis fehlt -1/2 Kreis FK refs -1/2 anzahl not null check (anzahl >0) -1/2 -1/2 check (anzahl >0) -1/2 anzahl not null -1/2 für das check date +1/2 man könnte auch noch > 01.12.2020 dazunehmen