Steffen: Gleichartige Daten zu mehreren Tabellen

Liebe Forumsgemeinde!

Ich bin auf der Suche nach einer eleganten Möglichkeit zu Einträgen in Tabellen Anhänge oder Notizen zu hinterlegen. Die Datensätze um die es hierbei geht sind auf mehrere unterschiedlichste Tabellen verteilt. Nun möchte ich zu diesen Datensätzen gern Anhänge und Notizen hinterlegen. Diese möchte ich aber gern in nur jeweils einer Tabelle für Notizen und Anhänge speichern.

Beispiel

  • Tabelle1
  • Tabelle2
  • Tabelle3
  • Notizen (id, notiz, referenz)
  • Anhänge (id, anhang, name, referenz)

Die Referenz zur Basistabelle könnte ich nun aus dem Namen der Tabelle und der zu referenzieren Zeile zusammensetzen (z.B. "Tabelle1/row1"). Das würde ganz gut funktionieren. (Oder auf 2 Spalten aufgeteilt.)

Mein Wunsch wär aber, dass ich das ganze noch über ein Foreign-Key-Constraint sichern könnte. Dazu fällt mir einfach kein gescheiter Weg ein.

Die Notizen möchte ich nicht in die Tabellen1-3 integrieren, da die Notizen hier vereinfacht dargestellt sind und es sich dabei natürlich auch um wesentlich komplexere Strukturen handeln könnte. Außerdem lassen sich auch so 1-n Beziehungen abbilden.

Habt Ihr dazur irgendwelche Ideen oder Vorschläge? Oder würdet Ihr einfach auf den Foreign-Key pfeifen?

