Du braucht einen Graphen mit ungerichteten Kanten - sprich: die Verbindungen müssen doppelt abgelegt werden. Ansonsten musst du wilde if-Konstruktionen in der Query machen um alle Freune von User 1 zu finden. (select freunde-id from tab where user-id = xx - das findet dann ja nur die freundschaften die xx initiert hat)
Desweiteren solltest du dich von deiner autoincrement-id verabschieden. Überleg mal was einen Datensatz bei dir ein-eindeutig macht... stimmt... user-id - freund-id Kombination. Also sollte dein Primary key diese beiden Spalten umfassen. Erst dann kannst du mit mysql ordentlich mit umgehen. Stichwort "insert on duplicate key update".
Du solltest ein externes Script nehmen was die Beziehungen untereinander berechnet und in einer dritten Spalte das Ergebnis speichern. Dieses Ergebnis kann zb ein serialisierter Array sein, wo du die ID's ablegst die die Verbindung herstellen. Beim Ausfragen suchst du dann einfach nach der Kombination die du wissen willst.
Danach machst du einfach eine Abfrage nach den ID's die die Verbindung herstellen in deiner user db.
Im Falle von user 1 und Freund 2 würde der Array zB so aussehen
Wir haben hier mittlerweile eine mysql-Tabelle mit 49Millionen Freundschaftsrelationen (ungerichtet - also 1 kennt 2 und 2 kennt 1; also 49Mil Rows in der Tabelle) und wir machen darin Abfragen in unter 200ms.
Das Script was wir einsetzen nutzt den oben im Thread beschriebenen Dijkstra Algo um direkte Verbindungen raus zu finden - vorher wir allerdings versucht das ganze mit Floyd-Wharshall zu lösen um "alle" Verbindungen zwischen Bekannten rauszufinden. Erst wenn der Teilgraph dafür zu groß ist, wird Dijkstra benutzt.
//edit:
Oh, die Lösung hier sieht wirklich interessant aus http://www.artfulsoftware.com/mysqlb...qled1ch20.html - wenns mal wieder nicht so spät ist, schau ich mirs ma an
Desweiteren solltest du dich von deiner autoincrement-id verabschieden. Überleg mal was einen Datensatz bei dir ein-eindeutig macht... stimmt... user-id - freund-id Kombination. Also sollte dein Primary key diese beiden Spalten umfassen. Erst dann kannst du mit mysql ordentlich mit umgehen. Stichwort "insert on duplicate key update".
Du solltest ein externes Script nehmen was die Beziehungen untereinander berechnet und in einer dritten Spalte das Ergebnis speichern. Dieses Ergebnis kann zb ein serialisierter Array sein, wo du die ID's ablegst die die Verbindung herstellen. Beim Ausfragen suchst du dann einfach nach der Kombination die du wissen willst.
PHP-Code:
$sql = "select payload from tab where user-id = ".$user_id." and freund-id = ".$freund_id;
PHP-Code:
$sql = "select name from user where id in(".implode(",", unserialize($payload))."))";
PHP-Code:
array(1,5,23,2)
Das Script was wir einsetzen nutzt den oben im Thread beschriebenen Dijkstra Algo um direkte Verbindungen raus zu finden - vorher wir allerdings versucht das ganze mit Floyd-Wharshall zu lösen um "alle" Verbindungen zwischen Bekannten rauszufinden. Erst wenn der Teilgraph dafür zu groß ist, wird Dijkstra benutzt.
//edit:
Oh, die Lösung hier sieht wirklich interessant aus http://www.artfulsoftware.com/mysqlb...qled1ch20.html - wenns mal wieder nicht so spät ist, schau ich mirs ma an
Kommentar