Marya: Geht es auch elegenater

Ein Nutzer (identifiziert über profilID) kann drei Zwischenziele festlegen.
Die Zugehörigen Daten sind in einer Tabelle "adressen" gespeichert.

Schadet es, die Daten für die drei Zwischenziele jeweils über eine eigene Abfrage zu erfassen? Ist ein mehrdimensionales Array evtl. besser geeignet? Allerdings würde dann der SELECT Befehl sehr lang werden?!?

/*Werte für Zwischenziel 1 werden aus Tabelle "zwischenziele"  ausgelesen*/  
$sql = "SELECT strasse, hausnummer, plz, stadt, land FROM adressen JOIN zwischenziele ON zwischenziele.profilID='$id' AND adressen.adressID=zwischenziele.zwz1";  
$query = mysql_query($sql) or die(mysql_error());  
$zwischenziel1_daten = mysql_fetch_array($query); #Ausgelesene Daten werden in einem Array gespeichert  
  
/*Werte für Zwischenziel 2 werden aus Tabelle "zwischenziele"  ausgelesen*/  
$sql = "SELECT strasse, hausnummer, plz, stadt, land FROM adressen JOIN zwischenziele ON zwischenziele.profilID='$id' AND adressen.adressID=zwischenziele.zwz2";  
$query = mysql_query($sql) or die(mysql_error());  
$zwischenziel2_daten = mysql_fetch_array($query); #Ausgelesene Daten werden in einem Array gespeichert  
  
/*Werte für Zwischenziel 3 werden aus Tabelle "zwischenziele"  ausgelesen*/  
$sql = "SELECT strasse, hausnummer, plz, stadt, land FROM adressen JOIN zwischenziele ON zwischenziele.profilID='$id' AND adressen.adressID=zwischenziele.zwz3";  
$query = mysql_query($sql) or die(mysql_error());  
$zwischenziel3_daten = mysql_fetch_array($query); #Ausgelesene Daten werden in einem Array gespeichert
  1. Ich wuerde sagen, das Datenmodell hat Unzulaenglichkeiten die gegen mindestens die 3. Normalform verstossen:

    zwischenziele.zwz1 ... zwz2

    deuten auf spalten hin. Dies sollte hingegen besser in Form von Datensaetzen (einzelne Rows/Records) gemacht werden:

    Adressen
    ----------------------

    • id
    • strasse
    • hausnummer
    • plz
    • stadt
    • land

    Profile
    ----------------------

    • id
    • sonstige attribute

    Profile_Zwischenziele
    ----------------------

    • Profil_ID
    • Adressen_ID
    • von mir aus noch ne reihenfolge (SORTORDER)

    Dann koennte deine Abfrage ungefaehr so lauten:

    SELECT P1.SORTORDER, A.strasse, hausnummer
      FROM Profile_Zwischenziele P1
      INNER JOIN Adressen A ON A.ID = P1.Adressen_ID
      WHERE P1.Profil_ID = $id
      ORDER BY P1.SORTORDER

    Cheers, Frank

    1. Ich wuerde sagen, das Datenmodell hat Unzulaenglichkeiten die gegen mindestens die 3. Normalform verstossen:

      zwischenziele.zwz1 ... zwz2

      deuten auf spalten hin. Dies sollte hingegen besser in Form von Datensaetzen (einzelne Rows/Records) gemacht werden:

      Ja, ich hab das in Spalten gemacht. Jeder Nutzer kann bis zu drei Zwischenziele definieren. Somit existiert in der Tabelle für jeden Nutzer genau ein Datensatz - andernfalls hätte ich in der Tabelle für jeden Nutzer drei Datensätze - fraglich was sinnvoller ist - zumahl ich um eine SORTORDER nicht umhinkomme - also spare ich effektiv genau eine spalte habe aber zwei Datensätze mehr...

      Dann koennte deine Abfrage ungefaehr so lauten:

      SELECT P1.SORTORDER, A.strasse, hausnummer
        FROM Profile_Zwischenziele P1
        INNER JOIN Adressen A ON A.ID = P1.Adressen_ID
        WHERE P1.Profil_ID = $id
        ORDER BY P1.SORTORDER

      Sorry, aber ich verstehe das A. und das P1 nicht ganz....
      saludos
      Marya

      1. Hallo,

        ich wuerde vorschlagen, du beschaeftigst dich ein wenig mit Normalformen in relationalen Datenbanksystemen. Habe da neulich einen guten Artikel gelesen.

        Das A und P1 sind Aliase fuer die verwendeten Tabellen.

        Ciao, Frank

        1. Hi,

          tabelle nutzer:
          profilID|vorname|name

          tabelle adressen:
          adressID|strasse|hausnummer|plz|stadt|land

          tabelle zwischenziele:
          profilID|zwz1|zwz2|zwz3

          In den Spalten zwz1 bis zwz3 werden integers als Referenz auf die jeweilige adressID der Tabelle adressen gespeichert.

          Über Stadt und Land kann man sich noch streiten aber die 3. Normalform besagt, dass es keine transitiven Abhängigkeiten innerhalb des Datensatzes geben darf oder anders gesagt: "Ein Nichtschlüsselattribut darf nicht von einer Menge aus Nichtschlüsselattributen abhängig sein." siehe hier
          Ich kann nicht feststellen, was hier nicht normalisiert sein soll.

          Saludos
          Marya