finden Sie doppelte Adressen in der Datenbank, verhindern Sie, dass Benutzer diese Eingabe früh?

StackOverflow https://stackoverflow.com/questions/37568

Frage

Wie finde ich doppelte Adressen in einer Datenbank, oder besser aufhören, Menschen bereits beim ausfüllen des Formulars ?Ich denke, je früher, desto besser?

Gibt es eine gute Möglichkeit der Abstraktion, Straße, Postleitzahl etc., so dass Tippfehler und einfache versuche, 2-Registrierungen erkannt werden können?wie:

Quellenstrasse 66/11 
Quellenstr. 66a-11

Ich spreche Deutsch-Adressen...Vielen Dank!

War es hilfreich?

Lösung

Johannes:

@PConroy:Dies war mein erstes dachten auch.der interessante Teil über diese ist zu finden, gute transformation Regeln für die verschiedenen Teile der Adresse!Irgendwelche guten Vorschläge?

Wenn wir haben gearbeitet auf diese Art von Projekt vor, unser Ansatz war es, unseren bestehenden Korpus der Adressen (150k oder so), dann gelten die gängigsten Transformationen für unsere domain (Irland, so "Dr"->"Fahren", "Rd"->"Straße", etc).Ich fürchte, es gab keine umfassende online-Ressource für solche Dinge in der Zeit, wir landeten also im Grunde kommen mit einer Liste uns, überprüfen Sie Dinge wie das Telefonbuch (gedrückt Raum, dort sind die Adressen gekürzt Weise!).Wie ich bereits erwähnt, Sie würden staunen, wie viele "doppelte" du wirst erkennen, mit der Zugabe von nur ein paar gemeinsame Regeln!

Vor kurzem habe ich stolperte über eine Seite mit einem ziemlich umfassenden Liste der Adresse Abkürzungen, obwohl es im amerikanischen Englisch, so dass ich nicht sicher bin, wie nützlich es sein würde, in Deutschland!Eine schnelle google-drehte ein paar Seiten, aber Sie schien wie von Spam-newsletter sign-up fallen.Obwohl das war mir googeln in Englisch, so dass Sie möglicherweise mehr sehen mit der "deutschen-Adresse Abkürzungen" auf Deutsch :)

Andere Tipps

Sie könnte verwenden die Google GeoCode API

Wich in der Tat gibt Ergebnisse für die beiden Beispiele, habe es gerade ausprobiert.Auf diese Weise erhalten Sie strukturierte Ergebnisse, die Sie speichern in Ihrer Datenbank.Wenn die Suche fehlschlägt, bitten Sie die Benutzer um die Adresse zu schreiben, auf andere Weise.

Je früher Sie aufhören, Menschen, die leichter in die lange laufen!

Nicht allzu vertraut mit Ihrem db-schema oder Daten-Eintrag-Formular, würde ich vorschlagen, eine route so etwas wie die folgenden:

  • unterschiedliche Felder in der db für jede Adresse "Teil", z.B.Straße, Stadt, Postleitzahl, Länder, etc.

  • Ihre Daten-Eintrag-Formular unten gebrochen ähnlich, z.B.Straße, Stadt, etc

Die Logik hinter der obigen ist, dass jeder Teil wird wahrscheinlich über einen eigenen "Regeln" für die Prüfung leicht geändert angesprochen, ("Quellenstrasse"->"Quellenstr.", "66/11"->"66a-11" oben), so dass Sie Ihre Validierung code überprüfen können, ob die Werte als präsentiert für jedes Feld existieren in Ihrer jeweiligen db-Feld.Wenn nicht, Sie können eine Klasse haben, die für die transformation Regeln für jedes Feld (z.B."die Straße" stammt auf "str") und prüft wieder für Duplikate.

Offensichtlich ist die obige Methode hat Ihre Nachteile:

  • es kann langsam sein, abhängig von Ihrem Datensatz verlassen der Benutzer warten

  • der Benutzer kann versuchen, Sie zu umgehen, indem Sie die Adresse "Teilen" in die falschen Felder (Anhängen von post code, city, etc).aber aus Erfahrung haben wir festgestellt, dass selbst die Einführung einer einfachen Prüfung wie den oben genannten wird verhindern, dass ein großer Prozentsatz der Benutzer von der Eingabe von pre-bestehenden-Adressen.

Sobald Sie die grundlegende überprüfung können Sie den Blick auf die Optimierung der db-Zugriffe notwendig, Verfeinerung der Regeln, etc. zu erfüllen Ihre speziellen schema.Sie könnten auch einen Blick auf MySQL-match () - Funktion für arbeiten ähnliches.

