SQL Management Studio - Schwache Beziehung

GinoBambino

Lt. Commander
Registriert
Sep. 2012
Beiträge
1.064
Hallo @ all,

ich möchte gerne im SQL Management Studio eine Entität mit einer schwachen Beziehung zu einer übergeordneten Entität definieren.

Angenommen, ich habe eine Tabelle "KUNDE" mit dem Primärschlüssel "KundeNr". In der Tabelle "KUNDE_PLZ" möchte ich nun Kunden und Postleitzahlen miteinander verknüpfen.

Die Beziehung soll schwach sein, das heißt es soll eine existenzielle Abhängigkeit der Entitäten in der Tabelle "KUNDE_PLZ" von der Tabelle "KUNDE" geben. Habe ich eine bestimmte Kundennummer nicht vergeben, darf diese nicht in der Tabelle "KUNDE_PLZ" auftauchen.

Darüber hinaus sollen Entitäten aus der Tabelle "KUNDE_PLZ" gelöscht werden, wenn ihre gleichnamigen Pendants in der Tabelle "KUNDE" entfernt werden.

Ich habe dank google bereits im SQL Management Studio eine Beziehung zwischen den beiden Feldern der beiden Tabellen hergestellt. Diese sieht wie folglt aus:+

506499c4eaffd.jpg


Wie schaffe ich es nun, dass ich die Art der Beziehung noch entsprechend definieren kann?
 
Ich könnte mich irren, aber ist diese Verknüpfung an sich nicht mehr oder weniger schon schlecht? Habe ich es richtig verstanden, dass du in der Tabelle KUNDE die eigentlichen Kunden hinterlegst und in der Tabelle KUNDE_PLZ zu jeder KundenNr. eine PLZ speicherst (damit meine ich direkt speicherst, also z.B.: Kdnr:123456789 - PLZ:15474)?

Das wäre m.M.n. schlechtes Design, da nicht 3. Normalform. Besser ist es, eine eigene Tabelle PLZ zu erstellen. In dieser hast du als PK eine einfache ID, die automatisch hochzählt und immer eine PLZ.
In einer weiteren Tabelle KUNDE_PLZ_CONNECTION speicherst du dann die KundenNr. und die ID der PLZ des Kunden. Das wäre vom Design her besser.
Beim Einfügen der Daten gibt der Kunde ja dann sein PLZ an. Du guckst dann einfach in der Tabelle PLZ, ob die PLZ schon existiert (wenn nicht wird sie eben neu erstellt) und fügst dann einen neuen Datensatz zur Tabelle KUNDE_PLZ_CONNECTION mit der KundenNr. und der PLZ-ID hinzu.

So umgehst du auch das Problem der Löschung, denn hier ist es nicht schlimm, wenn mal eine PLZ in der Tabelle PLZ ungenutzt ist, da diese ja trotzdem noch für neue Kunden verwendbar sind.

Du musst dir dann eben noch einen Trigger bauen, der bei Löschung eines Kunden aus der Tabelle KUNDE anhand dessen Kudnenummer auch den zugehörigen Datensatz aus Tabelle KUNDE_PLZ_CONNECTION löscht.

Ich hoffe ich hab mich einigermaßen verständlich ausgedrückt :)
 
Zuletzt bearbeitet:
Ich muss eig. keine Tabelle KUNDE und KUNDE_PLZ erstellen, sondern habe es nur zu Demonstrationszwecken gemacht. Dafür macht es nämlich Sinn die Tabellen so zu erstellen.

In der tatsächlichen Praxis könnte man das natürlich so machen wie du es sagst, aber würde es nicht zwingend tun. Die Tabelle KUNDE ist auch so bereits in der dritten Normalform, da keine transitiven Abhängigkeiten existieren (d.h. alle Nicht-Schlüssel-Attribute sind nichttransivitv vom Primärschlüssel abhängig).

Der Vorteil deiner Lösung besteht natürlich darin, dass PLZs ohne Kunden existieren können (= starke Entität). In meinem Beispiel kann es PLZs nur geben, wenn es entsprechende Kunden gibt.

Aber das ist alles eine Frage der Anforderungen^^
 
Das die Tabelle KUNDE bereits in der 3. NF. ist stimmt natürlich :) Mir gings eher ums Design der Datenbank. Ich weiß natürlich nicht wie die Anforderungen aussehen. Trotzdem ist ja das Problem damit auch lösbar, da dann keine schwachen Entities mehr existieren können und du die Kunden einfach per Trigger aus der Verknüpfungstabelle kicken kannst.

Direkt helfen kann ich dir aber leider nicht, da ich null Erfahrung mit SQL Management Studio hab :)
 
Ja, das stimmt. Schön wäre es jetzt halt noch, wenn ich irgendwie eine Regel aufstellen könnte, sodass Entitäten, deren Attribut der Primärschlüssel einer übergeordneten Tabelle ist, automatisch gelöscht werden, wenn ihre übergeordneten Entitäten ebenfalls gelöscht werden.

Mal gucken, vielleicht meldet sich noch jemand hier :)

Mit welchen Datenbank-Tools arbeitest du (falls du welche benutzt)?
 
Ich bin bisher noch nicht auf derart umfangreiche Datenbanken gestoßen, wo ich auf größere Tools setzen musste (außer vllt. phpmyadmin bei einem Uni-Projekt :) ). Habe mit Datenbanken bisher auch eher direkt in kleinen Anwendungen (Android Apps) gearbeitet.

Wäre dein Problem nicht mit einem Trigger lösbar? Da kannst du bei bestimmten SQL Events wiederrum SQL Abfragen machen. Ich kann mich aber gerade nicht an die genaue Syntax erinnern.
 
Zuletzt bearbeitet:
Zurück
Oben