2009-11-19 1 views
5

Ich habe eine Tabelle von 100.000 USER (Name, Alter, Geschlecht, Telefon, Firma, Straße, Stadt, Staat, Land, Postleitzahl, etc).Wie können Regeln mit einer MySQL-Tabelle dargestellt werden?

Ich habe auch eine Tabelle von Tausenden von Angeboten, die Benutzern angeboten werden. Jetzt muss ich für jede Werbung eine Regel hinzufügen, die definiert, für welche Teilmenge von Benutzern sie gilt.

Zum Beispiel könnte eine Regel: Alle Benutzer, die eine zipcode von 10000 bis 19999

Eine weitere Regel könnte sein: Alle Benutzer, die weiblich sind und leben nicht in den USA

Noch ein dritte Regel könnte sein: Benutzer älter als 18, die in DC, MD oder VA leben. usw.

Nun einen bestimmten Benutzer gegeben, möchte ich (effizient!) Herausfinden, welche Angebote für diesen Benutzer gelten.

Was ist eine gute Strategie zur Modellierung dieser Regeln, da ich in der Lage sein werde, schnell passende Promotions für einen bestimmten Benutzer zu finden?

+0

Da es Konsens ist, dass ich Speichern Sie meine Regeln als SQL-Abfragen. Gibt es ein Tool zum interaktiven Erstellen solcher Abfragen? Ich betreibe PHP/CakePHP/MySQL. Vielen Dank! – Sleepster

Antwort

2

Hier ist ein Ansatz.

Wenn Sie jede Regel zu einem einfachen Vergleich aufschlüsseln können, ist es möglich, es so auf eine Weise zu speichern, die für alles funktioniert. Was Sie am Ende haben, ist eine Folge von Regelelementen, die ein Feld, einen Wert und einen Vergleich umfassen (z. B. gleich, nicht gleich usw.). Sie müssen auch zu einer tatsächlichen Regel gehören (die Sie benennen können), die in einer anderen Tabelle aufgeführt wäre.

Jetzt wird es kompliziert. Jedes Regelelement hat auch eine Ebene. So können Sie UND- und ODER-Vergleiche durchführen, da sie eine Hierarchie benötigen. Die Art und Weise, wie ich das vorher gemacht habe, ist, dass gerade Ebenen UND und ungerade Ebenen ODER. Das bedeutet, dass zwei Elemente, die für eine Regel wahr sein müssen, beide auf Level 0 sind, dh sie müssen beide validieren. Für eine Regel, die eine Mussbedingung hat, und zwei weitere, wo beide wahr sein können, dh 1 AND (2 ODER 3), setzen Sie die Mussregel auf Ebene 0 und die anderen beiden auf Ebene 1.

Der Vorteil davon Ansatz ist, dass der Code zum Assemblieren der SQL-Filter die Verschachtelung richtig, weil es den AND/OR-Modus richtig haben muss. Es ermöglicht auch, einen Editor für die Regeln zu erstellen.

Diese Lösung ist jedoch, wie alle anderen, erfordert nach wie vor alle Regeln wiederum auf Ihre Benutzer die Anwendung Sätze zu finden, die dem Benutzer erlauben Regeln, die Sie interessieren.

+0

Das ist brilliant. Vielen Dank! –

1

Dies geschieht normalerweise nicht auf Datenbankebene; Stattdessen würden "Regeln" von Ihrem Backend interpretiert werden (unabhängig von der Sprache, die Sie dort verwenden). Wie sie in der Datenbank gespeichert werden, hängt davon ab, wie sie modelliert werden. Dieser Ansatz kann so einfach oder so komplex sein, wie es sein muss - Regeln können dynamisch von Ihren Endbenutzern definiert werden usw.

Das sagte, wenn Sie schnell und schmutzig (mit HUGE suchen Schwerpunkt auf Dirty) Lösung, können Sie Ihre Regeln möglicherweise als tatsächliche Abfragen speichern (oder where Bedingungen für Abfragen). Sie können dann gespeicherte Prozeduren schreiben, um diese Regeln anzuwenden.

2

Näheres zu mir, dass Ihre Regeln können wirklich alles sein und sind besser durch verschiedene Abfragen dargestellt.

Sie sollten die Modell gehen in (MVC) oder vielleicht in gespeicherte Prozeduren. Kann mich wirklich nicht darauf konzentrieren.

Jedes Mal, wenn eine neue Werbung in die Stadt kommt, würde das System alle Benutzer durchlaufen und die Übereinstimmungen in einer Tabelle speichern, die Benutzer und Werbeaktionen verbindet. Das gilt auch für jeden neuen Benutzer, der sich registriert. Du könntest auch darüber nachdenken es in einen Cronjob zu legen.

EDIT:
Sie beachten Sie, dass die Tabelle, die die Benutzer direkt zu den Aktionen verknüpft ist entscheidend, wenn Sie wirklich suchen Leistung sind.

Nur meine zwei Cent.

2

Was ist, wenn Sie Ihre Regeln im "SQL-ähnlichen" Formular gespeichert haben? Zum Beispiel haben Sie eine USERS-Tabelle und eine PROMOTIONS-Tabelle, wie Sie bereits erwähnt haben.

Sie könnten zwei neue Tabellen hinzufügen, PROMOTION_RULE und PROMOTION_PROMOTION_RULE. Die PROMOTION_RULE würde die Regeln enthalten und PROMOTION_PROMOTION_RULE würde eine bestimmte Promotion mit den zugehörigen Regeln verknüpfen. Mit diesem Design können Sie die gleiche Regel für mehrere Werbeaktionen teilen.

In PROMOTION_RULE, könnten Sie eine Spalte speichern RULE_SQL genannt, und man konnte speichern Werte wie:

(gender != 'F' and country != 'US')  
(age > 18 and state IN ('DC','MD','VA') 

usw.

Dann könnte man die Regeln nachschlagen, die für eine Förderung bewerben, und dynamisch Erstellen Sie eine SQL-Anweisung, die aus den rule_sql-Werten besteht.

2

Es hängt davon ab, wer die Regeln eingibt und wie viel Vertrauen Sie für sie haben. Wenn Sie buchstäblich die Regeln hinzufügen, können Sie sie als SQL-Anweisungen in der Datenbank speichern, aber das scheint hacky oder als gespeicherte Prozeduren, aber ich bin mir nicht sicher, ob Sie eine Spalte haben können, die auf diese verweist (natürlich eine String-Spalte).

Sie sagen nicht, welche Art von Framework Sie verwenden, aber wenn Sie ein ORM verwenden, könnten Ihre Regeln Abfrageobjekte sein, die als BLOBs in die Datenbank serialisiert werden können. Wenn Sie beispielsweise SQLAlchemy für Python verwenden, kann jede Regel eine Instanz von Query sein, die Sie an die User.filter-Funktion übergeben können.

In all diesen Fällen lässt sich willkürlicher Code injizieren, so dass sie anderen nicht erlauben, Regeln hinzuzufügen. Die einzige gute Lösung wäre, eine begrenzte domänenspezifische Sprache zu erstellen, um die Regeln auszudrücken, und diese in SQL oder Ihre ORM-Sprache umzuwandeln.

+0

Ja, ich bin derjenige, der die Regeln hinzufügt. Ich sehe, was Sie bezüglich der Umwandlung von "Regelsprache" in Abfrage sagen. Irgendwelche Hinweise auf Tools zum Definieren solcher Regeln und zum Konvertieren in SQL-Abfragen? – Sleepster