Bevor Sie starten Sie die Suche nach doppelten Adressen in Ihrer Datenbank vornehmen, sollten Sie zuerst sicher, dass Sie speichern Sie die Adressen, die in einem standard-format.

Die meisten Länder haben eine standardisierte Möglichkeit, die Formatierung von Adressen, in die US es ist die USPS CASS-system: http://www.usps.com/ncsc/addressservices/certprograms/cass.htm

Aber die meisten anderen Länder haben einen ähnlichen Dienst/standard.Versuchen Sie, diese Seite für mehr internationale Formate:http://bitboost.com/ref/international-address-formats.html

Dies hilft nicht nur bei der Suche nach Dubletten, aber auch spart Sie Geld, wenn Sie mailing, die Sie den Kunden (die post Gebühren weniger, wenn die Adresse ist in ein standard-format).

Je nach Anwendung, in manchen Fällen möchten Sie vielleicht, um zu speichern eine "Eitelkeit" record-Adresse sowie die standard-Adresseintrag.Dies hält Ihre VIP-Kunden glücklich.A "vanity" - Adresse könnte so etwas wie:

62 West Ninety-First Street
Apartment 4D
Manhattan, New York, NY 10001

Während die standard-Adresse kann wie folgt Aussehen:

62 W 91ST ST APT 4D
NEW YORK NY 10024-1414

Eine Sache, möchten Sie vielleicht zu sehen sind Soundex sucht, die sind sehr nützlich für Rechtschreibfehler und Kontraktionen.

Dies ist jedoch nicht eine in-Datenbank-Validierung, so dass es kann oder kann nicht das sein, was Sie suchen.

Eine andere mögliche Lösung (vorausgesetzt, Sie tatsächlich benötigen zuverlässige Adresse, die Daten und Sie sprechen nicht nur über Adressen als einen Weg, um zu verhindern, dass doppelte Konten), ist die Verwendung einer Drittanbieter-web-service zu standardisieren, die Adressen übermitteln, die von Ihren Benutzern.

Es funktioniert auf diese Weise-Ihr system akzeptiert der Benutzer die Adresse über ein online-Formular.Ihre form Hände auf die Adresse des Benutzers, um die Fremdanbieter-Adresse Standardisierung von web-service.Der web-Dienst bietet Ihnen wieder die gleiche Adresse, aber jetzt werden die Daten standardisiert in diskrete Felder Adresse und mit dem standard-Abkürzungen und-Formate angewendet werden.Zeigt Ihre Anwendung die standardisierte Adresse zu Ihrem Benutzer für Ihre Bestätigung, bevor Sie versuchen, speichern Sie die Daten in die DB.

Wenn der Benutzer Adressen gehen durch eine Standardisierung Schritt und nur standardisierte Adressen werden gespeichert, um Ihre DB, dann finden Sie doppelte Datensätze sollten stark vereinfacht, da Sie jetzt einen Vergleich von äpfeln zu äpfeln.

Eine solche Dritte-party-service Globale Adresse Interaktiven Service Deutschland in der Liste der unterstützten Ländern, und hat auch eine online-demo, die zeigt, wie der service funktioniert (demo-link auf die web Seite).

Es ist eine Kosten-Nachteil dieses Ansatzes offensichtlich.Aber auf der plus-Seite:

  1. würden Sie nicht brauchen, zu erstellen und zu pflegen Ihre eigene Adresse Standardisierung von Metadaten
  2. Sie müssen nicht fortlaufend verbessern Sie Ihre Adresse Standardisierung Routinen, und
  3. Sie sind frei, zu konzentrieren, Ihr software-Entwicklung Energie auf die Teile der Anwendung, die sind einzigartige zu Ihre Anforderungen

Haftungsausschluss:Ich arbeite nicht für die Globale Adresse und haben Sie nicht versucht, den Dienst zu nutzen.Ich bin aufgrund der bloßen Nennung als Beispiel, da Sie über ein online-demo, die Sie tatsächlich spielen können.

Hinzufügen einer Antwort auf meine eigene Frage:

Einen anderen Weg, es zu tun ist, bitten Sie die Benutzer, für Ihre Handy Anzahl, senden Sie einen text msg für die überprüfung.Das Stoppt die meisten Menschen messing mit doppelter Adressen.

Ich spreche aus persönlicher Erfahrung.(danke pigsback !) Sie führten die Bestätigung durch Handy.Das stoppte mich mit 2 accounts!:-)

