Mike: Mysql/Sqlite Bilderdatenbank Schlüsselwörter/Label

Hi,

ich versuche gerade die Struktur für eine Bilddatenbank zu entwerfen.
Dabei stelle ich fest, dass mir wohl noch der richtige Ansatz fehlt.

Mein Problem dabei ist die Schlüssel-oder Label Assoziation.

Vor lauter Überlegungen bin ich nun so klug als zuvor.
Meine Denkweise war es ein Tabelle zu erstellen mit:

*unwichtige Feldnamen lass ich hier mal weg
TABELLE 1
id | bildname | pfad |

Tabelle 2
eine weitere Tabelle mit den labels
id | keyword | id_von_tbl1

So, nun kann ich, sobald ein neues Schlüsselwort kommt(was übrigens direkt die Bildpfade mitbringt) dieses in Tabelle 2 eintragen, dann die Bilder in Tabelle 1 eintragen, wenn nicht sowieso schon vorhanden.

Dann müsste ich allerdings noch irgendwo die betreffenden ID's der jeweiligen Bilder finden und in Tabelle 2 dem neuen Keyword zuordnen. Aber wie?

Ein anderer umgekehrter Ansatz war die ID des neuen Keywords zu merken und dann jeweils bei den Einträgen bzw. Updates der Bilder hinzuzufügen, was mir aber nicht so gefällt.(Vor lauter Überlegungen weiss ich schon gar nicht mehr warum ich das nicht will, aber es gab einen guten Grund).

Hinzu kommt die Prozedur der Assoziation. Egal ob jetzt Lösung 1 oder 2, in beiden Fällen ist es vorgesehen die id in einem Textfeld unterzubringen in der Form "3,4,12,24,33,34,35,112,", wobei je nach lösung das eben die Id's aus Tabelle 1 oder Tabelle 2 wären. Nur,  beim Hinzufügen wäre das ja noch einfach indem ich einfach den bisherigen Feldinhalt+den neuen Wert hinzufüge. Beim Update allerdings müsste ja erst geprüft werden ist der Wert schon drin, falls ja mit Stringfunktionen separieren, usw.

Irgendwie habe ich das Gefühl ich gehe die Sache viel komplizierter an,
als es eigentlich sein müsste. Aber wie das eben so ist nach einer Weile, Wald vor Bäumen, fällt mir nicht mehr ein. Daher meine Frage: Ist einer meine Ansätze zu empfehlen und wie kann ich das mit den Keywordassoziationen besser handhaben?

