كيف ينبغي الجغرافي الدولي عناوين تكون مخزنة في قاعدة بيانات علائقية ؟

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

  •  18-09-2019
  •  | 
  •  

سؤال

بمهمة تخزين الدولي الجغرافية العناوين في جدول العلائقية, ما هو الأكثر مرونة التحكم.أن كل جزء من العنوان يكون اندلعت في المجالات الخاصة بهم ، أو ينبغي أن تكون أكثر مثل نصية مجانية?

هل هناك أي معنى في فصل مختلف تنسيق عنوان في مختلف الجداول ؟ على سبيل المثال, جدول ل USAAddress, CanadianAddress, UKAddress...?

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

المحلول

سألخص أفكاري من مدونتي بوستي - درس في تخزين العنوان.

في مشروعي الحالي [أعمل في شركة لوجستية] نحن تخزن عناوين دولية. لقد قمت بالبحث في العناوين في جميع أنحاء العالم في تصميم هذا الجزء من قاعدة البيانات. هناك الكثير من التنسيقات المختلفة. في العالم الغربي، نميل إلى استخدام تنسيق موحد إلى حد ما - بعض الاختلافات ولكنها في الغالب:

  • رقم الشارع - رقمي
  • منزل أو اسم المبنى - [varchar - في المملكة المتحدة يتم تحديد بعض المنازل / المباني بالاسم، وليس حسب الرقم
  • رقم الشارع لاحقة varchar، رغم أنه في معظم الحالات، سيكفي شار (1)
    • أ، ب الخ
  • اسم الشارع varchar
  • نوع الشارع varchar أو int إذا كان لديك جدول streettypes
    • حتى الآن، لقد وجدت 262 نوعا فريدا في عالم التحدث باللغة الإنجليزية، من المحتمل أن يكون هناك المزيد، ولا تنسى اللغات الأخرى أي strasse، rue إلخ.
  • اتجاه الشارع varchar (2)
    • N، E، S، W، NE، SE، NW، SW
  • نوع العنوان varchar أو int إذا كان لديك جدول تراكمي
    • صندوق البريد
    • شقة
    • بناء
    • أرضية
    • مكتب. مقر. مركز
    • جناح
    • إلخ...
  • معرف نوع العنوان varchar
    • أي رقم المربع، رقم الشقق، رقم الأرضيات تذكر أرقام الشقة والمكاتب لديها في بعض الأحيان معلومات أبجدية رقمية - مثل 1A
  • البلدية المحلية varchar أو int إذا كان لديك طاولة بلدية
    • على سبيل المثال، إذا ظهر قرطتك / قريتك في العنوان قبل المدينة.
  • مدينة / بلدة varchar أو int إذا كان لديك جدول مدن
  • المنطقة الحاكمة varchar أو int إذا كان لديك جدول مناطق
    • الدولة (الولايات المتحدة)
    • مقاطعة (كندا)
    • الحي الفيدرالي (المكسيك)
    • مقاطعة (المملكة المتحدة)
    • إلخ...
  • المنطقة البريدية varchar
    • الرمز البريدي (الولايات المتحدة)
    • الرمز البريدي (كندا، المكسيك)
    • الرمز البريدي (المملكة المتحدة)
  • دولة varchar أو int إذا كان لديك جدول بلدان

يبدو أن هذا يغطي معظم البلدان ولكن قد يتم عرض ترتيب الحقول بشكل مختلف. يمكنك العثور على قائمة تنسيقات العرض في http://www.bitboost.com/ref/international-address-formats.html#formats.

على سبيل المثال، في العديد من البلدان، يسقط الرمز البريدي قبل اسم المدينة ويرسل رقم الشارع بعد اسم الشارع. في كندا، الولايات المتحدة والمملكة المتحدة، يسبق رقم الشارع اسم الشارع والرمز البريدي (أو الرمز البريدي) بعد اسم المدينة.

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

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

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

تحذير واحد لتكون على دراية بالطرق التي تحتوي على أسماء أنواع الشوارع أيضا - إذا كنت تغطي كندا، فأنت بحاجة إلى أن تكون على دراية بأنك "طريق Avenue Road" في تورونتو والتي سترسل لك وقتا كبيرا إذا كنت تستخدم العنوان 1، 2 ، 3 شكل. من المحتمل حدوث ذلك في أماكن أخرى أيضا، على الرغم من أنني لست على علم بها - كان هذا مثيل واحد كافيا بالنسبة لي أن أصرخ WTF؟!

نصائح أخرى

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

الحفاظ على الأشياء بسيطة.

سيتسبب Sernettype في ذكرها Benalabaster مشاكل عند بدء العمل مع لغات مختلفة عن عزل اللغات مثل اللغة الإنجليزية أو الإسبانية.

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

وأخيرا، كن حذرا في أنه في بعض البلدان متعددة اللغات، يمكن أن تكون الأسماء مختلفة عن لغة واحدة إلى أخرى! على سبيل المثال في بروكسل حيث العديد من الشوارع لديها كل من الفرنسية و اسم هولندي: "Avenu du Port" و "Havenlaan"، اعتمادا على اللغة المفضلة للمرسل إليه. (تظهر خرائط Google اسم كلتا بالتناوب، فقط لتكون على الجانب الآمن.)

يمكنك محاولة وضع جميع أنواع الحيل الذكية هنا، ولكنها ممثلون المبيعات. سوف نفهم هذا؟

هذا يعتمد على ما تريد القيام به به.

لقد وجدت أنه من الأسهل دائما استخدام العناوين لأغراض أخرى (مثل التحقق من بيانات USPS أو الحصول على أسعار الشحن من UPS / FedEx) إذا تم فصلها.

إليك ما أستخدمه عادة للعناوين:

  • العنوان الأول
  • سطر العنوان 2
  • خط العنوان 3.
  • مدينة
  • منطقة
  • رمز بريدي
  • مقاطعة
  • دولة

ردا على تحرير: بالنسبة لمعظم المواقف، لا أرى الاستخدام. يحتوي الجدول الذي أدرجته أعلاه وجود حقول كافية (وهو عام بما فيه الكفاية) لمعظم عناوين معظم البلاد.

عنوان

عندما قدمت القطبية مقابل الإجابة الممتازة @ benalabaster، يمكنك ببساطة:

address       TEXT(300)
postal_code   VARCHAR(15)
country_code  VARCHAR(2)

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

دولة

سيبدو جدول بلدك كما يلي:

country_code  VARCHAR(2)
country_name  VARCHAR(255)

بالإضافة إلى ذلك، يمكن أن يكون لديك واحد من التالي:

postal_code_required  TINYINT(1)
postal_code_regex     VARCHAR(255) NULL DEFAULT NULL

ثم استخدم القوائم التالية لتصميم جدول بلدك:

هنا حكاية لمن يتعثر على هذا السؤال:

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

  1. توفر ثلاثة خطوط في الذي سوف اكتب عنوان واحد.تمر هذه الخطوط الثلاثة على أن الخدمات البريدية المحلية الخاصة بك كما كنت اكتب لهم حرفيا.اسمحوا لي أن استخدام أي مجموعة أحرف كنت تريد ؛ استخدام UTF-8 أو شيء أفضل.
  2. إذا كان النظام الخاص بك لديه متطلبات الأعمال التي تحتاج مني إلى تحديد معلومات معينة ( مثل الرمز البريدي, محافظة, الدولة, الخ.) ، طلب على حدة.حسب متطلبات العمل ، أعني أشياء مثل analytics ؛ هذه القطع من المعلومات لا ينبغي أن تكون مشتركة مع الخدمات البريدية المحلية الخاصة بك ( إلا إذا حدث لي أيضا كتابة نفس المعلومات في واحد من ثلاثة خطوط من النقطة 1 أعلاه ).
  3. وقد المنسدلة أن يطلب مني تحديد القاطع الموقع من العنوان أنا قدمت في خطوط النقطة 1 أعلاه ، ربما البلد.
  4. إذا كان يجب تحليل المعلومات التي أقدمها في خطوط النقطة 1, استخدام جوابي على النقطة 3 لتحديد regex.تشغيل هذا regex ضد المعلومات في النقطة 1 إلى تحليل ذلك.في محاولة لملء عناصر واجهة المستخدم من النقطة 2 باستخدام الإخراج من regex.إن الصحيح أن autofilled المعلومات-استخدام حقيقة أن غيرته لتحسين regex.وبالمثل ، قدر الإمكان ، أعطني فرصة لمراجعة وتصحيح الإخراج الخاص بك باستخدام التعابير المنطقية:لا أحد يعرف أفضل ما تهدف إلى التواصل أكثر مني.

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

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

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

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

تعليق إجابة بن Alabaster: لتنسيق العناوين القائمة على البلد، يمكنك استخدام جدول التنسيق الذي يحتوي على ترتيب الأعمدة لكل بلد كصفوف منفصلة.

  • البرامجية (الموقع الريفي، اسم الحقل، fieldorder)

يمكن ترميز ترتيب الحقل لاستخدام تخطيطات الشبكة المعقدة أيضا.

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

أنا أستعمل https://github.com/CommerceGuys/Addressing. مكتبة تنسيق العناوين الدولية وتستخدم هذه العناصر:

Country
Administrative area
Locality (City)
Dependent Locality (in: BR, CN, IR, MY, MX, NZ, PH, KR, ZA, TH)
Postal code
Sorting code
Address line 1
Address line 2
Organization
Recipient

هذا لم يساعد إذا كنت ترغب في تحليل الشارع (الاسم، رقم المنزل، ...).

بالمناسبة. إذا كنت تبحث عن قائمة بلد متعدد اللغات: https://github.com/umpirsky/country-list.

الطريقة الوحيدة هي تقسيمها إلى:

Name varchar,
Title varchar,
StreetAddress varchar,
StreetAddressLine2 varchar,
zipCode varchar,
City varchar,
Province varchar,
Country lookup

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

هذا لا ينبغي أن يكون من المنطقي بفصل العناوين لكل بلد، حيث توجد بلدان تحصل فيها على اتفاقيات خاطفة قليلة. تشمل بعض الاتفاقيات الشعبية عدم وجود شوارع في القرى الصغيرة، فقط اسم القرية والعدد، في حين أن الشوارع في عناوين مدن أكبر. لقد تعلمت أنه في عاصمة المجر - بودابست، هناك عدد قليل من الشوارع التي لها نفس الاسم (أنت متميز بها برقم مقاطعة المدينة)، في حين أن المدن الأخرى لا تملك مثل هذه العناوين (قد تؤكد شخص ما من هنغاريا بالفعل ما إذا كان هذا صحيحا). لذلك سيكون إجمالي عدد تنسيقات العناوين Numer_Of_Countries مضروبا في عدد تنسيقات العناوين في هذا البلد ... يمكن القيام به مع الجداول المختلفة، ولكن سيكون العمل الرهيب القيام به.

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

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

رأيي هو أن النماذج الأكثر مرونة تميل إلى أن تكون تلك الأقل تقييدا، اعتمادا على تفسيرك المرن.

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