phpbar.de logo

Mailinglisten-Archive

Re: Codierung
Archiv Mailingliste mysql-de

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Codierung



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


Home | Main Index | Thread Index

php::bar PHP Wiki   -   Listenarchive