Ich merke, dass der ursprüngliche Beitrag ist mbole Deutsch-Adressen, aber dies ist eine gute Fragen für Adressen im Allgemeinen.

In den Vereinigten Staaten, es ist ein Teil einer Adresse genannt delivery point barcode.Es ist eine einzigartige 12-stellige Nummer, die zur Identifizierung eines einzelnen Punkt der Lieferung und können dienen als eindeutige Bezeichner einer Adresse.Um diesen Wert werden Sie wollen, um eine Adresse zu verwenden die überprüfung oder die Adresse der Standardisierung von web-service-API, die Kosten etwa $20/mo je nach Volumen der Anfragen, die Sie vornehmen.

Im Interesse der vollständigen Offenlegung, ich bin der Gründer von SmartyStreets.Wir bieten nur eine solche Adresse Validierung web-service-API genannt LiveAddress.Sie sind mehr als willkommen zu Kontaktieren Sie mich persönlich, wenn Sie Fragen haben.

Machine learning und KI-algorithmen, um string ähnlichkeiten und doppelte Maßnahmen.

Record linkage oder der Abgleich entspricht records unterscheiden sich syntaktisch—wurde erstmals erforscht, in den späten 1950er Jahren - und 1960er-Jahren.

Sie können jedes paar von Datensätzen mithilfe eines Vektors Funktionen beschreiben die ähnlichkeit zwischen einzelnen Felder aufzeichnen.

Für Beispiel, Adaptive Erkennung von Duplikaten Mit Erlernbar String Ähnlichkeit Maßnahmen.für Beispiel, Lesen Sie diese doc

  1. Sie können verwenden generische oder manuell abgestimmt Entfernung Metriken zur Abschätzung der ähnlichkeit der möglichen Dubletten.

  2. Sie können die Verwendung der adaptiven name-matching-algorithmen, wie Jaro-Metrik, die ist basierend auf der Anzahl und Reihenfolge der gemeinsame Zeichen zwischen zwei strings.

  3. Token-basiert und hybrid-Entfernung.In solchen Fällen, können wir konvertieren strings s und t, um token multimengen (wobei jeder token ist ein Wort) und betrachten die ähnlichkeit Metriken, die auf diese multimengen.

Oft verwenden Sie Einschränkungen in einer Datenbank, um sicherzustellen Daten "unique" in die Daten-Basis Sinn.

In Bezug auf "isomorphisms" ich denke, Sie sind auf Ihren eigenen, dh das schreiben von code your self.Wenn in der Datenbank könnten Sie einen trigger verwenden.

Ich bin auf der Suche nach einer Antwort Adressierung Vereinigten Staaten-Adressen

In dieser Frage wird verhindern, dass Benutzer die Eingabe von Duplikaten wie

Quellenstrasse 66/11 und Quellenstr. 66a-11

Dies geschieht, wenn Sie lassen Sie Ihre Benutzer-geben Sie die vollständige Adresse in Eingabe-Feld.

Es gibt einige Methoden, die Sie verwenden können, um dies zu verhindern.

1.Einheitliche Formatierung mithilfe von RegEx

  • Sie können Benutzer aufgefordert werden, geben Sie die Informationen in einem einheitlichen format.
  • Das ist sehr effizient, während Abfragen zu
  • testen Sie die vom Benutzer eingegebenen Wert gegen einige reguläre Ausdrücke, und wenn fehlgeschlagen ist, Fragen Sie den Benutzer, um ihn zu korrigieren.

2.Verwenden Sie eine map-api wie google maps und Fragen Sie die Benutzer zu wählen Sie details aus.

  • Wenn Sie google maps können Sie erreichen es mit dem Reverse Geocoding.

Von Google Developer ' s guide,

Der Begriff geocoding bezeichnet im Allgemeinen zu übersetzen, eine lesbare Adresse in einen Standort auf einer Karte. Der Prozess, das Gegenteil zu tun, die übersetzung eines Ortes auf der Karte in eine für den Menschen lesbare Adresse, die ist bekannt als reverse geocoding.

3.Erlauben heterogenen Daten, wie gezeigt, in die Frage, und vergleichen Sie es mit einer anderen Formatierung.

  • In der Frage, die OP ermöglichen Adresse in anderes format.
  • In einem solchen Fall, Sie können es ändern, um verschiedene Formen, und überprüfen Sie es mit der Datenbank um eine Lösung.
  • Dies kann mehr Zeit in Anspruch nehmen und die Zeit ist völlig abhängig von der Anzahl der Testfälle.

