php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 03-05-2007, 09:51
ArSeN
 Registrierter Benutzer
Links : Onlinestatus : ArSeN ist offline
Registriert seit: Feb 2006
Ort: Berlin
Beiträge: 1.052
ArSeN ist zur Zeit noch ein unbeschriebenes Blatt
ArSeN eine Nachricht über ICQ schicken ArSeN eine Nachricht über AIM schicken ArSeN eine Nachricht über Yahoo! schicken
Standard Beziehungen zwischen Benutzern ermitteln

Hallo!

Sicherlich bin ich nicht der erste mit diesem Problem, leider finde ich bei Google aber gar nichts zu dem Thema und in der Forensuche habe ich nur diesen Thread gefunden.

Derjenige der dort eine Lösung für das Problem gefunden hat war leide rnicht willens sie zu posten. Ich habe auch selbst bereits zwei Lösungen für mein Anliegen gefunden. Die Probleme dabei sind aber, dass die Rekursive Lösung vieeeeel zu lange braucht weil Sie sich hunderte oder gar tausende male selbst aufruft, was meinen RAM natürlich ganzschön belastet. Dann habe ich noch eine Iterative Lösung mit ganz viele Schleifen gefunden, aber die Arrays werden dabei auch so groß, dass das ganze Performancemäßig nicht akzeptabel ist.

Zunächst muss ich noch sagen: Es handelt sich hierbei um Freundschaften zwischen den einzelnen Benutzern. Das heißt, ich habe zwei Attribute in meinem Entitätstyp, und jeder Benutzer kann X-Beliebig viele Freunde haben.

Problematischerweise haben tatsächlich ein Großteil der Benutzer so 20-40 Freunde, was das ganze nicht gerade vereinfacht.

Mein endgültiges Ziel ist es, 3 Beziehungen über maximal 6 "Ebenen" (also über 4 User zwischen dem Start- und dem End-User) zu "berechnen".

Meine Frage daher: Gibts vielleicht irgend'ne Möglichkeit das ganze direkt in MySQL realisieren? Oder gibts sonst noch irgendeine Möglichkeit, die mir die Performance akzeptabel machen kann?

Ich wäre für jede Hilfe dankbar und bedanke mich schonmal im Voraus. Danke!
__________________
Nur wenige wissen, wieviel man wissen muss, um zu wissen, wie wenig man weiß.
Mit Zitat antworten
  #2 (permalink)  
Alt 03-05-2007, 10:22
asp2php
 Banned
Links : Onlinestatus : asp2php ist offline
Registriert seit: Feb 2004
Beiträge: 11.745
asp2php ist zur Zeit noch ein unbeschriebenes Blatt
Standard

hm ... das ist nur eine m:n Beziehung, die man mit 3 Tabellen - bzw. hier 2 - leicht aufbauen kann, wasfür Probleme hast du?
Mit Zitat antworten
  #3 (permalink)  
Alt 03-05-2007, 10:29
ArSeN
 Registrierter Benutzer
Links : Onlinestatus : ArSeN ist offline
Registriert seit: Feb 2006
Ort: Berlin
Beiträge: 1.052
ArSeN ist zur Zeit noch ein unbeschriebenes Blatt
ArSeN eine Nachricht über ICQ schicken ArSeN eine Nachricht über AIM schicken ArSeN eine Nachricht über Yahoo! schicken
Standard

Mit der m:n-Beziehung an sich habe ich kein Problem.

Es gibt 2 Tabellen, die benutzertabelle, und die freundetabelle.

In der freundetabelle steht jetzt sowas wie:

Code:
benutzer_id          freund_id
433                       467
433                       448
433                       458
433                       400
487                       876
467                       1387
1387                     5387

Wenn ich jetzt wissen will, welche Beziehung der benutzer 433 zum Benutzer 5387 haben will, soll dabei herauskommen: 433 -> 467 -> 1387 -> 5387.

Dazu brauche ich sowohl bei der rekursiven als auch bei der iterativen Variante relativ viele Abfragen. Undzwar deswegen, weil ich, wenn ich vom Benutzer 433 ausgehe ja zunächst grundsätzlich alle Freunde auswählen muss, weil ich ja nicht weiß, welcher im Endeffekt auch wirklich zum Gewünschten Benutzer führt. Ich müsste also obwohl hier nur der Freund 467 zutreffen würde, auch die Freunde 448, 458 und 400 auswählen, und deren Freunde auch wieder, und und und....

