Mailinglisten-Archive |
Oliver Antosch schrieb am Samstag, den 4. September 1999:
> >> speichere also z.B. 3~34~36~45 im Feld Hobby und
> >> dekodiere das hinterher wieder zurück in die Hobbys.
> > dann machst du dir das Leben ordentlich schwer !!
> > Jeder wird von deinen Usern ja einen Nummer (ID) bekommen,
> > anhand dieser ist jeder User identifizierbar.
>
> > Erstelle einfach einen neuen Table Namens Hobby, dort einfach
> > verwendbare Hobbies eingeben ( HobbyID | HobbyText )
>
> > Nun kommt der Knackpunkt um die beiden Tabellen zu verknüpfen:
> > Tabelle HobbyLink erzeugen mit Spalten ( UserID | HobbyID )
> > und dort dann abspeichern welcher User welches Hobby hat.
[...]
> scheint mir noch komplizierter mit 3 Tabellen zu hantieren, zumal
> wenn ein user 20 hobbys hat, insgesamt 20 einträgen in der HobbyLink
> Tabelle nötig sind.
>
> Bringt das wenigstens was hinsichtlich der Performance?
Wenn Du jeweils Indexe auf die verschiedenen IDs hast, mit Hilfe derer
die Tabellen verknüpft werden, wird alles sehr schnell sein!
Das Grundproblem ist, daß das Hobby hier ein mengenwertiges Feld sein
soll, das also eine Menge von Werten aufnehmen soll. Genau dafür sind
relationale Datenbanksysteme wie MySQL aber schlecht geeignet und
Markus Bellenbergs Vorschlag "MBV" ist die normale (und meist auch
beste) Lösung dafür: statt eine ganze Menge von Werten in ein Feld zu
stecken, macht man eine eigene Tabelle (HobbyLink in diesem Fall).
(Das Vermeiden von mengenwertigen Felder heißt dann übrigens
1. Normalform.)
Probleme, die bei Deinem Lösungsansatz "OAV" ('3~34~36~45')
auftauchen, sind:
- Wie bekommst Du die Hobbies eines Users wieder im Klartext?
Mit OAV: Du wirst das letztendlich wohl in einer Programmschleife
auf der Anwendungsseite (PHP?) machen müssen.
Mit MBV:
SELECT h.HobbyText FROM Hobbies AS h, HobbyLink AS hl
WHERE hl.UserID = 4711 AND hl.HobbyID = h.HobbyID;
- Wie fügst Du einem User ein neues Hobby hinzu?
Mit OAV: Wieder nur per Anwenungsprogramm machbar: Du mußt den
bisherigen Hobbystring lesen, die neue HobbyID neu an der
richtigen Stelle einfügen und den neuen Hobbystring wieder in
MySQL speichern.
Mit MBV:
INSERT INTO HobbyLink VALUES (4711, 37);
Oder wenn das Hobby nur per Name vorliegt:
INSERT INTO HobbyLink
SELECT 4711, HobbyID FROM Hobbies WHERE HobbyText='Bungy';
- Wie löscht Du ein Hobby?
...
- Wie findest Du alle User, die ein bestimmtes Hobby gemein haben?
Mit OAV: SELECT UserID FROM User WHERE Hobby LIKE '%36%';
Für solche LIKE-Abfragen kann MySQL keinen Index nutzen und
muß einfach durch alle Datensätze suche - das wird langsam!
Mit MBV: SELECT DISTINCT UserID FROM HobbyLink WHERE HobbyID = 36;
Und so weiter ...
Der einzige halbwegs effiziente Weg, den mengenwertigen Lösungsansatz
weiterzuverfolgen, ist es, für das Hobby-Feld einen SET-Feldtyp zu
verwenden. Ist in der Handhabung auch nicht völlig problemlos
(Löschen von Hobbies ist z.B. umständlich), aber vor allem bist Du
dann auf max. 64 verschiedene Hobbies beschrankt - und die Auswahl der
hobbies mußt Du bei der Tabellendefinition schon fest vorgeben ...
Ciao,
Martin
--
Martin Ramsch <m.ramsch_(at)_computer.org> <URL: http://home.pages.de/~ramsch/ >
PGP KeyID=0xE8EF4F75 FiPr=52 44 5E F3 B0 B1 38 26 E4 EC 80 58 7B 31 3A D7
---
*** Abmelden von dieser Mailingliste funktioniert per E-Mail
*** an mysql-de-request_(at)_lists.4t2.com mit Betreff/Subject: unsubscribe
php::bar PHP Wiki - Listenarchive