4.Teilen Sie die Adresse in verschiedenen teilen und speichern Sie es in db und bieten so ein Formular Benutzer.

  • , Dass ist, stellen Sie verschiedene Felder zum speichern von Straße, Stadt, Bundesland usw. in der Datenbank.
  • Auch bieten die verschiedenen Eingabefelder für die Benutzer eingeben, Straße, Stadt, Zustand, etc in top-down-format.
  • Wenn der Benutzer eingeben Zustand, schmal, die Abfrage zu finden, die dupes zu diesem Zustand nur.
  • Wenn der Benutzer die enter Stadt, beschränken Sie es auf, die Stadt nur.
  • Wenn der Benutzer geben Sie die Straße ein, beschränken Sie es auf die Straße.

Und schließlich

  • Wenn Benutzer-geben Sie die Adresse, ändern Sie es in verschiedenen Formaten und testen Sie es gegen die Daten Basis.

Dies ist wirksam, auch die Anzahl der Testfälle kann hoch, die Zahl der Einträge, die Sie gegen die Tests werden sehr also weniger und es verbraucht sehr weniger Menge an Zeit.

In den USA, die Sie verwenden können, USPS Adresse Standardisierung Web-Tool.Es überprüft und normalisiert die Adressen für Sie.Auf diese Weise können Sie normalisieren die Adresse, bevor Sie prüfen, ob es bereits in der Datenbank vorhanden ist.Wenn alle Adressen in der Datenbank sind bereits normalisiert, werden Sie in der Lage sein, die Duplikate einfach.

Beispiel-URL:

https://production.shippingapis.com/ShippingAPI.dll?API=Verify&XML=insert_request_XML_here

Probe Anforderung:

<AddressValidateRequest USERID="XXXXX">
  <IncludeOptionalElements>true</IncludeOptionalElements>
  <ReturnCarrierRoute>true</ReturnCarrierRoute>
  <Address ID="0">  
    <FirmName />   
    <Address1 />   
    <Address2>205 bagwell ave</Address2>   
    <City>nutter fort</City>   
    <State>wv</State>   
    <Zip5></Zip5>   
    <Zip4></Zip4> 
  </Address>      
</AddressValidateRequest>

Beispiel-Antwort:

<AddressValidateResponse>
  <Address ID="0">
    <Address2>205 BAGWELL AVE</Address2>
    <City>NUTTER FORT</City>
    <State>WV</State>
    <Zip5>26301</Zip5>
    <Zip4>4322</Zip4>
    <DeliveryPoint>05</DeliveryPoint>
    <CarrierRoute>C025</CarrierRoute>
  </Address>
</AddressValidateResponse>

Andere Länder könnte haben Ihre eigenen APIs.Andere Personen erwähnt 3rd-party APIs, die Unterstützung mehrerer Länder, die nützlich sein könnten, in einigen Fällen.

Als google abrufen suggesions für suchen Sie Datenbank-Felder-Adresse

Zuerst erstellen wir eine index.htm(l) - Datei:

    <!DOCTYPE html>
    <html lang="en">

    <head>
        <meta http-equiv="Content-Language" content="en-us">
        <title>Address Autocomplete</title>
        <meta charset="utf-8">
        <link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet">
        <script src="//code.jquery.com/jquery-2.1.4.min.js"></script>
        <script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
        <script src="//netsh.pp.ua/upwork-demo/1/js/typeahead.js"></script>
        <style>
            h1 {
                font-size: 20px;
                color: #111;
            }

            .content {
                width: 80%;
                margin: 0 auto;
                margin-top: 50px;
            }

            .tt-hint,
            .city {
                border: 2px solid #CCCCCC;
                border-radius: 8px 8px 8px 8px;
                font-size: 24px;
                height: 45px;
                line-height: 30px;
                outline: medium none;
                padding: 8px 12px;
                width: 400px;
            }

            .tt-dropdown-menu {
                width: 400px;
                margin-top: 5px;
                padding: 8px 12px;
                background-color: #fff;
                border: 1px solid #ccc;
                border: 1px solid rgba(0, 0, 0, 0.2);
                border-radius: 8px 8px 8px 8px;
                font-size: 18px;
                color: #111;
                background-color: #F1F1F1;
            }
        </style>
        <script>
            $(document).ready(function() {

                $('input.city').typeahead({
                    name: 'city',
                    remote: 'city.php?query=%QUERY'

                });

            })
        </script>

    <script>
            function register_address()
            {
                $.ajax({
                    type: "POST",
                    data: {
                        City: $('#city').val(),
                    },
                    url: "addressexists.php",
                    success: function(data)
                    {
                        if(data === 'ADDRESS_EXISTS')
                        {
                            $('#address')
                                .css('color', 'red')
                                .html("This address already exists!");
                        }

                    }
                })              
            }
        </script>
    </head>

    <body>
        <div class="content">

            <form>
                <h1>Try it yourself</h1>
                <input type="text" name="city" size="30" id="city" class="city" placeholder="Please Enter City or ZIP code">