Das ganze frisst performance ohne ende. Daher suche ich nach einer anderen Variante.
__________________
Nur wenige wissen, wieviel man wissen muss, um zu wissen, wie wenig man weiß.
Mit Zitat antworten
  #4 (permalink)  
Alt 03-05-2007, 10:35
closure
 Master
Links : Onlinestatus : closure ist offline
Registriert seit: Mar 2006
Beiträge: 796
closure ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hi,

dein problem lässt sich als graph interpretieren. Wenn du
alle freunde von einem bestimmten knoten haben willst, dann musst
du die transitive hülle der freundschaftrelation bestimmen.
Wenn du mal nach graphen-algorithmen und transitive closure suchst
dann findest du schon mal die theorie dahinter.
Unglücklicherweise eignen sich relationale datenbanken nicht
sonderlich zum abbilden von graphen. Ein möglichkeit is sicher
eine adjazenzmatrix oder in deinem fall sicher interessanter in
form einer kantenliste. Aber hier tritt ja bereits das problem auf,
eine abfrage über alle beziehungen funktioniert nur über rekursive
queries.

Eine möglichkeit wäre es auf die graphendarstellung zu verzichten
weil du ausser dem finden der transitiven hülle, keine anderen
graphen-algorithmen brauchst.
Du könntest dann beim einfügen der daten bereits die bekanntschafts
beziehungen ermitteln und in der datenbank so speichern dass eine
abfrage schnell geht.
Dadurch dauert zwar das speichern/löschen länger aber die
abfrage geht schnell. Du musst entscheiden was öfter vorkommt.
Inbesondere durch deine einschränkung der beziehungstiefe
könnte das ein gangbarer weg sein.

greets
__________________
(((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")
Mit Zitat antworten
  #5 (permalink)  
Alt 03-05-2007, 10:54
ArSeN
 Registrierter Benutzer
Links : Onlinestatus : ArSeN ist offline
Registriert seit: Feb 2006
Ort: Berlin
Beiträge: 1.052
ArSeN ist zur Zeit noch ein unbeschriebenes Blatt
ArSeN eine Nachricht über ICQ schicken ArSeN eine Nachricht über AIM schicken ArSeN eine Nachricht über Yahoo! schicken
Standard

Hi!

Also unter deinen Stichworten habe ich das hier gefunden. Allerdings würde ich lügen wenn ich behaupten würde ich würde den Großen teil davon verstehen, geschweige denn hätte jetzt ne Idee wie ich das umsetzen kann.

hast du vielleicht noch n besseren Link für mich oder ne konkretere Idee wie ich da sjez umsetzen könnte?


Edit: Ach nochwas, das mit dem "Beziehungen abspeichern" und dann einfach aus der DB auslesen hab ich mir auch schon gedacht. Allerdings ist das bei fast 30 Tausend Benutzern, bei denen ich ja von jedem alle möglichen Beziehungen zu jedem anderen abspeichern müsste, sehr unrelaistisch knapp eine Million beziehungen abzuspeichern, oder nicht?
__________________
Nur wenige wissen, wieviel man wissen muss, um zu wissen, wie wenig man weiß.

Geändert von ArSeN (03-05-2007 um 10:59 Uhr)
Mit Zitat antworten
  #6 (permalink)  
Alt 03-05-2007, 11:01
closure
 Master
Links : Onlinestatus : closure ist offline
Registriert seit: Mar 2006
Beiträge: 796
closure ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hi,

das hier sieht gut aus transitive closures in sql

greets
__________________
(((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")
Mit Zitat antworten
  #7 (permalink)  
Alt 03-05-2007, 11:11
ArSeN
 Registrierter Benutzer
Links : Onlinestatus : ArSeN ist offline
Registriert seit: Feb 2006
Ort: Berlin
Beiträge: 1.052
ArSeN ist zur Zeit noch ein unbeschriebenes Blatt
ArSeN eine Nachricht über ICQ schicken ArSeN eine Nachricht über AIM schicken ArSeN eine Nachricht über Yahoo! schicken
Standard

Huhu!

Sorry das ich schonwieder nerve.

Ehm.. ehrlichgesagt finde ich außer dem Abstract auf der Seite kaum Inhalt.
__________________
Nur wenige wissen, wieviel man wissen muss, um zu wissen, wie wenig man weiß.
Mit Zitat antworten
  #8 (permalink)  
Alt 03-05-2007, 11:28
closure
 Master
Links : Onlinestatus : closure ist offline
Registriert seit: Mar 2006
Beiträge: 796
closure ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hi,

oben rechts gibt es einen link zu dem dokument in diversen formaten.

greets
__________________
(((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 13:57 Uhr.