Fragebogen Match - Beste Ergebnisse

Dimenson

Erfahrenes Mitglied
Moin,

ich plane ein Projekt, wo man Interessen hinterlegen kann. Mitglieder sollten einen Wert angezeigt bekommen (Prozentual) wie identisch die Interessen der User mit seinen Interessen sind.

Momentan bin ich am überlege wie ich das am Besten umsetze.

Und hänge leider gerade ein bißchen.

Vielleicht nochmal zum Verständnis:

Interessen:

User A:
Kino,Essen,Fortgehen,Party

User B:
Fernsehen,Essen,Kochen,Party

Also sind die Interessen zu 50 % identisch.

Für mich stellt sich die Frage, wie eine effiziente Datenbankstruktur hierfür aussehen könnte.
Bzw. kann ich eine Art Matching direkt in MySQL ausrechnen (rauspicken), ohne jetzt hunderte Datensätze auszulesen und auszurechen mit PHP ?
 
Zuerst musst du dir im klaren sein wie du das berechnen willst
Du hast da ein Beispiel wo beide gleich viele Interessen haben. Aber wie siehts damit aus?

User A:
Essen,Party

User B:
Fernsehen,Essen,Kochen,Party

Sind das 100% oder 50%?

Am besten nachher die Daten normalisiert speichern. Eine Usertabelle und eine Tabelle mit den Interessen sowei eine Tabelle mit den IDs von beiden.
 
Ich selber noch nicht ganz im Klaren, wie sowas überhaupt aussehen kann. Ich mein klar, eine Tabelle mit User, eine mit Interessen und eine Tabelle wo die Verknüpfung herstellt.

2 User direkt mit einander vergleichen sollte kein Problem sein.
Aber wie finde ich nun, zum Beispiel die 10 bestpassensten Ergebnisse heraus.

Vielleicht wäre es sinnig einen seperaten Prozess für die Kalkulation die dann die Relationen von User A und User B in einer seperaten Tabelle auch ablegt.

Ich kann mir durch aus vorstellen, dass dies sehr auf die Performance gehen kann wenn ich dies in Echtzeit berechnen würde.
 
Die Performance kommt sehr auf die Datenmengen an. Mit wieviel Millionen Einträgen rechnest du?
 
Also ne vernünftige Normalisierung ist auf jedenfall wichtig ("Kochen", "kochen", "koche.")
Und das werden bestimmt dicke (lange) Abfragen, außer Yaslaw heut jetzt ne Funktion raus, die ich noch nicht kenne :p
 
Ist das nun ironisch gemeint?
Sorry wenn ich evtl. die Frage falsch verstanden habe.

Aber Millionen hört sich erstmal übertrieben an? Naja zumindest kann ich es bisher mir nicht vorstellen.
Ich rechne mal mit 10.000 Usern. Und evtl. 100 Usern gleichzeitig Online. 100 User würden dann gleichzeitig die Option nutzen.
 
Ist doch nicht mehr schwer

ungetestet:
SQL:
SELECT
	-- Die User-ID des selektionierten Users
	uz.user_id				AS selected_user_id,
	-- Die User-Id des gefundenen User
	z.user_id 				AS founded_user_id
	-- Anzahl übereinstimmungen 
	COUNT(z.interest_id) 	AS cnt_interest,
	-- Anzahl Interessen die der selektionierte User hat
	COUNT(DISTINCT  uz.interest_id) AS cnt_interest_of_selected_user,
	-- Wieviel Prozent von den User.-Interesse beim anderen Vorhanden ist
	(COUNT(DISTINCT  uz.interest_id) / COUNT(z.interest_id)) * 100 AS percent
FROM
	-- Tabelle zuo ist die Tabelle mit den User-Ids und den Interessen-Ids
	-- Einmal für den ausgewählten User
	zuo	AS uz,
	-- und einmal für die übereinstimmungen
	INNER JOIN zuo AS z
		ON uz.interest_id =  z.interest_id
WHERE
	uz.user_id = 1
GROUP BY
	z.user_id
ORDER BY 
	COUNT(z.interest_id) DESC

Natürlich auf beide Felder einen Index setzen...
 
Zuletzt bearbeitet von einem Moderator:
Zurück