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