Danke schonmal im Voraus

  • Steffen
  1. Hallo

    Ich bin auf der Suche nach einer eleganten Möglichkeit zu Einträgen in Tabellen Anhänge oder Notizen zu hinterlegen. Die Datensätze um die es hierbei geht sind auf mehrere unterschiedlichste Tabellen verteilt. Nun möchte ich zu diesen Datensätzen gern Anhänge und Notizen hinterlegen. Diese möchte ich aber gern in nur jeweils einer Tabelle für Notizen und Anhänge speichern.

    Beispiel

    • Tabelle1
    • Tabelle2
    • Tabelle3
    • Notizen (id, notiz, referenz)
    • Anhänge (id, anhang, name, referenz)

    Die Referenz zur Basistabelle könnte ich nun aus dem Namen der Tabelle und der zu referenzieren Zeile zusammensetzen (z.B. "Tabelle1/row1"). Das würde ganz gut funktionieren. (Oder auf 2 Spalten aufgeteilt.)

    Gehe ich richtig in der Annahme, dass in der Basistabelle der Stammdatensatz liegt, der, auf den sich die Datensätze aller weiteren Tabellen beziehen? Nimm eine weitere Tabelle und hinterlege die ID des Stammdatensatzes. An der Stelle reicht als Spaltenname auch die ID des Stammdatensatzes, denn das dies die ID des Stammdatensatzes ist, sollte ja klar sein. Ein Konstrukt wie „Tabelle1/row1“ ist meiner Meinung nach daher nicht nötig.

    Mein Wunsch wär aber, dass ich das ganze noch über ein Foreign-Key-Constraint sichern könnte. Dazu fällt mir einfach kein gescheiter Weg ein.

    Hast du eine (Extra-)Tabelle für die Notizen, musst du irgendwie die Verknüpfung zum Stammdatensatz herstellen. Genau dazu ist der Schlüssel des Stammdatensatzes als Foreign Key in der Notiztabelle (offensichtlich das Feld referenz) notwendig.

    Die Notizen möchte ich nicht in die Tabellen1-3 integrieren, da die Notizen hier vereinfacht dargestellt sind und es sich dabei natürlich auch um wesentlich komplexere Strukturen handeln könnte. Außerdem lassen sich auch so 1-n Beziehungen abbilden.

    Logisch, spätestens, wenn es nicht zu (fast) allen Datensätzen Notizen gibt, führst du haufenweise leere Felder mit.

    Tschö, Auge

    --
    Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war. Terry Pratchett, “Wachen! Wachen!
    1. Hallo Auge,

      Logisch, spätestens, wenn es nicht zu (fast) allen Datensätzen Notizen gibt, führst du haufenweise leere Felder mit.

      Ich habe im Adress-Stammsatz ein Feld für den Titel, ein Feld für Bemerkungen, ein Feld für ...

      Kaum jemand ist Doktor und meistens gibt es auch keine Bemerkungen. Welche Probleme ziehen leere Felder nach sich?

      Linuchs

      1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

        Hallo Auge,

        Logisch, spätestens, wenn es nicht zu (fast) allen Datensätzen Notizen gibt, führst du haufenweise leere Felder mit.

        Ich habe im Adress-Stammsatz ein Feld für den Titel, ein Feld für Bemerkungen, ein Feld für ...

        Kaum jemand ist Doktor und meistens gibt es auch keine Bemerkungen. Welche Probleme ziehen leere Felder nach sich?

        Kommt auf das DBMS und die verfügbaren Spaltentypen an. Jedes Feld benötigt Platz.

        Bei MySQL MyISAM benötigt ein leeres Feld vom Typ VarChar z. B. Nur den Platz für die Längenangabe und für eine interne Adresse. Es wird nicht im random access format, sondern in einem Tree-Format gespeichert. Bei InnoDB habe ich mir das noch nicht genauer angesehen.

        Spirituelle Grüße
        Euer Robert
        robert.r@online.de

        --
        Möge der wahre Forumsgeist ewig leben!
      2. Hallo

        Logisch, spätestens, wenn es nicht zu (fast) allen Datensätzen Notizen gibt, führst du haufenweise leere Felder mit.

        Ich habe im Adress-Stammsatz ein Feld für den Titel, ein Feld für Bemerkungen, ein Feld für ...

        Kaum jemand ist Doktor und meistens gibt es auch keine Bemerkungen. Welche Probleme ziehen leere Felder nach sich?

        Probleme? Wo sprach ich von Problemen? Du hast unnötige leere Felder, eventuell in „haufenweise“ zu nennendem Ausmaß. That's it.

        Tschö, Auge

        --
        Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war. Terry Pratchett, “Wachen! Wachen!
    2. Hi!

      Ich bin auf der Suche nach einer eleganten Möglichkeit zu Einträgen in Tabellen Anhänge oder Notizen zu hinterlegen. Die Datensätze um die es hierbei geht sind auf mehrere unterschiedlichste Tabellen verteilt. Nun möchte ich zu diesen Datensätzen gern Anhänge und Notizen hinterlegen. Diese möchte ich aber gern in nur jeweils einer Tabelle für Notizen und Anhänge speichern.

      Beispiel

      • Tabelle1
      • Tabelle2
      • Tabelle3
      • Notizen (id, notiz, referenz)
      • Anhänge (id, anhang, name, referenz)

      Die Referenz zur Basistabelle könnte ich nun aus dem Namen der Tabelle und der zu referenzieren Zeile zusammensetzen (z.B. "Tabelle1/row1"). Das würde ganz gut funktionieren. (Oder auf 2 Spalten aufgeteilt.)

      Gehe ich richtig in der Annahme, dass in der Basistabelle der Stammdatensatz liegt, der, auf den sich die Datensätze aller weiteren Tabellen beziehen? Nimm eine weitere Tabelle und hinterlege die ID des Stammdatensatzes. An der Stelle reicht als Spaltenname auch die ID des Stammdatensatzes, denn das dies die ID des Stammdatensatzes ist, sollte ja klar sein. Ein Konstrukt wie „Tabelle1/row1“ ist meiner Meinung nach daher nicht nötig.

      Nicht ganz. Die "Stammdaten" sind unterschiedlicher Art und deswegen verteilt auf Tabelle1, Tabelle2 und Tabelle3.

      Die Notizen möchte ich gern zu allen Stammdaten in allen 3 Tabellen machen können. Die Notizen sollen aber in nur einer Tabelle abgespeichert werden. Es soll also Notizen z.B. für "Tabelle1/id4711" und "Tabelle3/id0815" geben. (Bitte die Notizen nur beispielhaft sehen.)

      Mein Wunsch wär aber, dass ich das ganze noch über ein Foreign-Key-Constraint sichern könnte. Dazu fällt mir einfach kein gescheiter Weg ein.

      Hast du eine (Extra-)Tabelle für die Notizen, musst du irgendwie die Verknüpfung zum Stammdatensatz herstellen. Genau dazu ist der Schlüssel des Stammdatensatzes als Foreign Key in der Notiztabelle (offensichtlich das Feld referenz) notwendig.

      Ja - Notizen als extra Tabelle.

      Die Notizen möchte ich nicht in die Tabellen1-3 integrieren, da die Notizen hier vereinfacht dargestellt sind und es sich dabei natürlich auch um wesentlich komplexere Strukturen handeln könnte. Außerdem lassen sich auch so 1-n Beziehungen abbilden.

      Logisch, spätestens, wenn es nicht zu (fast) allen Datensätzen Notizen gibt, führst du haufenweise leere Felder mit.

      Genau, diesen Fall gibt es ja auch noch. n=0.

      Grüße

      • Steffen
      1. Hallo

        Gehe ich richtig in der Annahme, dass in der Basistabelle der Stammdatensatz liegt, der, auf den sich die Datensätze aller weiteren Tabellen beziehen?

        Nicht ganz. Die "Stammdaten" sind unterschiedlicher Art und deswegen verteilt auf Tabelle1, Tabelle2 und Tabelle3.

        Ok. Wenn ich das mal auf die Spitze treiben darf. Unter der Annahme, dass ein Stammdatensatz entweder in Tabelle1 oder in Tabelle2 oder in Tabelle3 aber nie in Tabelle1 und Tabelle2 oder in Tabelle2 und in Tabelle3 oder in Tabelle1 und in Tabelle3 ist, ließe sich folgende Struktur anlegen.

        • Tabelle0: Enthält die ID und in allen Fällen auftretende Stammdaten.
        • Tabelle1 bis Tabelle3: Enthalten die je nach vorliegendem Fall unterschiedlichen Stammdaten und verweisen auf Tabelle0.
        • TabelleNotizen: Enthält die Notizen zu einzelnen Items, so vorhanden und verweist ebenfalls auf Tabelle0.

        So würde ich das nach den vorliegenden Informationen machen.

        Tschö, Auge

        --
        Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war. Terry Pratchett, “Wachen! Wachen!
        1. Hallo,

          aber eine ordentliche Foreign-Key-Verbindung zwischen TabelleNotizen und Tabelle0 und Tabelle1-3 kriegt man da nicht mehr hin, oder?

          Grüße

          • Steffen
          1. Hallo

            aber eine ordentliche Foreign-Key-Verbindung zwischen TabelleNotizen und Tabelle0 und Tabelle1-3 kriegt man da nicht mehr hin, oder?

            Wieso zu Tabelle1 bis Tabelle3? Der Stammstammdatensatz liegt in Tabelle0. Nur dorthin brauchst du eine Verbindung.

            Tschö, Auge

            --
            Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war. Terry Pratchett, “Wachen! Wachen!