มีการออกแบบฐานข้อมูลที่อยู่ทั่วไปสำหรับที่อยู่ทั้งหมดในโลกหรือไม่


122

ฉันเป็นโปรแกรมเมอร์และพูดตามตรงว่าไม่รู้โครงสร้างที่อยู่ของโลกว่าในประเทศของฉันมีโครงสร้างอย่างไร :) ดังนั้นการออกแบบฐานข้อมูลที่ดีที่สุดและใช้กันทั่วไปในการจัดเก็บที่อยู่ถนนคืออะไร? ควรใช้งานง่ายรวดเร็วในการสืบค้นและมีไดนามิกในการจัดเก็บที่อยู่ทั้งหมดของโลกซึ่งระบุได้ด้วยรหัสเดียว
ขอบคุณมาก


ดูสิ่งนี้ด้วย: stackoverflow.com/a/21023793/59087
Dave Jarvis

คุณถามเกี่ยวกับที่อยู่ แต่คำตอบทั้งหมดเกี่ยวกับที่อยู่ไปรษณีย์ ( ต่างกันอย่างไร ) บางทีควรเปลี่ยนชื่อเรื่อง?
wrygiel

คำตอบ:


123

เป็นไปได้ที่จะแสดงที่อยู่จากหลายประเทศในชุดฟิลด์มาตรฐาน แนวคิดพื้นฐานของเส้นทางเข้าที่มีชื่อ (ทางสัญจร) ซึ่งอาคารที่มีชื่อหรือหมายเลขตั้งอยู่นั้นค่อนข้างเป็นมาตรฐานยกเว้นในประเทศจีนบางครั้ง แนวคิดสากลอื่น ๆ ที่ใกล้เคียง ได้แก่ การตั้งชื่อนิคม (เมือง / เมือง / หมู่บ้าน) ซึ่งสามารถเรียกโดยทั่วไปว่าเป็นท้องที่ การตั้งชื่อภูมิภาคและกำหนดรหัสไปรษณีย์ที่เป็นตัวเลขและตัวอักษร โปรดทราบว่ารหัสไปรษณีย์หรือที่เรียกว่ารหัสไปรษณีย์เป็นตัวเลขในบางประเทศเท่านั้น คุณจะต้องมีฟิลด์จำนวนมากหากคุณต้องการเป็นแบบทั่วไป

UPU สหภาพสากลไปรษณีย์ให้ข้อมูลที่อยู่สำหรับจำนวนมากของประเทศในรูปแบบมาตรฐาน โปรดทราบว่ารูปแบบ UPU มีที่อยู่ทั้งหมด (ลงไปถึงความแม่นยำของฟิลด์ที่มีอยู่) สำหรับทั้งประเทศดังนั้นจึงมีความสัมพันธ์กัน หากจัดเก็บที่อยู่ลูกค้าซึ่งจะจัดเก็บเพียงส่วนเล็ก ๆ ของที่อยู่ที่เป็นไปได้ทั้งหมดควรใช้ตารางเดียว (หรือรูปแบบแบน) ที่มีช่องทั้งหมดและที่อยู่เดียวต่อแถว

รูปแบบที่เหมาะสมสำหรับการจัดเก็บที่อยู่จะเป็นดังนี้:

  • ที่อยู่บรรทัด 1-4
  • ท้องถิ่น
  • ภูมิภาค
  • รหัสไปรษณีย์ (หรือรหัสไปรษณีย์)
  • ประเทศ

บรรทัดที่อยู่ 1-4 สามารถเก็บส่วนประกอบต่างๆเช่น:

  • อาคาร
  • Sub-อาคาร
  • บ้านเลขที่ (บ้านเลขที่)
  • ช่วงสถานที่ตั้ง
  • ทางสัญจร
  • Sub-สัญจร
  • สถานที่ที่ขึ้นอยู่กับคู่
  • ตำบลถิ่น

บ่อยครั้งที่ใช้เพียง 3 บรรทัดที่อยู่ แต่มักไม่เพียงพอ แน่นอนว่าเป็นไปได้ที่จะต้องใช้บรรทัดเพิ่มเติมเพื่อแสดงที่อยู่ทั้งหมดในรูปแบบที่เป็นทางการ แต่สามารถใช้จุลภาคเป็นตัวคั่นบรรทัดได้เสมอซึ่งหมายความว่ายังสามารถบันทึกข้อมูลได้

