![]() 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