Baum-Struktur mit unterschiedlichen Knotentypen



  • Hallo zusammen,

    ich habe da ein aus meiner Sicht kniffliges Design-Problem und würde Euch gerne um Hilfe fragen. Vielleicht weiss ja jemand Rat.

    Es geht um ein System zur Foto-Verwaltung, bei dem die Katalogisierung analog zu Adobes Photoshop Album über Tags abläuft. Die Tags stehen zueinander in einer Baum-Struktur beliebiger Tiefe und haben daher einen Verweis auf ihren Vater im Datensatz.
    Nun sollen einige Tags signalisieren, dass eine bestimmte Person auf dem Foto zu sehen ist. Allerdings sollen diesen Personen-Tags zusätzliche Daten wie Geburtstag, Adresse usw. der entsprechenden Person zugeordnet werden können, die bereits in einer weiteren Personen-Tabelle bestehen.
    Meine Idee war zunächst, da mir auch nichts besseres einfiel, in der Tag-Tabelle eine zusätzliche Spalte einzuführen, deren Inhalt entweder NULL oder ein Verweis auf einen Eintrag in der Personen-Tabelle ist.
    Dies wurde von einem Kumpel von mir dann einem Dozenten, der sich mit Datenbanken beschäftigt, vorgeschlagen, der aber eben dort ein Problem gesehen hat und leider keine Zeit mehr hatte, selber einen Vorschlag zu unterbreiten.

    Nun fällt mir keine andere Lösung ein, die elegant ist. Deswegen mein Hilferuf an Euch 🙂
    Ich danke schon einmal für jeden Beitrag.



  • Ich habe k.A. wie man eine Baumstruktur auf eine relationale Datenbank abbildet 😕

    Ich glaube du brauchst soetwas:
    http://de.wikipedia.org/wiki/Objektorientierte_Datenbank
    http://de.wikipedia.org/wiki/Objektrelationale_Datenbank 💡

    EDIT: Evtl. PostgreSQL, ist FreeWare 🙂
    http://www.postgresql.org/

    PostgreSQL is a highly scalable, SQL compliant, open source object-relational database management system

    💡 Vererbung von Tabellen:
    http://www.postgresql.at/de/docs/tutorial-inheritance.html

    http://www.pgexplorer.com

    PGexplorer ist ein grafisches PostgreSQL Entwicklungswerkzeug. Es bietet z.B. Baumansichten von Datenbankobjekten, einen grafischen Query-Designer und reverse engineering.



  • Du hast eine Personentabelle mit allen Daten.(Normalisiert hoffe ich)
    Jede Person hat hoffentlich eine eindeutige ID.

    Diese ID kannst du nehmen und in der Fototabelle speichern.

    Aber nru wenn ich dein Problem verstanden habe.

    Sonst kannst du es nochmal erklären oder Bsp. geben.



  • @Tanzfreak: Vielen Dank für die Infos zu Postgre, ich wusste gar nicht, dass die dort auch teilweise Unterstützung für objektrelationales Design bieten. Bis jetzt habe ich aber auch "nur" die Vererbung gefunden, das sollte für dieses Problem aber reichen.

    @Unix-Tom:
    Du hast da, glaube ich, noch was falsch verstanden. Ich versuche es mal mit einem Beispiel:

    Sagen wir mal, es existiert folgender Baum an Tags:
    Events
    ..Urlaube
    ....Timbuktu 2003
    ....Hintertupfingen 2004
    ..Geburtstage
    ....Hans Müller 2000
    Personen
    ..Familie
    ....Maria
    ....Peter
    ....Simon
    ..Freunde
    ....Max

    Nun ist ein Bild gegeben, dem Folgende Tags zugeordnet sind:
    Urlaube->Timbuktu 2003,
    Personen->Familie->Maria,
    Personen->Familie->Peter
    Das würde dann semantisch bedeuten, dass das Foto im Urlaub Timbuktu aufgenommen wurde und sowohl Maria als auch Peter auf dem Bild zu sehen sind.
    Nun soll man aber zu diesen Personen-Tags, wie gesagt, noch mehr Informationen abspeichern können. Daraus ließe sich dann z.b. zu jedem Foto mit Person berechnen, wie alt die Person auf dem Foto gerade war.
    Eine Personen-Tabelle mit id existiert.
    Man könnte natürlich die Personen komplett aus dem Tag-Baum auskoppeln, jedoch wäre es eigentlich schön, eine einzige Schnittstelle für diese Art der Katalogisierung zu haben.



  • Das Problem ist also, dass Du zu einem Photo mehrere Personen angeben (können) willst?
    Mit fällt der Name für diese Art Tabelle grad nicht ein, aber Du brauchst eine dritte Tabelle, in der Du die jeweils den Primärindex der Tag-Tabelle und der Personen-Tabelle abspeicherst. Hier ist ein zusammengesetzter Primärschlüssel zu empfehlen (ausnahmsweise 😉 ).
    So in die Richtung:

    BildId   PersId
    1       1
    1       2
    2       1
    2       3
    

    Dann kannst Du mit einem Select auf die BildId in dieser Tabelle alle PersIds ermitteln und diese dann aus der Personentabellen holen.


Anmelden zum Antworten