Ankündigung

Einklappen
Keine Ankündigung bisher.

Datenbankstruktur

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Datenbankstruktur

    Hallo,

    mein Problem ist, dass ich mit der Datenbankstruktur, die ich geplant habe noch nicht ganz im reinen bin.

    Zunächst habe ich eine Tabelle, die Veranstaltungen listet.
    id | titel | beschreibung | bid | ...
    1 | beispieltitel1 | beispielbeschreibung1 |1 |
    2 | beispieltitel2 | beispielbeschreibung2 |2 |

    Die ist über die bid wiederum mit einer Tabelle "verbunden", die den jeweiligen Verstaltungen einem Bereich zuordnet. Die Veranstaltungen gehören jeweils sozusagen zu einer Kategorie.
    id | kategorie
    1 | Kategoriename1
    2 | Kategoriename2

    Zudem gibt es eine Tabelle, die berechtigten Personen führt, die jeweils zu einer Kategorie gehören.
    id | user | kid | ...
    1| userx | 1 | ...
    2| usery | 2 | ...

    Jetzt sollen die User, sich alle Veranstaltungen listen lassen können (also auch, wo sie selbst drin sind) und sich dort die Veranstaltungen markieren können, die sie wiederum für Ihren eigenen Bereich freigeben. Heißt also vierte Tabelle
    id | kid | bids
    1 | 1 | 1,2
    2 | 2 | 2

    Ich weiß dabei nicht so recht, ob die Überlegungen richtig sind oder ob es schon an der Struktur zu scheitern beginnt. Besondere Bauchschmerzen machen mir die bids, da ich mir nicht sicherbin, wie ich die Verstaltungen dann listen kann und zusätzlich die markiere, die für einen bestimmten Bereich freigeben sind. Ich nehmen an, dass JOIN das Mittel der Wahl ist, aber lässt ON nicht nur einen Vergleich von zwei Werten zu. Hier müsste man doch aber die Veranstaltungen markieren, die für die Kategorien zugelassen werden und dass sind jetzt Zahlenketten, die ich mit implode zusammengefasst habe. Entweder liegt es an einen fehlenden PHP Kenntnissen oder die Struktur ist nicht zu gebrauchen - vielleicht könnt mir etwas dazu sagen.

    Gruß
    Tine

  • #2
    Klingt eher nach SQL, als nach PHP Du kannst mit ON nur zwei Werte vergleichen, allerdings kannst du mehrere Vergleiche anstellen. Leider weiß ich grad nich, wie

    Kommentar


    • #3
      Hallo,
      also zuallererst solltest du darauf achten, dass du deine Daten atomar zerlegst. Also in nicht mehr zu zerkleinernde Elemente. Bei deiner letzten Tabelle ist das nicht der Fall:
      id | kid | bids
      1 | 1 | 1,2
      Und damit würden deine Probleme schonmal anfangen.

      Ich fasse nochmal zusammen:
      Veranstaltungen und Personen gehören jeweils genau einer Kategorie an

      Deine Zuordnung Person:Veranstaltungen verstehe ich nicht so ganz. Indirekt sind ja dem User schon alle Veranstaltungen der Kategorie in der er und die Veranstaltung sich befinden zugeordnet.

      Jetzt möchtest du, dass der User sich nochmal explizit Veranstaltungen zuweisen kann? (ein Merkzettel?)

      Das wäre eine n:m Beziehung und würde bedeuten, du benötigst eine weitere Tabelle
      relation_user_event
      user_id | event_id

      Hoffe ich habe dich richtig verstanden.

      Kommentar


      • #4
        Deine Zuordnung Person:Veranstaltungen verstehe ich nicht so ganz. Indirekt sind ja dem User schon alle Veranstaltungen der Kategorie in der er und die Veranstaltung sich befinden zugeordnet.
        Bei den Personen, die Veranstaltungen für User freigeben und Personen, die Veranstaltungen auswählen, die wiederum alle einer Kategorie angehören (das muss aber nicht in die Datenbank) handelt es sich um grundverschiede Personen. User die Veranstaltungen freigeben und User, die keine Veranstaltungen freigeben, aber nach Veranstaltungen, die für sie freigegeben sind selektieren können.

        Die Alternative zu meinem 1,2,3.. sehe ich noch nicht ganz. Kann man dann keine Beziehung zwischen diesen ids aufbauen.
        In dem Sinne
        SELECT a.*, b.* FROM tabelle1 AS a LEFT JOIN tabelle2 AS b ON a.id IN (b.id) - so gehts nicht, aber so etwas in der Art muss doch möglich sein. Oder bringt mich das in weitere Schwierigkeiten?
        Ich weiß ehrlich gesagt noch nicht, wie ich da weiter herangehen müsste.

        Gruß Tine

        Kommentar


        • #5
          Wie gesagt: Eine n:m Beziehung zwischen Usern und Verstaltungen zB (eine Person kann sich mehrere Veranstaltungen zuordnen und umgekehrt eine Veranstaltung kann mehreren Usern zugeordnet sein) stellt man bei relationalen Datenbanken durch eine Hilfstabelle her. In ihr wird pro Datensatz/Zeile die ID des Users und die ID der Veranstaltung gespeichert.

          Beispiel:
          user:
          user_id | nickname
          1 | peter lustig
          2 | clown

          event:
          event_id | title
          1 | Sziget Festival
          2 | Love Parade
          3 | Rock am Ring

          rel_user_event:
          user_id | event_id
          1 | 1
          2 | 1
          2 | 2
          2 | 3

          Jetzt haben wir folgende die Zurordnung durch rel_user_event:
          Peter Lustig, Sziget Festival (1, 1)
          Clown, Sziget Festival (2, 1)
          Clown, Love Parade (2, 2)
          Clown, Rock am Ring (2, 3)
          (und wohlgemerkt natürlich auch umgekehrt)

          Dein Verständnis-Problem liegt wohl darin (zumindest habe ich es so verstanden), wie selektiere ich jetzt mit einem SQL-Statement den User Peter Lustig und seine Veranstaltungen.

          Das ist nicht möglich.
          Du musst es aufteilen:
          SELECT user_id, nickname FROM user
          SELECT e.event_id, e.title FROM rel_user_event ue INNER JOIN events e ON e.event_id = ue.event_id WHERE ue.user_id = $user_id
          $user_id erlangst du durch den 1. Query.

          Kommentar


          • #6
            Das klingt noch nach sehr viel Arbeit.
            Also auch wenn ich eine 1:n Beziehung zwischen User und Veranstaltungen habe, sollte ich eine 1:1 Beziehung durch eine Zuordnungstabelle machen, weil ein query in meinem Sine so nicht möglich ist?


            Gruß
            Tine

            Kommentar


            • #7
              Richtig in einem Query ist das nicht möglich, aber das heißt nicht, dass du nicht in 2 Queries an die Informationen gelangst, die du haben möchtest (siehe meine beiden Queries oben)
              Aber einen Datensatz/Zeile einer Link-Tabelle nennt man nicht 1:1 Beziehung. Das ist irreführend, da Beziehungen immer abstrakt beschrieben werden, es sich aber bei einem Datensatz/Zeile um konkrete Daten handelt.

              Hast du denn verstanden wofür die Link-Tabelle notwendig ist?
              Wenn nicht frag ruhig.

              Ein interessanter Wiki-Link noch:
              http://de.wikipedia.org/wiki/Normali...28Datenbank%29

              Kommentar

              Lädt...
              X