Primärschlüssel/Fremdschlüsselbeziehungen on delete

Casutti

Benutzer
Beiträge
7
Hallo zusammen,

ich hätte eine Frage zu folgender Situation: es liegt eine ternäre Beziehung "spielt (InstrumentenNR, MusikerNr, BandNr, von, bis) zwischen den Entities "Instrument", "Musiker", "Band", die Relation "spielt" hat den Primärschlüssel (InstrumentenNr,MusikerNr,BandNr), die natürlich als Fremdschlüssel auf Instrument(InstrumentenNr), Musiker(MusikerNr) bzw. Band(BandNr) verweisen, nun sollen folgende Fremdschlüssel constraints angelegt werden:
(1)ein Musiker kann nur gelöscht werden, wenn er nicht mehr in einer Band spielt,
(2)wird ein Instrument gelöscht, so soll an der entsprechenden Stelle in der Relation "spielt" NULL stehen
(3)wird eine Band gelöscht, soll das ganze Tupel in "spielt" gelöscht werden,

MusikerNr, InstrumentenNr und BandNr sind die Teile des Primärschlüssels, diese dürften doch niemals den Wert NULL bekommen, oder? also (2) ist meiner Meinung nach nicht möglich
(3) sollte mit on delete cascade gehen, oder?
und ist (1) möglich?
Über Rückmeldungen würde ich mich sehr freuen.
Viele Grüße!
 
Werbung:
Was ist der Hintergrund Deiner Frage? Versuchst Du Deinem Lehrer nachzuweisen, dass seine Aufgabenstellung mangelhaft ist? Bist Du selbst der Lehrer und Dir fällt keine passende Aufgabe ein? Oder brauchst Du einfach eine Lösung für Deine Hausaufgaben?

Fremdschlüssel Constraints in dieser Form als Lösung für ein „Verhalten“ der DB zu postulieren scheint mir problematisch. Fremdschlüssel beschreiben m.E. primär eine Beziehung zwischen 2 Mengen, meinetwegen auch als Regelwerk zu bezeichnen, das bei nicht Einhaltung verletzt wird und Fehler erzeugt. Die resultierenden Möglichkeiten sind dabei hauptsächlich durch die Verweisrichtung vorgegeben und durch Einsatz eines Not Null Constraints.
Delete Cascade ist dabei kein Constraint, sondern eine Constraint Option, die (fragwürdigen) „Komfort“ bringt.
Das vorgelegte (oder avisierte) Datenmodell nutzt nun zunächst Fremdschlüssel für eine Relationstabelle, soweit okay. Diese Schlüssel können gemeinsam auch einen Primärschlüssel bilden.
Die Nummer mit dem Instrument ist dabei aber ein Knackpunkt. Die NOT NULL Regel für PK hast Du ja schon genannt.
Dann müsste man überlegen, was einem wichtiger ist und was man wirklich erreichen will und sinnvoll ist (Im Sinne echter Nutzung). Gibt man den PK Ansatz auf, könnte man den fast gleichen Effekt mit einem Unique Constraint (Index) erreichen* und die Instrumenten Löschung (2) mit ON DELETE SET NULL* realisieren.

Insgesamt scheint mir das Modell aber recht akademisch.
Wer würde Instrumente löschen?
(Auch wenn der Dudelsack schon kurz vor dem Aussterben ist.)
Warum werden Einträge insgesamt wieder entfernt, wenn sie mal Gültigkeit besaßen?
Daten sind Schätze, die mittlerweile nie wieder gelöscht werden.
Warum wird statt dessen kein Status verwendet oder ein Gültigkeitszeitraum?
(die Spalten wurden ja sogar schon erwähnt)
Warum wird ON DELETE .. überhaupt verwendet!?
* In einem echten System kann der Einsatz sehr unangenehme Folgen haben.
Wem bringt das NULL Instrument etwas?!
* NULL Werte sind immer problematisch im Vergleich, auch für „Unique“ Constraints. Schau Dir genau an, was bei solchen Constraints passieren kann!
 
Werbung:
Also folgender Hintergrund: das ist Teil einer alten Examensaufgabe, die ich zur Vorbereitung lösen möchte. Wenn ich bei der Vorbereitung auf Unsicherheiten meinerseits stoße, versuche ich solange in Büchern etc. zu suchen bis ich das zufriedenstellend gelöst habe- einfach um die Sache wirklich voll und ganz zu verstehen.
Zu den „delete on“ Befehlen finde ich überall nur deren Aufbau und Auswirkung aber nirgends in welchen Fällen man sie teilweise gar nicht nehmen kann, also ich habe dazu nie Beispiele gefunden bei denen der Fremdschlüssel gleichzeitig Primärschlüssel ist.
In der Aufgabe gab es zB noch die Einschränkungen:
*ein Musiker darf ein bestimmtes Instrument nur in einem Zeitraum (von, bis) spielen, daher musste ich für „spielt“ hier (Musikernr, Bandnr, instrumentennr) als Primärschlüssel nehmen.
* ein Musiker darf nur gelöscht werden, wenn er nicht mehr in einer Band spielt.
Als ich letzteres in der create table Klammer umsetzen wollte, bin ich eben stutzig geworden, da musikernr ja auch zum Primärschlüssel gehört und somit gar nicht einfach gelöscht werden kann - höchstens das ganze zugehörige Tupel, oder?
Angenommen musikernr wäre nicht Teil des Schlüssels, könnte man dann diesen Teil mit einem „Check“ hinbekommen?
Viele Grüße und vielen Dank!
 
Zurück
Oben