DB- Schema Gruppierung

Generic1

Benutzer
Beiträge
11
Hallo,

das ist mein erster Thread hier und ich möchte mich gleich mal bedanken für Eure Beiträge und bitte um Verständnis, wenn ich noch nicht alles richtig macher hier.
Mein Datenbankwissen, welches nie sehr groß war, ist ziemlich verrostet, da ich schon lange nichts mehr in diese Richtung gemacht hab. Deshalb würde ich auf eure Hilfe hoffen.
Ich hab folgenden Sachverhalt wie im Bild im Anhang.
Generell (also losgekoppelt von Tabellen): ich habe Hunde und Katzen und möchte diese gruppieren. Daher hab ich das untere erste Design mal gezeichnet - dieses geht natürlich nicht, da sich die IDs von Hund und Katze ausschließen müssten, also Ids die in der Hund- Tabelle vorkommen, dürften nicht in der Katze- Tabelle vorkommen und umgekehrt.

Meine Frage wäre jetzt, wie ihr diese Gruppierungen realisieren würdet bzw. Hinweise, wie man das am Besten lösen kann

Vielen Dank und schöne Grüße.
Generic1
 

Anhänge

  • DB-Design.png
    DB-Design.png
    10,4 KB · Aufrufe: 12
Werbung:
Also da gibt es mehrere Lösungsansätze:

A) Ich würde Hunde und Katzen in eine Tabelle Tiere schreiben und dieser Tabelle das Atribut (Spalte) Typ mit der Unterscheidung Hund oder Katze mit geben. Das kann auch ein Fremdschlüssel auf eine weitere Tabelle sein wenn du es sehr stark normalisieren möchtest, der Einfachheit halber würde ich in der Praxis aber erstmal Hund oder Katze in die Spalte schreiben.
Vorteile: Jedes Tier hat eine eindeutige ID, es ist gut erweiterbar und du hast nur wenige Tabellen im Einsatz (Abfragen werden eher einfacher als komplex).
Nachteil: Wenn deine Tiere Eigenschaften bekommen die sich nur auf eine der Tierarten bezieht, sagen wir Beispielsweise Anzahl der Schnurbarthaare bei Katzen, wäre diese Spalte bei Hunden immer leer, also überflüssig. Da die Atribute bei Hunden und Katzen aber sehr ähnlich sein dürften sehe ich hier kein Problem. Das kommt erst zum tragen, wenn deine Tabelle sehr viele sehr unterschiedliche Tiere aufnimmt aber auch hier kann man mit weiteren Tabellen Abhilfe schaffen.

B) Du schreibst selbst eine Funktion / Einschränkung die die ID ermittelt und eindeutig hält. Großer Nachteil bei dem Modell ist aber das deine DB anhand der ID der Zwischentabelle erst alle Tabellen durchsuchen muss um festzustellen, auf welches Tier sie zeigt.

C) Du erweiterst deine Zwischentabelle um eine Spalte, die auf die Tabelle zeigt. Also z.B. Tabelle Hund ID 1 kann dann problemlos gefunden werden, deine ID muss nicht mehr eindeutig sein. Großer Nachteil: Du wirst viel Aufwand betreiben müssen um mehrere unterschiedliche Tierarten gleichzeitig auszugeben. Ein Join kann sowas nicht automatisch auswerten.

Ich würde in jedem Fall A empfehlen. Wichtig wäre aber noch zu wissen ob es hier darum geht wirklich nur diesen simplen Sachverhalt abzubilden oder ob das ganze erweitert werden soll und ob es hier darum geht ein theoretisches Konstrukt möglichst speicherschonend abzubilden oder ob wir hier Geschwindigkeit und Übersicht vor Speichervolumen stellen.
 
Vielen Dank für deine Antwort!!! Hat mir schon sehr geholfen.
Es ist jetzt so, dass Hunde und Katzen - wie du schon geschrieben hast, die gleichen Spalten in der DB hätten und deshalb in einer Tabelle zusammengefasst werden könnten mit einer Column (Enum -> Hund|Katze).
Der einzige Unterschied ist, dass Hunde registrierte Tiere sind und deshalb einen art "Nachnamen" haben sollen, welchen die Katzen nicht haben (Katzen haben nur einen (Vor-)Namen).
D.H also, dass der Nachname bei den Katzen immer leer wäre, was eher unschön ist.
Erweitert werden kann die Tabelle übrigens nicht mehr - Es kommen nur Hunde und Katzen vor - und keine weiteren Tiere. Geschwindigkeit und Übersicht stehen auf alle Fälle vor Speichervolumen -> es ist nicht so zeitkritisch, wenngleich die Performance shcon halbwegs passen soll.
Mir gefällt der Ansatz A auch sehr gut muss ich sagen, mit dem NAchteil, dass die Nachnamen bei den Katzen immer leer sind.
Gebe es da noch einen Ansatz, dass in die Normalformen zu bringen?

Vielen Dank für deine Hilfe und lg
Generic1
 
Nun du könntest zu deiner Tabelle Tiere noch eine Tabelle Tier-Eigenschaften machen. Dann stünde in der Tabelle Tiere alles drin was alle Tiere haben und die Tabelle Tier-Eigenschaften hätte dann für jedes Tier und jedes weitere Atribut einen weiteren Eintrag mit
PK, TierID_FK, EigenschaftID_FK (oder einfach den Atributnamen "Nachname"), Wert (also dem tatsächlichen Nachnamen)

Das Prinzip nennt sich EAV und wurde hier von mir auch schon mit Autos erklärt:
https://www.datenbankforum.com/thre...abhaengigkeiten-untereinander.1606/#post-8222
http://en.wikipedia.org/wiki/Entity–attribute–value_model

In deinem Fall würde ich aber aus mehreren Gründen davon Abstand nehmen es geht ja nur um eine Spalte. Die Komplexität von Abfragen erhöht sich enorm und das ist für eine Spalte nicht sinnvoll. Du könntest eine Tabelle machen die nur die Spalte Nachname und einen FK auf Tier hat, aber wozu der Aufwand um ein paar NULL-Werte zu vermeiden?
 
Vielen Dank nochmal für die Antwort. EAV scheint mir auch zu umfangreich wegen ein paar null values.
Ich hätte jetzt nochmal einen Ansatz probiert und diesen gezeichnet.
Was würdest Du zu diesem Ansatz sagen - er erscheint mir ziemlich einfach und Abfragne (joins) dürften auch nicht so umfangreich/teuer sein und null- values hätte ich auch nicht.

Bei der Lösung mit einer Tiertabelle mit einer FK- Spalte zu einer Hund Attribute- Tabelle hätte ich ja bei den Katzen in der Tiertabelle null- values - oder versteh ich da was falsch?

Wäre dir sehr dankbar, wenn du diesen Ansatz bewerten könntest.
Vielen Dank und lg
Generic1
 

Anhänge

  • dbdesign.png
    dbdesign.png
    13 KB · Aufrufe: 5
Zuletzt bearbeitet:
Ich verstehe das mit den Gruppen nicht ganz, geht es dort um Besitzer als Gruppe / Familie?
Bei der Lösung mit einer Tiertabelle mit einer FK- Spalte zu einer Hund Attribute- Tabelle hätte ich ja bei den Katzen in der Tiertabelle null- values - oder versteh ich da was falsch?
Eigentlich nicht. Die Tabelle kann ja ganz andere Spalten haben als die Hund-Tabelle, eben die die für Katzen interessant sind.
 
Werbung:
Zurück
Oben