Ich arbeite an einem Usermatch für del.icio.us (inoffiziell, nur zur Übung). Dabei habe ich Tabellen, um die User zu speichern, die Links, die diese in ihren Bookmarks haben, und die Tags, mit welchen sie die Links gekennzeichnet haben:
Die drei ersten Tabellen verbinde ich mit den zwei Zwischentabellen users_tags und tags_links. Mit Hilfe von Joins kann ich dann die Links mit zugehörigen Tags eines Benutzers rausholen.
Nun möchte ich den Benutzern die Möglichkeit bieten, andere Benutzer mit einem ähnlichen Geschmack zu finden (also solche, die dieselben Tags ähnlich oft mal gebraucht haben). Was ich nun suche, sind DB-Kniffe, wie man dies besonders effizient umsetzen könnte.
Ein erster Ansatz von mir war, die users_tags Zwischentabelle um die Anzahl der Verwendung zu erweitern.
Schliesslich kann man mehrere Links mit demselben Tag bezeichnen. Dann hätte ich einfach einen Join mit den Tabellen users und users_tags gemacht, und dann mit serverseitigen Skriptsprachen die Tagprofile der anderen Usern mit dem des aktuellen verglichen.
Leider führt das schnell zu riesigen Datenmengen.
Eine zweite Idee war, eine weitere Tabelle der folgenden Art einzuführen:
Diese Tabelle würde die User mitsamt ihren meistbenutzten Tags enthalten (tag1id bis tagxid...vielleicht top3 oder top10). Diese Tabelle könnte man nun leicht sortieren, und dann einfach die 5 vorhergehenden und die 5 nachfolgenden des aktuellen Benutzers nehmen, um z.B. die 10 "Nachbarn" zu finden.
Vielleicht hat jemand noch weitere Ideen? Oder gibt es eventuell einen formellen Ansatz, wie man Elemente in "n zu n" Beziehungen miteinander vergleichen kann?
Code:
users ----- id name links ----- id url tags ---- id name users_tags ---------- user_id tag_id tags_links ---------- tag_id link_id
Nun möchte ich den Benutzern die Möglichkeit bieten, andere Benutzer mit einem ähnlichen Geschmack zu finden (also solche, die dieselben Tags ähnlich oft mal gebraucht haben). Was ich nun suche, sind DB-Kniffe, wie man dies besonders effizient umsetzen könnte.
Ein erster Ansatz von mir war, die users_tags Zwischentabelle um die Anzahl der Verwendung zu erweitern.
Code:
users_tags ---------- user_id tag_id count
Leider führt das schnell zu riesigen Datenmengen.
Eine zweite Idee war, eine weitere Tabelle der folgenden Art einzuführen:
Code:
toptags ------- playerid tag1id tag2id tag3id
Vielleicht hat jemand noch weitere Ideen? Oder gibt es eventuell einen formellen Ansatz, wie man Elemente in "n zu n" Beziehungen miteinander vergleichen kann?
Kommentar