Datenbank Struktur?

Liebe/-r Experte/-in,

steh grad auf dem Schlauch, was die Datenbankstruktur angeht.

Vorab es handelt sich um eine mysql datenbank und ich lese das Ganze im CMS mit sql und php aus.

In meiner Datenbank befindet sich eine Tabelle mit Teilnehmer Profil. Diesen TN hatte ich am Anfang jeweils einen Ort zugeordnet, also:

Tabelle_Profil
id,name,ort,alter…

Jetzt ist es aber so, dass viele TN in mehreren Orten von Deutschland unterwegs sind.
Ich will jetzt nicht die Profil Tabelle um 10 oder mehr Felder mit Ort1, Ort2… u.s.w. erweitern, dass wäre auch bei der Abfrage doof.

Wie baue ich jetzt am besten die neuen Tabellen? Es kommen immer wieder neue Orte dazu und neue Teilnehmer.

Ich möchte dann über ein Suchenfeld Ort, die jeweiligen Teilnehmer auswerfen, die diesem Ort zugeordnet sind.

Wäre schön, wenn du einen Denkanstoß für mich hast.

LG Moni

Hallo Moni,

in einem solchen Fall wäre es sinnvoll, die Orte aus der Profiltabelle herauszunehmen und in eine eigene Tabelle auszugliedern. Da die Profile ja eine eindeutige ID haben, kannst Du eine Tabelle
orte
machen mit den Feldern

  • profilId und
  • ort
    , wobei in profilId die „id“ des Profils und bei Ort eben der Ort eingetragen wird. Dann kannst Du in der Abfrage alle Orte von profilId x auslesen oder aber auch welche Profile sind aus Ort y.

Liebe Grüße

Thorsten

Liebe/-r Experte/-in,

Ich will jetzt nicht die Profil Tabelle um 10 oder mehr Felder
mit Ort1, Ort2… u.s.w. erweitern, dass wäre auch bei der
Abfrage doof.

Wie baue ich jetzt am besten die neuen Tabellen? Es kommen
immer wieder neue Orte dazu und neue Teilnehmer.

Ich möchte dann über ein Suchenfeld Ort, die jeweiligen
Teilnehmer auswerfen, die diesem Ort zugeordnet sind.

Hallo Moni,

das kannst du wie folgt lösen.

Beispiel:
Tabelle_Profil
id,name,alter…

Tabelle_Ort
id,ort…

Tabelle_RelationProfilOrt
id,ort_id,profil_id

Du kannst jetzt ein Profil anlegen und über die Relation-Tabelle 1-n Verknüpfungen zu Profilen und Orte erstellen.

Ich hoffe, dass ich dir eine Anregung geben konnte.

LG
Manfred

Hallo, Moni,

du wirst eine neue Tabelle brauchen, welche Orte enthaelt, und eine sogenannte join-Tabelle, welche Orte mit Teilnehmern verknuepft. wenn du es nicht ganz perfekt haben willst koenntest du die beiden Tabellen verknuepfen, dann hast du die Ortsnamen frueher oder spaeter doppelt und eine Korrektur eines Eintrages wuerde zu Inkonsitenzen fuehren, daher rate ich von falscher Bequemlichkeit hier ab.

Deine Tabellen waeren dann:
Teilnehmer:
id, name, geburtstag (nicht alter, weil das aendert sich jedes jahr…)
Teilnahmeort:
id, name
Teilnahme:
teilnehmer_id,teilnahmeort_id

Natuerlich kannst Du alle Tabellen mit weiteren Attributen versehen, etwa koennte die Teilnahme-Tabelle das Datum der Teilnahme und Kommentare dazu halten, und die Teilnahmeorte koennen Adressdaten, Ansprechpartner und aehnliches halten.

Ein Query ist dann etwas komplizierter zu machen, entweder Du machst es in zwei Phasen und laedst die Teilnahmeorte pro Teilnehmer separat, oder Du laedst alles mit einem join, musst dann aber eine Logik schreiben, welche die Gruppenwechsel registriert. Erstere Variante ist bequemer:

  1. Variante (in meta)
    SELECT … FROM Teilnehmer
    (for each $id in teilnehmer):
    show_teilnehmer_details
    SELECT … FROM Teilnahme t INNER JOIN Teilnahmeort o ON teilnahmeort_id = o.id
    WHERE teilnehmer_id = $id
    show_teilnahmeort_details

  2. Variante
    SELECT … FROM Teilnehmer n INNER JOIN Teilnahme t ON n.id = teilnehmer_id INNER JOIN Teilnahmeort o ON teilnahmeort_id = o.id
    ORDER BY teilnehmer_id
    (for each $id in teilnehmer):
    if (teilnehmer_id changed)
    {
    show_teilnehmer_details
    }
    show_teilnahmeort_details

Ciao!
Kai

Hi Moni,

du benötigst eine DB-Struktur mit n:m Verknüpfung:
jeder Ort kann mit beliebig vielen TN und jeder TN mit beliebig vielen Orten verbunden sein.
Die Orte müssen dafür in einer eigenen Tabelle stehen.
Die Verknüpfung wird über eine dritte Tabelle gebildet, in der für jede Zuordnung ein Datensatz mit tn_id und ort_id steht. Reihenfolge egal, beide Felder bilden zusammen den Primärschlüssel.

Minibeispiel:

Tabelle ort (id, name) mit
1 => Berlin
2 => Hamburg
3 => München

Tabelle teilnehmer (id, name) mit
1 => Hugo
2 => Foo
3 => Trine

Tabelle teilnehmer_ort (tn_id, ort_id) mit
1 => 1
1 => 2
2 => 1
2 => 3
3 => 1
d.h. alle in Berlin, Hugo auch in HH und Foo auch in München

SQL für Teilnehmersuche bei Freitext-Ortseingabe (Variable {$ortInput}):

SELECT T.name AS TeilnehmerName
FROM teilnehmer AS T, teilnehmer_ort as TO, ort AS O
WHERE
T.id = TO.tn_id AND TO.ort_id = O.id
AND
O.name LIKE ‚{$ortInput}‘
ORDER BY T.name

Wenn du die Tabelle ort nicht selbst mit Stammdaten vorbelegen kannst, musst du sie wohl oder übel im Betrieb von den Usern füllen lassen, bei Anmeldung/Registrierung, Account-bearbeiten oder sowas. Immer wenn ein Ortsname angegeben wird, der noch nicht existiert, wird zuerst in ort gespeichert. Dabei fängt man sich schnell unerwünschte Dubletten ein, wg. Buchstabendreher/Rechtschreibung.
Weitere Probleme, die dich erwarten:
Das Update der Zuordnungen ist haarig, weil INSERT und DELETE gleichzeitig nötig sein können.
Und die Migration in die neue Struktur ist auch nicht ohne…

Gruß
Thomas