Kermit: DB Aufbau -> Beziehung unter Datensätzen

Hallo,
arbeite mit einer MySql Datenbank (glaube 4.1.irgendwas)
Habe mal eine allgemeine Frage zum Aufbau:
Ich habe u.a. folgende Tabellen:

  • Person
  • Werk
  • Person zu Werk
  • Ereignis
  • Ereignis zu Person
  • Ereignis zu Werk

In der Persontabelle werden allgemeine Infos zu Personen (Namen, Geburtstag und Ort, Sterbetag und Ort, etc) gespeichert
In der Werktabelle werden werden Informationen zu Werken (Titel, Inhalt, Erscheinungsjahr, etc.) gespeichert.
In Person zu Werk Tabelle werden die Verknüpfungen gespeichert: Personen_id, Werk_id, Info zu VErknüpfung (z.B. "Hat geschrieben" oder "beruft sich auf...")
Ereignistabelle speichert allgemeine Historische Ereignisse (WW II , Entdeckung Amerikas, etc.)
Ereignis zu Person und Ereignis zu Werk speichern jeweils die RElationen zu den Ereignissen, wenn es welche gibt und diese nicht rein durch die LEbens- bzw Werkdaten gegeben sind (also ein Buch das während des 2 WW erschienen ist, wird nicht unbedingt mit dem Ereigniss verknüpft, da das Erscheinungsjahr verknüpfung genug ist. Ein Werk allerdings dass sich direkt auf ein Ereignis bezieht, oder ein Ereignis/Epoche stilprägend beeinflusst oder verursacht hat wird schon verknüpft.

Soweit so gut.
Nun möchte ich die Relationen zwischen Werken und Werken / Personen und Personen sowie Werken und Personen darstellen. Allerdings nicht nur die Relationen des ersten Grades sondern min. auch des 2 Grades (ob noch tiefer Sinn macht weiss ich noch nicht)
z.B.
Person 1 schreibt Werk 1
Person 2 schreibt Werk 2 und bezieht sich dabei auf Werk 1
Person 2 schreibt Werk 3
Habe also
Person 1 -> Werk 1 (direkt)
Person 1 -> Werk 2 (rückbezogen)
Person 2 -> Werk 2 (direkt)
Person 2 -> Werk 1 (direkt)
Werk 1 -> beinflusst -> Werk 2
Werk 3 -> gleicher Author wie Werk 2
Werk 3 -> Beziehung 2 Grades mit Werk 1

Hoffe das ist einigermaßen verständlich. Frage, kann man das mit der o.g. DB Struktur so darstellen oder muß man da noch Tabellen dazwischen schalten, welche Verbesserungsvorschläge hättet ihr?
Wie müßte die Abfrage sein, damit keine doppelten Datensätze ausgegeben werden - sprich jeder Datensatz tatsächlich nur einmal abgefragt wird (insbesondere bei der Werk zu Werk Beziehung)?

Grüße,
Kermit

  1. Moin!

    Hoffe das ist einigermaßen verständlich.

    Ja und Nein. Vor allem wissen wir nicht, was Du versucht hast und woran Du konkret scheiterst.
    Am besten Arbeitest Du mit wohl mit Views und fragst diese ab.

    Wie müßte die Abfrage sein, damit keine doppelten Datensätze ausgegeben werden - sprich jeder Datensatz tatsächlich nur einmal abgefragt wird (insbesondere bei der Werk zu Werk Beziehung)?

    DISTINCT | DISTINCTROW

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix

  2. moin,

    arbeite mit einer MySql Datenbank (glaube 4.1.irgendwas)

    welche version das genau ist, das ist nicht ganz irrelevant. bestimmte features werden eben erst ab bestimmen versionen zur verfügung gestellt.

    Ereignis zu Person und Ereignis zu Werk speichern jeweils die RElationen zu den Ereignissen

    Ein Werk allerdings dass sich direkt auf ein Ereignis bezieht, oder ein Ereignis/Epoche stilprägend beeinflusst oder verursacht hat wird schon verknüpft.

    es gibt einen weit verbreiteten irrglauben, dass im kontext von relationalen dbms das wort relation eine beziehung zwischen zwei tabellen darstellt. das ist falsch, eine relation ist eine tabelle, die beziehung zwischen zwei tabellen ist relationship.

    und diese nicht rein durch die LEbens- bzw Werkdaten gegeben sind (also ein Buch das während des 2 WW erschienen ist, wird nicht unbedingt mit dem Ereigniss verknüpft, da das Erscheinungsjahr verknüpfung genug ist.

    das ist sehr gewagt. nehmen wir mal an, ein buch ist 1942 rausgekommen, der author hat es aber schon jahre vorher geschrieben. dann hätte der zweite weltkrieg keinen einfluss auf das buch gehabt, du stellst diese verbindung aber über das erscheinungsjahr her. außerdem hättest du dann zwei verschiedene "wege", ob ein werk mit einem ereignis in verbindung steht, was sehr unschön ist.

    Nun möchte ich die Relationen zwischen Werken und Werken / Personen und Personen sowie Werken und Personen darstellen. Allerdings nicht nur die Relationen des ersten Grades sondern min. auch des 2 Grades (ob noch tiefer Sinn macht weiss ich noch nicht)

    zum einen wäre es hilfreich, wenn du uns mal die relevanten spalten aus den tabellen nennen könntest, vor allem auch über die selfreferenz der tabellen. zum anderen musst du dich entscheiden, ob dir eine festgelegte tiefe reicht oder du das offen lassen willst. je nachdem muss man anders vorgehen. willst du zum beispiel nur eine ebene runter gehen, könnte man das auch mit korrelierten unterabfragen lösen

    Ilja

    1. Hi!

      arbeite mit einer MySql Datenbank (glaube 4.1.irgendwas)
      welche version das genau ist, das ist nicht ganz irrelevant. bestimmte features werden eben erst ab bestimmen versionen zur verfügung gestellt.

      Naja, ab der ersten Nachkommastelle ändert sich in der Regel nur noch geringfügig etwas, wobei die meisten Änderungen in Versionen mit niedrigen dritten Stellen (= 2. Nachkommastelle) zu finden sind, die üblicherweise in der freien Wildbahn nicht anzutreffen sind.

      4.1 ist nicht mehr die neueste, kann aber immerhin schon Subselects und mit Zeichencodierung umgehen.

      Lo!

      1. moin,

        4.1 ist nicht mehr die neueste, kann aber immerhin schon Subselects und mit Zeichencodierung umgehen.

        sein problem geht eventuell in richtung hirarchische abfragen und ich weiß nicht, ob und ab wann mysql das unterstützt. insofern ist die genaue version schon interesant.

        Ilja

        1. Hi!

          4.1 ist nicht mehr die neueste, kann aber immerhin schon Subselects und mit Zeichencodierung umgehen.
          sein problem geht eventuell in richtung hirarchische abfragen und ich weiß nicht, ob und ab wann mysql das unterstützt. insofern ist die genaue version schon interesant.

          Nicht wirklich, eine Nachkommastelle ist für Leistungsmerkmale ausreichend, keine wäre in der Tat zu wenig. Der Rest ist lediglich für geändertes Verhalten nach Fehlerkorrekturen wichtig. Das kommt aber selten vor, oder ist aufgrund der in der Praxis anzutreffenden Versionen nicht mehr relevant, weswegen es in der Regel zunächst nicht betrachtet werden muss.

          Lo!

          1. moin,

            Nicht wirklich, eine Nachkommastelle ist für Leistungsmerkmale ausreichend, keine wäre in der Tat zu wenig.

            ich denke, wir reden aneinander vorbei, du bieziehst dich auf die nachkommastellen, ich beziehe mch auf seine aussage mit der betonung auf glaube: "arbeite mit einer MySql Datenbank (glaube 4.1.irgendwas)"

            es wäre hilfreich den glauben in wissen umzuwandeln.

            Ilja Krischer

            1. Hallo,
              und sorry konnte nicht früher schreiben. Zum glauben... arbeite tatsächlich mit einer MySQL - 5.0.22-community-nt -> zumindest im lokalen Testsystem und da ich erstmal ausgiebigst testen will und sehen will ob ich meine Ideen überhaupt verwirklichen kann wird wohl mein Provider bis dahin mindestens auf diese Version upgedated haben wenn er nicht schon da ist.
              Wie gesagt, das ganze ist erstmal als eine private Interessensübung gedacht und daher der Einwand mit dem Buch (vor 39 geschrieben nach 45 rausgekommen) zwar absolut berechtigt aber im momentanen Stand noch zu vernachlässigen.
              Leider kann ich mein Problem nicht genau beschreiben, da ich selber gerade erst am Basteln und noch am Brainstormen bin. Im Prinzip möchte ich mir eine Timeline erstellen, eine Art Synchronopse wie der Digitale Peters, aber mit der Möglichkeit die Daten nach Belieben und Vorlieben zu erweitern. Ich denke ich habe schon ein relativ gutes Grundgerüst, aber an der Darstellung (bzw. Speicherung in der DB) der Verbindungen beisse ich mir gerade etwas die Zähne aus. Klar ist es einfach zu sagen Poe hat den Gordon Pym geschrieben, und Verne die Eissphinx, und ich denke das ich das auch noch hinbekomme die Relation zwischen den beiden Werke zu behandeln aber bei nicht so eindeutigen Problemen bin ich mir nicht sicher, besonders wenn es Kategorien übergreifend ist (z.B. Politisches Ereignis mit Werk) bzw. wenn es eben keine direkte Verbindung sondern eine Verbindung 2ten oder 3ten Grades ist (quasi das alte Eltern->Kind->Schwiegertochter ;-) Problem...) Wie ich sowas vernünftig in der DB abbilde ist mir selber noch nicht ganz klar....
              Wenn ihr ein paar gute Tips und Tricks habt würde mich das freuen, ansonsten melde ich mich wieder (wenn ich darf) wenn ich mein Problem besser schildern kann...

              Danke und Grüße,
              Kermit

              1. moin,

                und sorry konnte nicht früher schreiben. Zum glauben... arbeite tatsächlich mit einer MySQL - 5.0.22-community-nt -> zumindest im lokalen Testsystem und da ich erstmal ausgiebigst testen will und sehen will ob ich meine Ideen überhaupt verwirklichen kann wird wohl mein Provider bis dahin mindestens auf diese Version upgedated haben wenn er nicht schon da ist.

                das würde ich im vorfeld abklären, ob dein provider auch die 5.0 einsetzt, bzw. wann er plant das zu tun. wenn man versionsspezifische lösung erarbeitet und dann nachher fesstellt, dass der provider mit der mysql version das nicht unterstützt, das wäre schade um die viele arbeit

                Wie gesagt, das ganze ist erstmal als eine private Interessensübung gedacht und daher der Einwand mit dem Buch (vor 39 geschrieben nach 45 rausgekommen) zwar absolut berechtigt aber im momentanen Stand noch zu vernachlässigen.

                hmm, verstehe ich es richtig, du willst also nur ein wenig fingerspielerei betreiben, um dich in bestimmte thematiken besser einzuarbeiten ? meine meinung dazu ist, lieber gleich richtig lernen, bevor was falsches in fleisch und blut übergeht.

                Leider kann ich mein Problem nicht genau beschreiben, da ich selber gerade erst am Basteln und noch am Brainstormen bin. Im Prinzip möchte ich mir eine Timeline erstellen, eine Art Synchronopse wie der Digitale Peters, aber mit der Möglichkeit die Daten nach Belieben und Vorlieben zu erweitern.

                das brainstorming ist erst mal das, was wichtig ist, alles zusammenzutragen, was für deine umgebung relevant ist. bevor du das nicht hast, macht eine technische umsetzung wenig sinn.

                und ich denke das ich das auch noch hinbekomme die Relation zwischen den beiden Werke zu behandeln

                du hast meinen beitrag nicht richtig gelesen, eine relation ist keine beziehung im kontext von datenbanken, sondern es sind tabellen. was du ständig meinst ist relationship.

                Wie ich sowas vernünftig in der DB abbilde ist mir selber noch nicht ganz klar....

                oftmals mit selfreferenzen, aber das ist erst mal alles zweitrangig, wichtig ist erst einmal, dass du alles zusammenträgst, was du machen willst und welche daten für dich wichtig sind.

                Wenn ihr ein paar gute Tips und Tricks habt würde mich das freuen, ansonsten melde ich mich wieder (wenn ich darf) wenn ich mein Problem besser schildern kann...

                gute tips gibt es hier eigentlich immer. und du würdest es für dich und auch für uns leichter machen, wenn du es wie gesagt nicht von einer technischen seite beschreibst, sondern sprachlich deine umgebung wiedergibst, sprich keine technischen details.

                Ilja