โดยปกติแล้วการวิเคราะห์ข้อมูลจะดำเนินการตามท้องที่ภูมิภาครหัสไปรษณีย์และประเทศและองค์ประกอบเหล่านี้ค่อนข้างง่ายสำหรับผู้ใช้ที่จะเข้าใจเมื่อป้อนข้อมูล นี่คือเหตุผลที่ควรจัดเก็บองค์ประกอบเหล่านี้เป็นช่องแยกต่างหาก อย่างไรก็ตามอย่าบังคับให้ผู้ใช้ระบุรหัสไปรษณีย์หรือภูมิภาคเนื่องจากไม่สามารถใช้ในพื้นที่ได้

สถานที่ตั้งอาจไม่ชัดเจนโดยเฉพาะความแตกต่างระหว่างสถานที่ตั้งบนแผนที่กับท้องที่ไปรษณีย์ ท้องที่ไปรษณีย์เป็นพื้นที่ที่หน่วยงานไปรษณีย์พิจารณาซึ่งบางครั้งอาจเป็นเมืองใหญ่ใกล้เคียง อย่างไรก็ตามโดยปกติแล้วรหัสไปรษณีย์จะแก้ไขปัญหาหรือความคลาดเคลื่อนที่นั่นเพื่อให้สามารถจัดส่งได้อย่างถูกต้องแม้ว่าจะไม่ได้ใช้พื้นที่ไปรษณีย์อย่างเป็นทางการก็ตาม


1
คุณสามารถให้ URL สำหรับ UPU ได้หรือไม่? (ใช่ฉันรู้ว่าฉันหาได้ แต่คำตอบที่ดีที่สุดไม่ได้ทำให้คนค้นหา)
Jonathan Leffler

ลองupu.int/post_code/en/…แล้วเลือกประเทศที่เหมาะสมในเมนูแบบเลื่อนลง
barrowc

เพิ่ม URL สำหรับ UPU Post * Code product
Edward Ross

17
นอกจากนี้บางประเทศ (เช่นสาธารณรัฐไอร์แลนด์) ไม่ใช้รหัสไปรษณีย์ ถ้าฉันมีร้อยละสำหรับจำนวนครั้งที่ฉันต้องป้อน na (ใช้ไม่ได้) เป็นรหัสไปรษณีย์เพราะเป็นฟิลด์ที่จำเป็น . . ตอนนี้ฉันมีเงินห้าหรือหกเซนต์ :)
Binary Worrier

หาก UPU มีรายการที่ดาวน์โหลดได้ในขณะนี้พวกเขาทำงานได้ดีในการเก็บซ่อนไว้
Jahmic

47

มีลักษณะที่คำตอบฐานข้อมูล โดยเฉพาะกรณีนี้ครอบคลุมหลายกรณี:

(ประเภทข้อมูลอักขระความยาวตัวแปรทั้งหมด)

AddressId
Line1
Line2
Line3
City
ZipOrPostcode
StateProvinceCounty
CountryId
OtherAddressDetails

ใส่คำอธิบายภาพที่นี่


ฉันไม่ได้ลงคะแนน แต่ฉันคิดว่าวิธีเดียวที่จะได้ผลคือถ้าทุกฟิลด์ แต่ AddressId และ Line1 เป็นทางเลือก ซึ่งในกรณีนี้มันไม่มีประโยชน์มากเกินไป

11
ประเภทข้อมูลมีความสำคัญไม่ใช่ทุกประเทศที่มีรหัสไปรษณีย์จำนวนเต็ม! มีเพื่อนร่วมงานพบข้อมูลนี้อย่างรวดเร็วกับลูกค้าในแคนาดา
Eric

1
@Eric: นอกเหนือจากฟิลด์ Id ฟิลด์เหล่านั้นทั้งหมดเป็นประเภทข้อมูลตัวละคร
Mitch Wheat

