SQL und Fuzzy-Vergleich

8

Nehmen wir an, wir haben eine Tabelle mit Personen (Name, Vorname, Adresse, SSN, usw.).

Wir möchten alle Zeilen finden, die der angegebenen Person A "sehr ähnlich" sind. Ich möchte eine Art Fuzzy-Logic-Vergleich von A und allen Zeilen aus der Tabelle People implementieren. Es wird mehrere Fuzzy-Folgerungsregeln geben, die separat in mehreren Spalten arbeiten (z.B. 3 Fuzzy-Regeln für den Namen, 2 Regeln für den Nachnamen, 5 Regeln für die Adresse)

Die Frage ist: Welcher der folgenden zwei Ansätze wäre besser und warum?

  1. Implementieren Sie alle Fuzzy-Regeln als gespeicherte Prozeduren und verwenden Sie eine schwere SELECT-Anweisung, um alle Zeilen zurückzugeben, die "A" sehr ähnlich sind. Dieser Ansatz kann die Verwendung von soundex, sim metric usw. beinhalten.

  2. Implementieren Sie eine oder mehrere einfachere SELECT-Anweisungen, die weniger genaue Ergebnisse liefern, "eher ähnlich" wie A und dann Fuzzy-Vergleiche A mit allen zurückgegebenen Zeilen (außerhalb der Datenbank), um "sehr ähnliche" Zeilen zu erhalten. Also würde die Fuzzy-Vergleiche in meiner bevorzugten Programmiersprache implementiert werden.

Tabelle Leute sollten bis zu 500.000 Zeilen haben, und ich würde gerne 500-1000 Abfragen pro Tag machen. Ich benutze MySQL (aber das ist noch zu berücksichtigen).

    
running.t 03.04.2013, 23:12
quelle

4 Antworten

3

Ich glaube nicht, dass es eine definitive Antwort gibt, weil sie von Informationen abhängt, die in der Frage nicht verfügbar sind. Wie auch immer, zu lange für einen Kommentar.

DBMSes können Informationen nach Indizes abrufen. Es macht keinen Sinn, wenn ein Datenbankserver Zeit mit schweren Berechnungen verschwendet, es sei denn, er ist für diesen speziellen Zweck reserviert (wie von @Adrian beantwortet).

Daher sollte Ihre Clientanwendung das Abrufen der von den Regeln benötigten Informationen an das DBMS delegieren.

Wenn die Berechnungen geringfügig sind, können alle auf dem Server ausgeführt werden. Andernfalls ziehen Sie es in das Client-System.

Der Nachteil des zweiten Ansatzes liegt in der Menge der Daten, die vom Server zum Client übertragen werden, und der Anzahl der Verbindungen, die aufgebaut werden müssen. In der Regel ist dies ein Kompromiss zwischen Berechnung und Datenübertragung im Server. Ein Gleichgewicht, das in Abhängigkeit von den Besonderheiten der Fuzzy-Regeln erreicht werden muss.

Bearbeiten: Ich habe in einem Kommentar gesehen, dass Sie fast sicher sind, den Code im Client implementieren zu müssen. In diesem Fall sollten Sie ein zusätzliches Kriterium, Code-Lokalität, für Wartungszwecke in Betracht ziehen, d. H. Versuchen, den gesamten Code, der zusammenhängt, nicht zwischen Systemen (und Sprachen) zu verteilen.

    
koriander 10.04.2013, 19:28
quelle
2

Ich würde sagen, dass es am besten ist, einfache Selects zu verwenden, um die besten Übereinstimmungen zu erhalten, ohne die Datenbank zu hämmern, und dann das Heavy-Lifting in Ihrer Anwendungsebene durchzuführen. Der Grund, warum ich diese Lösung vorschlagen würde, ist Skalierbarkeit: Wenn Sie Ihr Heavy-Lifting in der Anwendungsschicht durchführen, ist Ihr Problem ein perfekter Anwendungsfall für eine Map-Reduction-ähnliche Lösung, bei der Sie die Verarbeitung von Ähnlichkeiten über Knoten verteilen und Ihre Ergebnisse erhalten zurück viel schneller als wenn Sie es durch die Datenbank setzen; Außerdem sperrst du auf diese Weise deine Datenbank nicht und verlangst keine anderen Operationen, die gleichzeitig ausgeführt werden können.

    
Adrian 08.04.2013 16:10
quelle
1

Da Sie immer noch darüber nachdenken, welche DB PostgreSQL verwenden soll, hat fuzzystrmatch das Modul Levenshtein und Soundex-Funktionen. Vielleicht möchten Sie auch auf dem Modul pg_trm wie hier hier nachsehen. Vielleicht könnten Sie den Index auch mit soundex () auf die Spalte setzen, damit Sie das nicht jedes Mal neu berechnen müssen. Aber Sie scheinen zu früh optimieren, so mein Rat wäre, mit pg zu testen und dann fragen, ob Sie optimieren müssen oder nicht, die Zahlen, die Sie wirklich nicht viel scheinen Sie fast zwei Minuten, um eine Abfrage ausgeführt haben / p>     

Jakub Kania 04.04.2013 00:02
quelle
0

Eine Option, die ich in Betracht ziehen würde, ist das Hinzufügen einer Spalte in "People Talbe", die der SoundEx-Wert der Person ist.

Ich habe Joins mit

gemacht %Vor%

Das gibt alles in TableA mit dem gleichen SoundEx-Wert aus der People Tables SoundEx-Spalte zurück.

Ich habe diese Art von Abfrage nicht für Tabellen dieser Größe verwendet, aber ich sehe keine Probleme mit dem Versuch. Sie können diese SoundExColumn auch indexieren, um die Leistung zu verbessern.

    
Rob S 11.04.2013 13:39
quelle