Geht es auch elegenater
Marya
- datenbank
0 Frank The Tank0 Marya0 Frank (no reg)0 Marya
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
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
----------------------
Profile
----------------------
Profile_Zwischenziele
----------------------
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
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
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
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