2
สำหรับรหัสประเทศคุณควรใช้รหัสประเทศ ISO 3166 2 ตัวอักษร (หรือ 3 ตัวอักษร) สคีมาที่เสนอช่วยให้คุณจัดเก็บที่อยู่ที่วิเคราะห์ได้ มันไม่ได้บอกคุณเกี่ยวกับวิธีการจัดรูปแบบ (โอ้และสหราชอาณาจักรมีรหัสไปรษณีย์ที่เป็นตัวอักษรและตัวเลข - IP31 3GH, SE1W 9PQ เป็นต้นฉันคิดว่ากลุ่มที่สองคือ NAA เสมอกลุ่มแรกเริ่มต้นด้วย A และมีอย่างน้อยหนึ่ง N (A = alpha, N = หลัก) แต่ไม่มีอะไรจะทำให้ฉันประหลาดใจ)
Jonathan Leffler

@ นีล: แน่นอน มีความแตกต่างกันมากในแต่ละประเทศที่คุณไม่สามารถใช้ตารางเดียวและคาดว่าฐานข้อมูลจะตรวจสอบ
Dave Sherohman

26

ถามตัวเองว่าจุดประสงค์หลักของการจัดเก็บข้อมูลนี้คืออะไร? คุณตั้งใจที่จะส่งจดหมายไปยังบุคคลตามที่อยู่หรือไม่? ติดตามข้อมูลประชากรประชากร? สามารถขอที่อยู่ที่ถูกต้องจากผู้โทรซึ่งเป็นส่วนหนึ่งของการพิสูจน์ตัวตน / การยืนยันขั้นพื้นฐานได้หรือไม่? ทั้งหมดที่กล่าวมา? ไม่มีข้อใดข้างต้น?

ขึ้นอยู่กับความต้องการที่แท้จริงของคุณคุณจะกำหนด a) มันไม่สำคัญจริงๆและคุณสามารถใช้แนวทางข้อความอิสระหรือ b) ช่องที่มีโครงสร้าง / เฉพาะสำหรับทุกประเทศหรือ c) สถาปัตยกรรมเฉพาะของประเทศ


มีเหตุผล. ฉันกำลังค้นหาวิธีแก้ปัญหาที่ดีสำหรับปัญหานี้ แต่มีหลายวิธีที่แตกต่างกัน อย่างที่คุณพูด: ควรเลือกจากความต้องการที่แท้จริง
DisplayName

12

บางครั้งสถานที่ใกล้เคียงที่สุดที่คุณสามารถไปยังที่อยู่ได้คือเมือง

ครั้งหนึ่งฉันเคยมีโครงการที่จะนำโรงเรียนมัธยมศึกษาทั้งหมดในอินเดียไปไว้ใน Google Maps ฉันเขียนโปรแกรมที่ไพเราะโดยใช้ Google API และคิดว่ามันจะค่อนข้างง่าย

จากนั้นฉันได้รับข้อมูลจากลูกค้า ที่อยู่โรงเรียนบางแห่งมีลักษณะเช่น "ตรงข้ามตลาดข้างร้านตัดผม" หรือ "ใกล้ป้ายรถเมล์เก่า"

มันทำให้งานของฉันยากขึ้นมากตั้งแต่นั้นมาขออภัยที่ Google API ไม่รองรับรูปแบบนั้น


2
ที่อยู่ในเอเชียก็มีชื่อเสียงในเรื่องนี้เช่นกัน "73rd Block West Ninjang St, อาคาร 2, ขึ้นลิฟต์ชั้นสอง, อาคารสำนักงานข้างศูนย์อาหาร, เขตอุตสาหกรรมที่ 468, เซี่ยงไฮ้ 456789" ...
ruhnet

9

สำหรับที่อยู่ต่างประเทศเป็นเรื่องยากมากที่จะหาวิธีจัดรูปแบบข้อมูลหากแยกย่อยออกเป็นช่องต่างๆ ตัวอย่างเช่นที่อยู่อิตาลีใช้:

<street address>
<zip> <town> <region>
<country>

เช่น

Via Eroi della Repubblica
89861 Tropea VV
Italy

ซึ่งค่อนข้างแตกต่างจากคำสั่งซื้อที่อยู่ในสหรัฐอเมริกาในบรรทัดที่สอง

ดูคำถาม SO:

ตรวจสอบแท็ก ' รหัสไปรษณีย์ ' ด้วย


แก้ไข : ลำดับย้อนกลับของภูมิภาคและเมือง - ต่อUPU


5

