Ergebnis 1 bis 10 von 10

Thema: Zoobewohner klassifizieren (DB Schema)

  1. #1
    mikser ist offline Benutzer
    Registriert seit
    25.03.2008
    Beiträge
    30

    Frage Zoobewohner klassifizieren (DB Schema)

    Hallo, als Anfänger stehe ich hier vor einem ziemlichen Problem und zwar habe ich etliche Tiere unterschiedlicher Rassen, für die ich in eine DB erstellen will.

    Zum Beispiel:
    einen kastrierten schwarzen Dackel-Hund namens "Heino",
    eine grünes Salzwasser-Leistenkrokodil namens "Kroko" und
    einen gelben Flamingo-Vogel namens "Flogel" mit gestutzten Flügeln.

    Alle Tiere haben in gewissem Maß ein paar Eigenschaften gemeinsam, zb Name, Rasse, Farbe, aber es gibt auch Eigenschaften die nicht alle Rassen gemeinsam haben beispielsweise bei Vögeln das Flügelstutzen, bei Wassertieren die Einordnung in Salz/Süßwasser und bei Hunden das Kastrieren usw.

    Wie geht man nun PRINZIPIELL an so ein Schema heran?
    Erstellt man für jede Rasse eine eigene Tabelle? Oder nimmt man nur eine einzige riesige Tabelle und hat dann eben etliche Felder leer je nach Rasse?



    Wäre nett, wenn mir da jemand weiterhelfen könnte. Tschausu!

  2. #2
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.055

    Standard

    Das ist eine gute Frage, du wirst wohl um eine Mischform nicht herumkommen.

    Für die Klassifizierung würde ich eine Tabelle nehmen die auf sich selbst referenziert. So kannst du Unterklassen bequem auf die Hauptklasse verzweigen lassen. Einige Optionen zusätzlich geben ab, um was für eine Klasse es sich handelt.

    Für Details würde ich mir einer 1:n Tabelle zusammen mit einer Schlüsselworttabelle beginnen. Dann kannst du beliebig Eigenschaften hinzufügen, ohne dein Schema ändern zu müssen.

    An dieser Stelle würde ich beginnen, viele viele Testdaten in mein System zu spielen und zu schauen, wie gut (oder schlecht) sich diese Daten im Schema abbilden lassen. Darauf aufbauend kannst du dir dann Veränderungen überlegen.
    Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören

    Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

    PostgreSQL Service & Support

  3. #3
    mikser ist offline Benutzer
    Registriert seit
    25.03.2008
    Beiträge
    30

    Lächeln

    Hallo ads danke für die Meldung; leider steh ich da auf dem Schlauch bzw kann dir nicht folgen.


    Für Details würde ich mir einer 1:n Tabelle zusammen mit einer Schlüsselworttabelle beginnen. Dann kannst du beliebig Eigenschaften hinzufügen, ohne dein Schema ändern zu müssen.
    Das interpretiere ich so:
    Tab_Rasse (ID, Bezeichnung)
    Tab_Eigenschaft (ID, Bezeichnung)
    Tab_Ra_Eig (RID, EID)

    Nur wäre das ja eine m:n Beziehung, also hast du dich entweder vertippt, oder (eher wahrscheinlich) ich hab was falsch verstanden.


    Für die Klassifizierung würde ich eine Tabelle nehmen die auf sich selbst referenziert. So kannst du Unterklassen bequem auf die Hauptklasse verzweigen lassen.
    So und das hier hab ich überhaupt nicht verstanden hehe. Könnte man da vielleicht ein ganz kleines Beispiel sehen?


    Schüss

  4. #4
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.055

    Standard

    Für die Klassen:
    Code:
    CREATE TABLE klasse (
    id          INTEGER     NOT NULL PRIMARY KEY,
    parent    INTEGER      NOT NULL REFERENCES klasse(id),
    name     VARCHAR(100)   NOT NULL UNIQUE
    );
    Damit hast du eine Tabelle, die auf sich selbst referenziert (als einfaches Beispiel). Jede Unterklasse referenziert auf eine übergeordnete Klasse - die Haiptklasse lässt du dabei einfach auf sich selbst referenzieren (id = parent).


    Für die anderen Daten:
    Du brauchst eine Tabelle mit Schlüsseln, eine mit Werten, eine mit Tieren.
    In die Wertetabelle trägst du für jedes Tier eine Referenz auf dieTabelle mit den Namen der Tiere, eine Referenz auf den Schlüssel (Farbe, Größe, Lebensraum, ...) und den Wert ein. Für 3 Werte hast du folglich 3 Einträge in deiner Tabelle. Jeder Schlüssel (Farbe, Größe, Lebensraum, ...) taucht exakt einmal in der Schlüsseltabelle auf, jedes Tier einmal in der Tabelle mit den Tieren. Die Tabelle mit den Tieren ist auch der geeignete Platz, eine Referenz auf die Klassentabelle anzugeben.
    Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören

    Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

    PostgreSQL Service & Support

  5. #5
    mikser ist offline Benutzer
    Registriert seit
    25.03.2008
    Beiträge
    30

    Standard

    Achso jetzt hab ichs kappiert, danke sehr das werd ich gleich mal versuchen umzusetzen!

  6. #6
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.055

    Standard

    Ich weiss nicht, ob der Ansatz letztendlich auch funktioniert und deinen Erfordernissen entspricht. Das ist der Weg, mit dem ich beginnen würde und dann zeigt sich, ob man alles damit abbilden kann oder ob Änderungen notwendig sind.
    Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören

    Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

    PostgreSQL Service & Support

  7. #7
    mikser ist offline Benutzer
    Registriert seit
    25.03.2008
    Beiträge
    30

    Frage

    Hmm.. wie geht man denn mit dem Problem um, dass einige Eigenschaften Text-Werte, andere Zahlenwerte und wieder andere Eigenschaften Fremdschlüssel als Werte haben? Zum Beispiel habe ich in der Eigenschaftstabelle:
    1, Name
    2, BesitzerID
    3, Alter

    In der Tier_Eigenschaften Tabelle würde es dann zb heissen:
    1, 1, "Heino"
    1, 2, 678
    1, 3, 7
    2, 1, "Kroko"
    2, 2, 669
    2, 3, 5

    Wobei diese Tabelle ja als (integer,integer,text) anzulegen wäre. Nicht jeder Wert ist aber ein Text!
    Wie sähe eine effiziente Abfrage aus, die auch die Fremdschlüssel beachtet? Für obiges Beispiel sollte zb die BenutzerID=678 durch den Namen des Benutzers aufgelöst werden.

    Ich habs mal damit versucht, aber es kommen verständlicherweise Fehler:
    SELECT * FROM benutzer b LEFT JOIN tier_eigenschaften te ON b.id=te.wert::integer

    Mir fiele da jetzt nur noch ein für jede Fremdschlüsseleigenschaft eine extra Unterabfrage zu starten. Das kann aber vermutlich nicht die richtige Vorgehensweise sein (hoff ich doch)



    *Achso nochmal zur Klarstellung es geht um diese Tabellen:
    Eigenschaften (INT eigenschaftsID, TEXT eigenschaftsname)
    1, Tiername
    2, Farbe
    3, BenutzerID

    Benutzer (INT benutzerID, TEXT benutzername)
    1, Marion
    2, Günther
    3, Willi

    Tier_Eigenschaften (INT tierID, INT eigID, TEXT wert)
    1, 1, "Kroko"
    1, 2, "grün"
    1, 3, 2 (gehört Günther)
    Geändert von mikser (17.08.2008 um 15:25 Uhr)

  8. #8
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.055

    Standard

    Doch, für Fremdschlüssel wirst du eigene Routinen ab/anlegen müssen, schliesslich kann dein Programm sonst davon nichts wissen.

    Gleiches gilt für den von dir benannten Unterschied zwischen Text und Integer Werten. Wenn du an so einem Punkt bist, wirst du statt einer generellen Spalte eine spezifische Spalte mit genau deinen Definitionen anlegen dürfen.


    Kommst also um die Arbeit nicht herum ;-)
    Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören

    Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

    PostgreSQL Service & Support

  9. #9
    mikser ist offline Benutzer
    Registriert seit
    25.03.2008
    Beiträge
    30

    Standard

    Aber was für einen Sinn bzw Vorteil hätte denn da dieses DB-Design gegenüber einem Design mit mehreren Tabellen (Tabelle Hunde, Tabelle Vögel usw)? Würde man zb die einfache Frage haben, welche Hunde dem Max Muster gehören, dann ergibt das bei "deiner" Lösung ja eine ganze Symphonie an Abfragen:

    SELECT * FROM Tier_Eigenschaften WHERE (eigID=3 AND wert IN
    (SELECT bID FROM besitzer WHERE bName='Max Muster')b )
    AND (eigID=88 AND wert=(SELECT katID FROM kategorien WHERE kName='Hunde')

    Und Sachen wie ref. Integrität, Wartbarkeit wären auch nur extrem kompliziert zu überwachen. Mensch! Die Idee sah so toll aus, und jetzt siehts danach aus, das sie wohl fürs Daten ablegen geeignet, für den Datenzugriff aber ungeeignet ist


    (Stimmts?)

    Tschüss

  10. #10
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.055

    Standard

    Nun, das ist wie in der Objektorientierung. Ganz grundlegend sind das alles erst mal Tiere. Danach kommen Verfeinerungen wie die Art, Rasse, Lebensraum, Anzahl Gliedmaßen, Flugfähigkeiten und was man noch alles katalogisieren kann.

    Manches davon kann man sauber abbilden, für manches muss man sich Umwege einfallen lassen.

    Deine Aufgabe ist leider so komplex, das man da nicht einfach so mal eben 3 bis 7 Tabellen hinsetzt und dann klappt alles.
    Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören

    Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

    PostgreSQL Service & Support

Ähnliche Themen

  1. Schema
    Von Kaptain Iglo im Forum Allgemeines
    Antworten: 4
    Letzter Beitrag: 24.01.2011, 12:42
  2. dynamisch Schema auswählen
    Von derLars im Forum PL/pgSQL
    Antworten: 15
    Letzter Beitrag: 13.01.2010, 09:27
  3. PostgreSQL XML Schema
    Von npspamal im Forum Allgemeines
    Antworten: 5
    Letzter Beitrag: 10.03.2008, 11:48
  4. reindexdb mit Schema
    Von MacSQL im Forum Allgemeines
    Antworten: 1
    Letzter Beitrag: 28.03.2007, 14:40
  5. SCHEMA current_user
    Von rainer198 im Forum SQL
    Antworten: 1
    Letzter Beitrag: 16.01.2006, 23:17

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum