العثور على عناوين مكررة في قاعدة البيانات، ومنع المستخدمين من إدخالها مبكرًا؟

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

سؤال

كيف يمكنني العثور على عناوين مكررة في قاعدة بيانات، أو من الأفضل إيقاف الأشخاص بالفعل عند ملء النموذج؟أعتقد أنه كلما كان ذلك أفضل؟

هل هناك أي طريقة جيدة لاستخلاص الشارع والرمز البريدي وما إلى ذلك بحيث يمكن اكتشاف الأخطاء المطبعية والمحاولات البسيطة للحصول على تسجيلين؟يحب:

Quellenstrasse 66/11 
Quellenstr. 66a-11

أنا أتحدث العناوين الألمانية...شكرًا!

هل كانت مفيدة؟

المحلول

يوهانس:

@PConroy:كانت هذه فكرتي الأولية أيضًا.الجزء المثير للاهتمام في هذا هو العثور على قواعد تحويل جيدة للأجزاء المختلفة من العنوان!أي اقتراحات جيدة؟

عندما كنا نعمل على هذا النوع من المشاريع من قبل، كان النهج الذي اتبعناه هو أخذ مجموعة العناوين الحالية لدينا (150 ألفًا أو نحو ذلك)، ثم تطبيق التحويلات الأكثر شيوعًا لنطاقنا (أيرلندا، لذلك "Dr"->"Drive"، " طريق"->"الطريق"، الخ).أخشى أنه لم يكن هناك مصدر شامل عبر الإنترنت لمثل هذه الأشياء في ذلك الوقت، لذلك انتهى بنا الأمر إلى إعداد قائمة بأنفسنا، والتحقق من أشياء مثل دليل الهاتف (مع الضغط عليه لتوفير مساحة هناك، يتم اختصار العناوين بكل الطرق!) ).كما ذكرت سابقًا، ستندهش من عدد "النسخ المكررة" التي ستكتشفها بإضافة عدد قليل من القواعد الشائعة!

لقد عثرت مؤخرًا على صفحة تحتوي على معلومات شاملة إلى حد ما قائمة اختصارات العناوين, ، على الرغم من أنها الإنجليزية الأمريكية، فأنا لست متأكدًا من مدى فائدتها في ألمانيا!كشفت عملية بحث سريعة على محرك بحث Google عن موقعين، لكن بدت وكأنها مصائد اشتراك في الرسائل الإخبارية غير المرغوب فيها.على الرغم من أنني كنت أبحث على Google باللغة الإنجليزية، فقد تتمكن من إلقاء نظرة أكثر على "اختصارات العناوين الألمانية" باللغة الألمانية :)

نصائح أخرى

يمكنك استخدام واجهة برمجة تطبيقات الكود الجغرافي لجوجل

والذي في الواقع يعطي نتائج لكلا المثالين، لقد جربته للتو.بهذه الطريقة تحصل على نتائج منظمة يمكنك حفظها في قاعدة البيانات الخاصة بك.إذا فشل البحث، اطلب من المستخدم كتابة العنوان بطريقة أخرى.

كلما تمكنت من إيقاف الأشخاص مبكرًا، أصبح الأمر أسهل على المدى الطويل!

نظرًا لعدم معرفتك بمخطط قاعدة البيانات أو نموذج إدخال البيانات، أقترح عليك مسارًا يشبه ما يلي:

  • لديك حقول مميزة في قاعدة بياناتك لكل "جزء" عنوان، على سبيل المثال.الشارع، المدينة، الرمز البريدي، الولايات، إلخ.

  • قم بتقسيم نموذج إدخال البيانات الخاص بك بشكل مشابه، على سبيل المثال:الشارع، المدينة، الخ

السبب وراء ما ورد أعلاه هو أنه من المحتمل أن يكون لكل جزء "قواعد" خاصة به للتحقق من العناوين التي تم تغييرها قليلاً، ("Quellenstrasse"->"Quellenstr."، "66/11"->"66a-11" أعلاه) حتى يتمكن رمز التحقق الخاص بك من التحقق مما إذا كانت القيم المقدمة لكل حقل موجودة في حقل قاعدة البيانات الخاص بها.إذا لم يكن الأمر كذلك، فيمكن أن يكون لديك فصل يطبق قواعد التحويل لكل حقل معين (على سبيل المثال."strasse" ينبع من "str") ويتحقق مرة أخرى من التكرارات.

من الواضح أن الطريقة المذكورة أعلاه لها عيوبها:

  • يمكن أن يكون بطيئًا، اعتمادًا على مجموعة البيانات الخاصة بك، مما يترك المستخدم في الانتظار

  • قد يحاول المستخدمون الالتفاف حوله عن طريق وضع عنوان "الأجزاء" في الحقول الخاطئة (إلحاق الرمز البريدي بالمدينة، وما إلى ذلك).ولكن من خلال التجربة وجدنا أن إدخال حتى عمليات التحقق البسيطة مثل ما ورد أعلاه سيمنع نسبة كبيرة من المستخدمين من إدخال العناوين الموجودة مسبقًا.

بمجرد الانتهاء من التحقق الأساسي، يمكنك النظر في تحسين الوصول إلى قواعد البيانات المطلوبة، وتحسين القواعد، وما إلى ذلك لتلبية مخططك المحدد.يمكنك أيضًا إلقاء نظرة على وظيفة مطابقة MySQL (). للعمل على نص مماثل.

قبل البدء في البحث عن العناوين المكررة في قاعدة بياناتك، يجب عليك أولاً التأكد من تخزين العناوين بتنسيق قياسي.

لدى معظم البلدان طريقة قياسية لتنسيق العناوين، في الولايات المتحدة هو نظام USPS CASS: http://www.usps.com/ncsc/addressservices/certprograms/cass.htm

لكن معظم الدول الأخرى لديها خدمة/معيار مماثل.جرب هذا الموقع لمزيد من التنسيقات الدولية:http://bitboost.com/ref/international-address-formats.html

لا يساعد هذا في العثور على التكرارات فحسب، بل يوفر لك المال أيضًا عند إرسال بريد إلكتروني إلى العملاء (تتقاضى الخدمة البريدية رسومًا أقل إذا كان العنوان بتنسيق قياسي).

اعتمادًا على التطبيق الخاص بك، قد ترغب في بعض الحالات في تخزين سجل عنوان "مخصص" بالإضافة إلى سجل العنوان القياسي.وهذا يبقي عملائك المهمين سعداء.قد يكون العنوان "الظاهري" شيئًا مثل:

62 شارع الغرب والتسعين الأول
شقة 4D
مانهاتن، نيويورك، نيويورك 10001

بينما قد يبدو العنوان القياسي كما يلي:

62 وات 91ST ST شقة 4D
نيويورك، نيويورك 10024-1414

شيء واحد قد ترغب في إلقاء نظرة عليه هو Soundex عمليات البحث، وهي مفيدة جدًا للأخطاء الإملائية والاختصارات.

ومع ذلك، لا يعد هذا بمثابة التحقق من صحة قاعدة البيانات، لذا قد يكون أو لا يكون ما تبحث عنه.

هناك حل آخر محتمل (بافتراض أنك تحتاج بالفعل إلى بيانات عنوان موثوقة وأنك لا تستخدم العناوين فقط كوسيلة لمنع الحسابات المكررة) هو استخدام خدمة ويب تابعة لجهة خارجية لتوحيد العناوين المقدمة من قبل المستخدمين.

إنه يعمل بهذه الطريقة - يقبل نظامك عنوان المستخدم عبر نموذج عبر الإنترنت.يقوم النموذج الخاص بك بتسليم عنوان المستخدم إلى خدمة ويب توحيد عناوين الجهات الخارجية.تمنحك خدمة الويب نفس العنوان ولكن الآن مع البيانات الموحدة في حقول عناوين منفصلة، ​​ومع تطبيق الاختصارات والتنسيقات القياسية.يعرض تطبيقك هذا العنوان الموحد للمستخدم الخاص بك لتأكيده قبل محاولة حفظ البيانات في قاعدة البيانات الخاصة بك.

إذا مرت جميع عناوين المستخدمين بخطوة توحيد وتم حفظ العناوين القياسية فقط في قاعدة البيانات الخاصة بك، فيجب تبسيط البحث عن السجلات المكررة إلى حد كبير نظرًا لأنك الآن تقارن التفاح بالتفاح.

إحدى هذه الخدمات التابعة لجهة خارجية هي الخدمة التفاعلية للعنوان العالمي والتي تتضمن ألمانيا في قائمة البلدان المدعومة، ولديها أيضًا عرض توضيحي عبر الإنترنت يوضح كيفية عمل خدمتها (يمكن العثور على الرابط التجريبي على صفحة الويب هذه).

من الواضح أن هناك عيبًا في التكلفة لهذا النهج.ومع ذلك، على الجانب الإيجابي:

  1. لن تحتاج إلى إنشاء بيانات تعريف توحيد العناوين الخاصة بك والحفاظ عليها
  2. لن تحتاج إلى تحسين إجراءات توحيد العناوين بشكل مستمر، و
  3. لك مطلق الحرية في تركيز طاقتك في تطوير البرامج على أجزاء التطبيق الفريدة التي تناسب متطلباتك

تنصل:أنا لا أعمل لدى Global Address ولم أحاول استخدام خدمتهم.أنا فقط أذكرهم كمثال لأن لديهم عرضًا تجريبيًا عبر الإنترنت يمكنك اللعب به بالفعل.

لإضافة إجابة لسؤالي الخاص:

هناك طريقة مختلفة للقيام بذلك وهي مطالبة المستخدمين برقم هواتفهم المحمولة وإرسال رسالة نصية إليهم للتحقق.وهذا يمنع معظم الأشخاص من العبث بالعناوين المكررة.

أنا أتحدث من تجربة شخصية.(شكرًا ظهر الخنزير !) قدموا التأكيد عبر الهاتف المحمول.هذا منعني من امتلاك حسابين!:-)

أدرك أن المنشور الأصلي مخصص للعناوين الألمانية، ولكن هذا سؤال جيد للعناوين بشكل عام.

في الولايات المتحدة، يوجد جزء من العنوان يسمى الرمز الشريطي لنقطة التسليم.إنه رقم فريد مكون من 12 رقمًا يحدد نقطة تسليم واحدة ويمكن أن يكون بمثابة المعرف الفريد للعنوان.للحصول على هذه القيمة، ستحتاج إلى استخدام واجهة برمجة تطبيقات خدمة الويب للتحقق من العنوان أو توحيد العنوان، والتي يمكن أن تكلف حوالي 20 دولارًا شهريًا اعتمادًا على حجم الطلبات التي تقدمها إليها.

من أجل الإفصاح الكامل، أنا مؤسس SmartyStreets.نحن نقدم مثل هذا واجهة برمجة تطبيقات خدمة الويب للتحقق من صحة العنوان يسمى LiveAddress.نرحب باتصالك بي شخصيًا لطرح أي أسئلة لديك.

يحتوي التعلم الآلي والذكاء الاصطناعي على خوارزميات للعثور على أوجه التشابه في السلسلة والمقاييس المكررة.

سجل السجل أو مهمة مطابقة السجلات المكافئة التي تختلف بشكل نحلي - تم استكشافها لأول مرة في أواخر الخمسينيات والستينيات.

يمكنك تمثيل كل زوج من السجلات باستخدام متجه من الميزات التي تصف التشابه بين حقول السجلات الفردية.

على سبيل المثال ، الكشف المكرر التكيفي باستخدام مقاييس تشابه السلسلة القابلة للتعلم.على سبيل المثال، اقرأ هذا المستند

  1. يمكنك استخدام مقاييس المسافة العامة أو المضبوطة يدويًا لتقدير مدى تشابه التكرارات المحتملة.

  2. يمكنك استخدام خوارزميات مطابقة الأسماء التكيفية، مثل مقياس Jaro، الذي يعتمد على عدد وترتيب الأحرف المشتركة بين سلسلتين.

  3. المسافة القائمة على الرمز المميز والهجين.في مثل هذه الحالات ، يمكننا تحويل الأوتار S و T إلى رمزية متعددة (حيث كل رمز هو كلمة) والنظر في مقاييس التشابه على هذه المجموعات المتعددة.

غالبًا ما تستخدم القيود في قاعدة البيانات للتأكد من أن البيانات "فريدة" بالمعنى القائم على البيانات.

فيما يتعلق بـ "التماثلات" أعتقد أنك وحدك، أي كتابة الكود بنفسك.إذا كان بإمكانك استخدام المشغل في قاعدة البيانات.

أبحث عن إجابة تتناول عناوين الولايات المتحدة

المشكلة المعنية هي منع المستخدمين من إدخال نسخ مكررة مثل

Quellenstrasse 66/11 و Quellenstr. 66a-11

يحدث هذا عندما تسمح للمستخدم بإدخال العنوان الكامل في مربع الإدخال.

هناك بعض الطرق التي يمكنك استخدامها لمنع ذلك.

1.التنسيق الموحد باستخدام RegEx

  • يمكنك مطالبة المستخدمين بإدخال التفاصيل بتنسيق موحد.
  • وهذا فعال للغاية أثناء الاستعلام أيضًا
  • اختبر القيمة التي أدخلها المستخدم مقابل بعض التعبيرات العادية، وإذا فشلت، اطلب من المستخدم تصحيحها.

2. استخدم واجهة برمجة تطبيقات الخريطة مثل خرائط جوجل واطلب من المستخدم تحديد التفاصيل منها.

  • إذا اخترت خرائط جوجل، فيمكنك تحقيق ذلك باستخدام الترميز الجغرافي العكسي.

من دليل مطوري جوجل,

يشير مصطلح الترميز الجغرافي عمومًا إلى ترجمة عنوان يمكن قراءته بواسطة الإنسان إلى موقع على الخريطة. تُعرف عملية القيام بالعكس، أي ترجمة موقع ما على الخريطة إلى عنوان يمكن قراءته بواسطة الإنسان، باسم عكس الترميز الجغرافي.

3.اسمح بالبيانات غير المتجانسة كما هو موضح في السؤال وقارنها بتنسيقات مختلفة.

  • في السؤال، يسمح OP بالعناوين بتنسيق مختلف.
  • في مثل هذه الحالة، يمكنك تغييره إلى نماذج مختلفة والتحقق منه مع قاعدة البيانات للحصول على حل.
  • قد يستغرق هذا وقتًا أطول ويعتمد الوقت تمامًا على عدد حالات الاختبار.

4.قم بتقسيم العنوان إلى أجزاء مختلفة وتخزينه في قاعدة بيانات وتقديم مثل هذا النموذج للمستخدم.

  • يتم توفير حقول مختلفة لتخزين الشارع والمدينة والولاية وما إلى ذلك في قاعدة البيانات.
  • قم أيضًا بتوفير حقول الإدخال المختلفة للمستخدم لإدخال الشارع والمدينة والولاية وما إلى ذلك بتنسيق من أعلى إلى أسفل.
  • عندما يقوم المستخدم بإدخال الحالة، قم بتضييق نطاق الاستعلام للعثور على التكرارات لتلك الحالة فقط.
  • عندما يدخل المستخدم إلى المدينة، قم بتضييق نطاقه إلى تلك المدينة فقط.
  • عندما يدخل المستخدم إلى الشارع، قم بتضييقه إلى ذلك الشارع.

وأخيرا

  • عندما يقوم المستخدم بإدخال العنوان، قم بتغييره إلى تنسيقات مختلفة واختبره مقابل قاعدة البيانات.

يعد هذا فعالاً حتى لو كان عدد حالات الاختبار مرتفعًا، فسيكون عدد الإدخالات التي تختبرها أقل جدًا وبالتالي سيستهلك قدرًا أقل من الوقت.

في الولايات المتحدة الأمريكية، يمكنك استخدام USPS أداة الويب لتوحيد العناوين.يقوم بالتحقق من العناوين وتطبيعها لك.بهذه الطريقة، يمكنك تسوية العنوان قبل التحقق مما إذا كان موجودًا بالفعل في قاعدة البيانات.إذا تمت تسوية جميع العناوين الموجودة في قاعدة البيانات بالفعل، فستتمكن من اكتشاف التكرارات بسهولة.

نموذج عنوان URL:

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

طلب عينة:

<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>

استجابة العينة:

<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>

قد يكون لدى البلدان الأخرى واجهات برمجة التطبيقات الخاصة بها.ذكر أشخاص آخرون واجهات برمجة التطبيقات التابعة لجهات خارجية والتي تدعم بلدانًا متعددة والتي قد تكون مفيدة في بعض الحالات.

بينما يقوم Google بجلب اقتراحات للبحث، يمكنك البحث في حقول عناوين قاعدة البيانات

أولاً، لنقم بإنشاء ملف Index.htm(l):

    <!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>

سنقوم الآن بإنشاء ملف city.php الذي سيجمع استعلامنا إلى MySQL DB ويعطي الرد بتنسيق JSON.هنا هو الرمز:

<?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);
}

?>

ثم منع حفظها في قاعدة البيانات إذا وجدت مكررة في عمود الجدول

وبالنسبة لرمز Addressexists.php الخاص بك:

<?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');
    }
?>

قم بمطابقة العنوان بالعناوين المقدمة من DET BundesPost للكشف عن التكرارات.

ربما تبيع DET قرصًا مضغوطًا كما تفعل الولايات المتحدة الأمريكية.ثم تصبح المشكلة مطابقة لعناوين Bundespost.مجرد عملية طويلة لاستبدال الاختصارات بالاختصارات المعتمدة وما إلى ذلك.

بنفس الطريقة في الولايات المتحدة الأمريكية.قم بالمطابقة مع عناوين USPostOffice (عذرًا، هذه تكلف أموالاً، لذلك تتوفر الأقراص المضغوطة غير المفتوحة بالكامل من مكتب البريد الأمريكي) للعثور على التكرارات.

هذا سؤال قديم، ولكن هناك طريقة أخرى تتمثل في حساب مسافة Levenshtein إلى العناوين وبهذه الطريقة يمكنك العثور على العناوين الموجودة بالفعل والمتشابهة جدًا.يمكنك ان ترى المزيد هنا. البحث عن عناوين مكررة باستخدام مقياس المسافة Levenshtein في SQL.

في رأيي، على افتراض أن لديك بالفعل الكثير من البيانات القذرة في قاعدة البيانات الخاصة بك،

عليك أن تقوم ببناء الفلتر القذر "المصنوع يدويًا" والذي قد يكتشف الحد الأقصى من الاختصارات الألمانية ...

ولكن إذا تعاملت مع الكثير من البيانات، فسوف تخاطر بالعثور على بعض العينات الإيجابية الكاذبة والسلبية الحقيقية...

أخيرًا، ستكون الوظيفة شبه الآلية (آلة بمساعدة بشرية عندما يكون احتمال وجود حالة إيجابية كاذبة أو سلبية حقيقية عالية جدًا) هي الحل الأفضل.

كلما تعاملت مع "الاستثناء" (لأن الإنسان يرفع الاستثناء عند ملء البيانات)، كلما كان الفلتر "المصنوع يدويًا" الخاص بك مناسبًا لمتطلباتك.

ومن ناحية أخرى، يمكنك أيضًا استخدام خدمة التحقق من العنوان في ألمانيا من جانب المستخدم، وتخزين العنوان الذي تم التحقق منه فقط...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top