2017-03-24 6 views
0

Angenommen, ich baue eine Dating-App, die basierend auf ihren Dating-Zielen Empfehlungen für Nutzer generiert. Lassen Sie uns sagen, dass die Benutzer in der Datenbank vertreten sind wie folgt:Effiziente Möglichkeit, Datenbankzeilen nach Spalten zu gruppieren?

 Column  |   Type          
---------------------+----------------------------- 
id     | bigint 
updated_since  | timestamp 
goal    | text 

Und lassen Sie uns sagen, dass der Wert für goal eine von vier Dinge sein:

  1. seeking_sugar_daddy
  2. seeking_sugar_mama
  3. be_sugar_daddy
  4. be_sugar_mama

Nehmen wir an, ich habe eine Empfehlungs-Engine, die regelmäßig ausgeführt wird und Übereinstimmungen für alle Benutzer basierend auf Zielen und einigen anderen Kriterien (Höhe, Alter usw.) generiert. Die Empfehlungs-Engine nimmt ein Paar Benutzer als Eingabe und generiert eine Punktzahl.

Was ist der effizienteste Weg, eine Liste von Eingaben für die Empfehlungsmaschine zu generieren? Die einzigen gültigen Eingaben sind Paare mit übereinstimmenden Zielen - zum Beispiel, wenn User A ein Ziel seeking_sugar_daddy hat und ein Ziel be_sugar_daddy hat, das eine gültige Eingabe wäre, aber seeking_sugar_daddy und be_sugar_mama wären kein gültiges Paar.

Sobald ich alle Benutzer aus der Datenbank ergreife, wie sollte ich sie gruppieren? Oder gibt es eine Möglichkeit, dies in der Datenbank zu tun?

+0

'dating app'? Mann der afrikanischen Unterordnung bitte .. –

+0

ha - nicht wirklich eine Dating-App ... – user3919580

Antwort

0

Lassen Sie uns Ihre Ziele zu "A" abkürzen, "C", "G", "T", wo A Spiele T und C entspricht G. Hier sind Ihre Begegnungen:

SELECT * from users AS a JOIN users AS b 
ON (a.goal = "A" AND b.goal = "T") OR (a.goal = "C" and b.goal = "G") 

Beachten Sie, dass da erscheint die gleiche Tabelle auf der linken und rechten es gibt keine Notwendigkeit zu überprüfen, a.goal = "T" usw.

+0

Vielen Dank für Ihren Kommentar. Ich endete mit etwas ähnlichem: 'SELECT u1.id, array_agg (u2.ID) VON Benutzer AS u1 JOIN Benutzer als u2 ON (u1.goal = 'A' und u2.goal = 'T') ODER (u2.goal = 'C' und u2.goal = 'G') GROUP BY u1.id; ' – user3919580

1

Sie benötigen eine relationship Tabelle, um Attribute zu paaren. (natürlich verwenden Sie ids keinen Text)

atributeA    | atributeB 
    -------------------------------------------- 
    seeking_sugar_daddy | be_sugar_daddy 
    be_sugar_daddy  | seeking_sugar_daddy 
    .... 

Sie dann dieses

SELECT * 
FROM users u1 
JOIN relationship r 
    ON u1.goal = r.atributeA 
JOIN users u2 
    ON r.attributeB = u2.goal 

HINWEIS Benutzer wie entsprechen: Dies ermöglicht es Ihnen, mehrere Attribute später statt harter Code die Bedingungen auf hinzufügen die Abfrage.

Auch dupliziere/invertiere ich die Beziehung, um die Suche wie who are the match for 'UserA' einfacher zu machen. Aber wenn Sie nur alle Benutzer übereinstimmen möchten, brauchen Sie nicht doppelt.

+0

Schöne Idee, aber wenn Sie alle Paare (Reverse-Included) in diese 'Beziehung' Tabelle setzen, dann wird das Ergebnis der Abfrage auch jeden passenden Benutzer enthalten zwei mal (einmal umgekehrt). Ich weiß nicht, ob OP das auch will. – pozs

+0

Ja, ich füge einen zusätzlichen Kommentar hinzu, um zu erklären, warum. –

Verwandte Themen