Mike

  1. Hello,

    eine weitere Tabelle mit den labels
    id | keyword | id_von_tbl1

    ich halte eine 1:n-Beziehung mit einem Foreign Key für unglücklich. Du speicherst das selbe Keyword so oft ab, wie du es verwenden willst.

    Mein Vorschlag:
    image
    id | bildname | pfad

    keyword
    id | keyword

    image_keyword
    id_image | id_keyword

    Folgende Vorteile:

    1. Tippfehler in Keywords sind auf eine zentrale Stelle beschränkt.
    2. Die Verknüpfung zwischen Image und Keyword kann flexibel gelöscht oder hinzugefügt werden
    3. Die üblichen Normalisierungsvorteile: du hast keine INSERT oder DELETE-Anomalien.

    MfG
    Rouven

    --
    -------------------
    sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
    I will never understand why Germans feel the need to kill trees  --  Arbeitskollege aus UK zum Thema ob eine Dokumentation elektronisch oder auf Papier ausgeliefert wird
    1. Hallo Rouven,

      id | keyword | id_von_tbl1
      ich halte eine 1:n-Beziehung mit einem Foreign Key für unglücklich. Du speicherst das selbe Keyword so oft ab, wie du es verwenden willst.

      upps so wars gar nicht gedacht, hätte besser schreiben sollen, ID's
      id | keyword | ids_von_tbl1
      1 | panorama | 3,24,33,44,51,52

      Hätte natürlich den Riesennachteil, dass irgendwann bei grossen Mengen, ein Problem auftritt, insebsondere bei Labels, die auf fast jedes Bild zutreffen:
      1 | sw | 1,2,3,4,5,12,13,14,......,1033,1045,....290432,....3323235

      Mein Vorschlag:
      image
      id | bildname | pfad

      keyword
      id | keyword

      image_keyword
      id_image | id_keyword

      Folgende Vorteile:

      1. Tippfehler in Keywords sind auf eine zentrale Stelle beschränkt.

      Ja, das wollte ich unbedingt.

      1. Die Verknüpfung zwischen Image und Keyword kann flexibel gelöscht oder hinzugefügt werden

      Auch wichtig.

      1. Die üblichen Normalisierungsvorteile: du hast keine INSERT oder DELETE-Anomalien.

      Jawoll.

      Aber.....

      image_keyword
      id_image | id_keyword

      Wenn ich das richtig verstehe, dann mal als Bsp.

      3 | 14
      3 | 29
      3 | 30
      3 | 234
       ...
      3 | 10344
      3 | 35455
       ...
      4 | 12
      4 | 22
      4 | 32
      4 | 224
       ...
      4 | 12344
      4 | 25455

      Also muss jedes einzelne Bild jedesmal erneut in Kombination mit dem jeweiligen Keywort gebracht werden?

      Mike

      1. Hello,

        1 | sw | 1,2,3,4,5,12,13,14,......,1033,1045,....290432,....3323235

        das ist nur auf den ALLERERSTEN Blick eine brauchbare Idee. Alles danach stellt dich vor unlösbare und extrem unperformante Probleme.

        Also muss jedes einzelne Bild jedesmal erneut in Kombination mit dem jeweiligen Keywort gebracht werden?

        ja, aber davon leben Datenbanken...

        MfG
        Rouven

        --
        -------------------
        sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
        When the only tool you've got is a hammer, all problems start to look like nails.
        1. Hi Rouven,

          1 | sw | 1,2,3,4,5,12,13,14,......,1033,1045,....290432,....3323235
          das ist nur auf den ALLERERSTEN Blick eine brauchbare Idee. Alles danach stellt dich vor unlösbare und extrem unperformante Probleme.

          Ja, nur bei sehr kleinen Projekten brauchbar, daher kam ich nicht weiter.

          Also muss jedes einzelne Bild jedesmal erneut in Kombination mit dem jeweiligen Keywort gebracht werden?
          ja, aber davon leben Datenbanken...

          Schade, ich dache es gäbe eine andere Möglichkeit.

          bild id | label id
             1    |     3
             4    |     3
             5    |     3
            11    |     3
             1    |     4
             7    |     4

          So weiss ich nun zu Label 3 gehören Bild 1,4,5 und 11.
          Ich weiss zu Label 4 gehören Bild 1 und 7.

          Oder umgekehrt:
          Zu Bild 1 gehören Label 3 und 4
          Zu Bild 4 gehört Label 3
          Zu Bild 5 gehört Label 3
          Zu Bild 11 gehört Label 3
          Zu Bild 7 gehört Label 4

          Hatte irgendwie die stille Hoffnung ich könnte auf Mehrfacheinträge in dieser Form, (genau wie mein Ansatz natürlich auch) verzichten.

          Aber gut, nun kann ich endlich beruhigt weiter daran arbeiten, ohne dauernd zu denken ich betreibe Sisyphos-Arbeit.

          Hab Dank, auch an Harlequin natürlich, der auch deinen Weg favorisiert.
          Mike

          1. Mahlzeit Mike,

            1 | sw | 1,2,3,4,5,12,13,14,......,1033,1045,....290432,....3323235
            das ist nur auf den ALLERERSTEN Blick eine brauchbare Idee. Alles danach stellt dich vor unlösbare und extrem unperformante Probleme.

            Ja, nur bei sehr kleinen Projekten brauchbar, daher kam ich nicht weiter.

            Die Art der Datenbank ist bei KEINEM Projekt brauchbar. Informiere Dich über Normalisierung.

            Also muss jedes einzelne Bild jedesmal erneut in Kombination mit dem jeweiligen Keywort gebracht werden?
            ja, aber davon leben Datenbanken...

            Schade, ich dache es gäbe eine andere Möglichkeit.

            Wieso schade?

            So weiss ich nun zu Label 3 gehören Bild 1,4,5 und 11.
            Ich weiss zu Label 4 gehören Bild 1 und 7.

            Richtig.

            Zu Bild 1 gehören Label 3 und 4
            Zu Bild 4 gehört Label 3
            Zu Bild 5 gehört Label 3
            Zu Bild 11 gehört Label 3
            Zu Bild 7 gehört Label 4

            Auch richtig.

            Hatte irgendwie die stille Hoffnung ich könnte auf Mehrfacheinträge in dieser Form, (genau wie mein Ansatz natürlich auch) verzichten.

            Es handelt sich mitnichten um Mehrfacheinträge. Es handelt sich vielmehr um die einzig sinnvolle Form, n:m-Beziehungen in einer relationalen Datenbank abzubilden.

            MfG,
            EKKi

            --
            sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
  2. Yerf!

    *unwichtige Feldnamen lass ich hier mal weg
    TABELLE 1
    id | bildname | pfad |

    Tabelle 2
    eine weitere Tabelle mit den labels
    id | keyword | id_von_tbl1

    Man könnte evtl. noch eine extra Tabelle für die Keywords machen und in Tabelle 2 nur die ID des Keywords eintragen. (macht es z.B. einfacher ein Keyword zu korrigieren)

    So, nun kann ich, sobald ein neues Schlüsselwort kommt(was übrigens direkt die Bildpfade mitbringt) dieses in Tabelle 2 eintragen, dann die Bilder in Tabelle 1 eintragen, wenn nicht sowieso schon vorhanden.

    Soweit so gut (wobei ich wie gesagt das Keyword in eine tabelle 3 eintragen würde)

    Dann müsste ich allerdings noch irgendwo die betreffenden ID's der jeweiligen Bilder finden und in Tabelle 2 dem neuen Keyword zuordnen. Aber wie?

    Du müsstest dir beim Einfügen der Bilder jede zugehörige ID merken. Da allerdings manchmal nicht eingefügt wird, weil das Bild schon vorhanden sein kann wird das wohl etwas unpraktisch. Der bessere Ansatz dürfte wohl ein nachgeschaltetes Select sein, das nach dem Einfügen alle Bilder zusammen mit ihren IDs wieder aus der Datenbank holt. Mit dieser Liste können dann die Einträge ind Tabelle 2 vorgenommen werden.

    Ein anderer umgekehrter Ansatz war die ID des neuen Keywords zu merken und dann jeweils bei den Einträgen bzw. Updates der Bilder hinzuzufügen, was mir aber nicht so gefällt.(Vor lauter Überlegungen weiss ich schon gar nicht mehr warum ich das nicht will, aber es gab einen guten Grund).

    Dann hättest du pro einem Bild zugeordneten Keyword einen Eintrag in Tabelle1 und somit die infromationen über das Bild mehrfach gespeichert.

    Hinzu kommt die Prozedur der Assoziation. Egal ob jetzt Lösung 1 oder 2, in beiden Fällen ist es vorgesehen die id in einem Textfeld unterzubringen in der Form "3,4,12,24,33,34,35,112,", wobei je nach lösung das eben die Id's aus Tabelle 1 oder Tabelle 2 wären.

    Aber doch hoffentlich nur beim Auslesen und nicht in der Datenstruktur der DB? Denn sonst ist das folgende nur eines deiner Probleme:

    Nur,  beim Hinzufügen wäre das ja noch einfach indem ich einfach den bisherigen Feldinhalt+den neuen Wert hinzufüge. Beim Update allerdings müsste ja erst geprüft werden ist der Wert schon drin, falls ja mit Stringfunktionen separieren, usw.

    Trage für jede Einzelzuordnung eine neue Zeile in die Tabelle2 ein. Beim Auslesen kann man diese dann zusammenfassen lassen (entweder schon von der DB, MySQL kennt da z.B. ein Group_Concat oder vom Programm)

    Daher meine Frage: Ist einer meine Ansätze zu empfehlen und wie kann ich das mit den Keywordassoziationen besser handhaben?

    Du bist schon auf dem richtigen Weg aber du solltest dir die Normalisierung mal zu Gemüte führen (zumindest bis zur 3. NF)

    Gruß,

    Harlequin

    --
    <!--[if IE]>This page is best viewed with a webbrowser. Get one today!<![endif]-->