<span id="address"></span>
            </form>
        </div>
    </body>
</html>

Erstellen wir nun eine city.php Datei, die aggregate unserer Abfrage zum MySQL-DB und geben Antwort als JSON.Hier ist der code:

<?php

//CREDENTIALS FOR DB
define ('DBSERVER', 'localhost');
define ('DBUSER', 'user');
define ('DBPASS','password');
define ('DBNAME','dbname');

//LET'S INITIATE CONNECT TO DB
$connection = mysqli_connect(DBSERVER, DBUSER, DBPASS,"DBNAME") or die("Can't connect to server. Please check credentials and try again");


//CREATE QUERY TO DB AND PUT RECEIVED DATA INTO ASSOCIATIVE ARRAY
if (isset($_REQUEST['query'])) {
    $query = $_REQUEST['query'];
    $sql = mysqli_query ($connection ,"SELECT zip, city FROM zips WHERE city LIKE '%{$query}%' OR zip LIKE '%{$query}%'");
    $array = array();
    while ($row = mysqli_fetch_array($sql,MYSQLI_NUM)) {
        $array[] = array (
            'label' => $row['city'].', '.$row['zip'],
            'value' => $row['city'],
        );
    }
    //RETURN JSON ARRAY
    echo json_encode ($array);
}

?>

und dann verhindern, speichern Sie Sie in die Datenbank ein, wenn gefunden Sie doppelte in der Tabelle Spalte

Und für Ihre addressexists.php code:

<?php//CREDENTIALS FOR DB
    define ('DBSERVER', 'localhost');
    define ('DBUSER', 'user');
    define ('DBPASS','password');
    define ('DBNAME','dbname');

    //LET'S INITIATE CONNECT TO DB
    $connection = mysqli_connect(DBSERVER, DBUSER, DBPASS,"DBNAME") or die("Can't connect to server. Please check credentials and try again");


    $city= mysqli_real_escape_string($_POST['city']); // $_POST is an array (not a function)
    // mysqli_real_escape_string is to prevent sql injection

    $sql = "SELECT username FROM ".TABLENAME." WHERE city='".$city."'"; // City must enclosed in two quotations

    $query = mysqli_query($connection,$sql);

    if(mysqli_num_rows($query) != 0)

    {
        echo('ADDRESS_EXISTS');
    }
?>

Match-Adresse an Adressen zur Verfügung gestellt von DET BundesPost zur Erkennung von Duplikaten.

DET wahrscheinlich verkauft eine CD, wie USA ist.Das problem wird dann passend zu der Bundespost-Adressen.Nur ein langer Prozess ersetzen Sie Abkürzungen mit der post genehmigt Abkürzungen und solche.

Gleiche Art in den USA.Match USPostOffice-Adressen (Sorry, diese Kosten Geld, so dass Ihr nicht ganz öffnen CDs sind vorhanden von der US-post), um Duplikate zu finden.

Dies ist eine alte Frage ist, aber ein anderer Ansatz ist die Berechnung der Levenshtein-Distanz, um die Adressen und so können Sie finden und bereits bestehenden sehr ähnlich sind.Sehen Sie hier mehr. Die Suche nach Doppelten Adressen Mit Hilfe der Levenshtein-Distanz-Metrik in SQL.

Meiner Meinung nach, vorausgesetzt, dass Sie bereits eine Menge schmutzige Daten in die DB,

Sie tun müssen, bauen Sie Ihre "handmade" dirty-filter, die können erkennen, eine maximale von Deutsche Abkürzung ...

Aber behandeln, Wenn Sie eine Menge von Daten, werden Sie das Risiko auf sich nehmen, finden Sie einige false-positive-und true-negative Probe...

Endlich eine halbautomatische job (Maschine mit menschlichen unterstützen, wenn die Wahrscheinlichkeit, dass ein Fall von falsch-positiven oder wahr-negativ ist zu hoch) wird die beste Lösung sein.

Mehr von "Ausnahme" (weil die menschliche raise exception beim ausfüllen von Daten), mehr Ihre "handmade" - filter passen Sie Ihre requierement.

In der anderen hand, Sie können auch eine Deutschland-Adresse verification service auf die Benutzer Seite, und speichern nur die verifiziert ein...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top