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