สิ่งนี้อาจเป็นประโยชน์: https://gist.github.com/259744 สำหรับโครงการฉันได้รวบรวมตารางข้อมูลเกี่ยวกับทุกประเทศทั่วโลกรวมถึงรหัส ISO โดเมนระดับบนสุดรหัสโทรศัพท์ป้ายรถความยาวและนิพจน์ทั่วไปของ ซิป ชื่อประเทศและความคิดเห็นน่าเสียดายเป็นภาษาเยอรมันเท่านั้น ...


2

ขึ้นอยู่กับว่าคุณเตรียมพร้อมที่จะไปกับเขตข้อมูลแบบอิสระแค่ไหน เห็นได้ชัดว่าช่องที่อยู่รูปแบบอิสระหนึ่งช่องมักจะทำ แต่มีส่วนช่วยเพียงเล็กน้อยในการ จำกัด ภูมิศาสตร์ให้แคบลง

ปัญหาที่คุณจะพบก็คือระดับลำดับชั้นทางภูมิศาสตร์ในประเทศต่างๆมีการเปลี่ยนแปลงมากเกินไป Heck บางประเทศไม่มี 'ที่อยู่' ทุกที่ด้วยซ้ำ

ฉันแนะนำว่าอย่าพยายามทำให้ฉลาดเกินไป


2

คำตอบอื่น ๆ ที่แตกต่างกันที่นี่ฉันเชื่อว่าเป็นไปได้ที่จะมีฐานข้อมูลที่อยู่ที่มีโครงสร้าง

แค่ออกจากหมวกฉันก็คิดโครงสร้างต่อไปนี้ได้:

  • ประเทศ
  • ภูมิภาค (รัฐ / จังหวัด)
  • ท้องถิ่น (เมือง / เทศบาล)
  • Sub-Locality (เขต / ส่วนย่อยอื่น ๆ ของท้องที่)
  • ถนน

แต่จะสอบถามอย่างไรให้เร็วพอ?

วิธีหนึ่งที่ฉันคิดเสมอว่ามันสามารถทำได้คือการขอรหัสไปรษณีย์ (หรือรหัสไปรษณีย์) ซึ่งแตกต่างกันไปในแต่ละประเทศ แต่เป็นของแข็งภายในประเทศ

ด้วยวิธีนี้คุณสามารถจัดโครงสร้างข้อมูลของคุณตามข้อมูลที่สำนักงานไปรษณีย์ทั่วโลกให้ไว้ได้


2

Len Silverston แห่งชื่อเสียงของUniversal Data Modelแนะนำลำดับชั้นที่แยกจากกันGEOGRAPHIC BOUNDARIESและขึ้นอยู่กับจำนวนรูปแบบอิสระที่คุณยินดีที่จะยอมรับอย่างง่าย ๆSTREET ADDRESS LINEอนุพันธ์หรืออนุพันธ์ต่อประเทศ


1
จริงอยู่และโมเดลที่ Silverston สร้างขึ้นมานั้นค่อนข้างดีและครอบคลุมพื้นที่มาก แต่ฉันก็ยังไม่คิดว่าความซับซ้อนดังกล่าวเกี่ยวข้องกับเว็บ (ณ จุดนี้) โดยเฉพาะจากมุมมองของผู้ใช้ปลายทาง ในท้ายที่สุดการใช้งาน (เกือบ) เสมอจะชนะ
Alix Axel

2

ไม่ไม่อย่างแน่นอน หากคุณเปรียบเทียบวิธีที่อยู่ในสหรัฐอเมริกาและญี่ปุ่นทำงานของคุณจะเห็นว่าเป็นไปไม่ได้

UPDATE:

ในความคิดที่สองสิ่งใดทำได้ แต่มีการแลกเปลี่ยน

แนวทางหนึ่งคือการสร้างแบบจำลองปัญหาด้วยตาราง address และ address_attribute โดยมีความสัมพันธ์แบบ 1: m ซึ่งสามารถสร้างแบบจำลองได้ ตาราง address_attribute จะมี pk ชื่อค่าและ fk ที่ชี้กลับไปยัง pk ของแอดเดรสของมัน เกือบจะเหมือนกับการใช้แผนที่กับชื่อคู่ค่า

การแลกเปลี่ยนจะต้องทำการ JOIN ทุกครั้งที่คุณต้องการที่อยู่ คุณต้องซักถามชื่อของ address_attributes เพื่อดูว่าคุณกำลังติดต่ออะไรในแต่ละครั้ง

อีกแนวทางหนึ่งคือการทำวิจัยที่ครอบคลุมมากขึ้นเกี่ยวกับวิธีการจำลองที่อยู่ทั่วโลก ในโลกเชิงวัตถุคุณอาจมีคลาสที่อยู่แบบตะวันตก (street1 / street2 / city / state / zip) และอื่น ๆ สำหรับญี่ปุ่นจีนมากที่สุดเท่าที่จำเป็นในการแบ่งพื้นที่ที่อยู่ จากนั้นคุณจะมีตารางที่อยู่หลักและตารางรองสำหรับประเภทอื่น ๆ โดยมีความสัมพันธ์แบบ 1: 1 ระหว่างกัน

Amazon หรือ eBay ทำได้อย่างไร? พวกเขาจัดส่งระหว่างประเทศ พวกเขามีคุณสมบัติ UI เฉพาะสถานที่หรือไม่ ฉันใช้เฉพาะภาษาของสหรัฐอเมริกาเท่านั้น


1
ถ้าฉันต้องการที่อยู่ส่วนใหญ่ล่ะ?
Arsen Mkrtchyan

ขออภัยฉันไม่ได้ติดตามคุณที่นี่
duffymo

2

ไม่ไม่มีรูปแบบการกำหนดแอดเดรสมาตรฐาน โดยปกติจะแตกต่างกันไปในแต่ละประเทศ แม้แต่สหภาพไปรษณีย์สากลยังกล่าวในเรื่องAdressing the world ซึ่งเป็นที่อยู่สำหรับทุกคนว่าไม่มีเลย ทางออกที่ดีที่สุดคือใช้มาตรฐานรหัสประเทศ2/3ตัวอักษรที่เรียกว่าISO 3166และปฏิบัติตามมาตรฐานของประเทศ

แต่ถ้าคุณเป็นจริงหมดหวังที่จะใช้เครื่องมือที่สามารถเข้าถึงได้ง่ายสำหรับโครงการของคุณคุณสามารถลองGoogle Place API


ฉันชอบแนวคิดที่จะดูว่า Google Place API จัดการกับสิ่งต่างๆอย่างไร!
Andrew Steitz

1

การออกแบบของคุณควรขึ้นอยู่กับวัตถุประสงค์ของคุณเป็นอย่างยิ่ง มีบางคนโพสต์วิธีการจัดโครงสร้างข้อมูล ดังนั้นหากคุณเพียงแค่ต้องการส่ง s-mail ถึงใครบางคนก็จะทำ สิ่งต่างๆเริ่มซับซ้อนหากคุณต้องการใช้ข้อมูลนี้เพื่อการนำทาง การนำทางรถยนต์จะต้องใช้โครงสร้างเพิ่มเติมเพื่อให้มีข้อมูลการจราจร (เช่นถนนทางเดียว) ในขณะที่การนำทางด้วยเท้าจะต้องใช้ข้อมูลเพิ่มเติมจำนวนมาก นี่คือตัวอย่างเล็ก ๆ : ในเมืองของฉันละแวกของฉันอยู่ใกล้สวนสาธารณะ ถัดจากสวนสาธารณะคือสนามบินเดิม (อันที่จริงแล้วเป็นสนามบินที่เก่าแก่ที่สุดแห่งหนึ่งในยุโรป) กลายเป็นพิพิธภัณฑ์การบิน ถัดจากพิพิธภัณฑ์การบินเป็นสวนธุรกิจ หมายเลขถนนของพิพิธภัณฑ์คือ 39 ในขณะที่หมายเลขสวนธุรกิจเริ่มต้นด้วย 39A ดังนั้นจึงอาจดูเหมือนว่า 39 และ 39A อยู่ใกล้ - แต่ใช้เวลาเดินจากกันไปประมาณ 1 ไมล์ (และนานกว่านั้นหากเดินทางโดยรถยนต์)
นี่เป็นเพียงตัวอย่างเล็ก ๆ น้อย ๆ ที่นำมาจากเมืองของฉันฉันคิดว่าคุณอาจพบข้อยกเว้นมากมาย (โดยเฉพาะในพื้นที่ชนบทหรือในพื้นที่ป่าของทุกประเทศ)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.