Apa cara universal untuk menyimpan alamat / lokasi geografis dalam database? [Tutup]


25

Apa format alamat geografis / lokasi yang tepat yang cocok untuk alamat di Bumi? Saat ini saya punya:

  • negara
  • kota
  • jalan
  • jumlah
  • data teks (untuk kesederhanaan)
  • zip
  • lat / lng

Tapi saya yakin saya bisa memperbaikinya: mungkin ada negara bagian atau wilayah seperti negara. Atau tidak ada wilayah / wilayah / negara bagian, katakanlah, di Singapura atau Hong Kong.

Mungkin tidak ada jalan, tapi jalan atau bulevar atau yang lainnya. Sejumlah bangunan mungkin majemuk. Mungkin ada lantai. Nomor kamar. Dll ....


11
Anda perlu menjelaskan untuk aplikasi apa, dan siapa yang memberikan alamat itu. Misalnya pada kebanyakan toko / situs web komersial, saya tidak mengetik "lintang / bujur" yang sebaliknya sangat penting untuk ICBM (atau GPS). Juga, ketinggian (dan waktu dan tanggal) penting dalam beberapa kasus (pikirkan beberapa kapal di laut, atau beberapa pelancong di Everest). Jadi saya tidak yakin ada jawaban universal.
Basile Starynkevitch


6
@ BasileStarynkevitch: Saya pikir itu tidak begitu penting "untuk aplikasi apa", tetapi "untuk apa use case (s)". Jika, misalnya, kasus penggunaannya adalah untuk memastikan layanan pos di seluruh dunia dapat mengirimkan email, saya kira pertanyaan ini dapat dijawab dengan cara yang masuk akal. Namun, untuk kasus penggunaan ini "lat / lng" tidak akan diperlukan.
Doc Brown

34
Saya pikir format universal untuk suatu alamat adalah sebuah String tunggal.
Erik Eidt

12
Masalah yang Anda ajukan sangat menyakitkan, sehingga beberapa perusahaan di luar sana mengembangkan cara universal mereka untuk mengatasinya, misalnya: what3words.com (bermuara pada pemetaan koordinat lokasi menjadi tiga kata). Mereka mengklaim, bahwa "Dengan kata-kata apa, semua orang dan di mana saja sekarang memiliki alamat."
Roman Susi

Jawaban:


51

Google telah mengembangkan perpustakaan yang membantu memvalidasi alamat pos untuk setiap negara di dunia, yang dapat Anda gunakan untuk merancang skema untuk menyimpan data ini.

Cari bidang yang paling umum diperlukan di seluruh alamat dari basis pelanggan yang ditargetkan untuk memulai, dan saat Anda mengidentifikasi negara lain dengan persyaratan yang berbeda, Anda dapat terus menyesuaikan skema Anda.


5
+1 untuk mempelajari solusi yang ada. The Addresskelas dari SDK Android bisa menjadi tempat lain yang baik untuk memulai.
Kevin Krumwiede

4
Pemindaian cepat perpustakaan Google menunjukkan bahwa itu dibangun di oasis-open.org/committees/ciq/download.shtml
grahamj42

@ grahamj42, lol, halaman itu sangat rusak.
Nakilon

41

Cara universal untuk menyimpan alamat / lokasi geografis dalam database adalah yang ini:

[Address] nvarchar(max) not null

Ini membutuhkan jumlah kode pemrograman paling sedikit (sehingga menghemat biaya perawatan) dan sepenuhnya kompatibel dengan alamat apa pun. Namun, ada tiga masalah besar:

  • Kurangnya validasi data berarti bahwa bidang tersebut dapat digunakan untuk tujuan selain menyimpan alamat. Salah satu tujuannya adalah serangan DOS yang dimaksudkan untuk mengisi ruang basis data Anda dengan memasukkan 2 GB data di bidang alamat.

  • Data yang disimpan dengan cara ini tidak memungkinkan untuk memprosesnya untuk keperluan intelijen bisnis dan data mining. Misalnya, berapa banyak pengguna dari India? Tidak ada cara mudah untuk mengatakannya, karena alamat-alamat itu tidak akan dinormalisasi.

  • Pengguna dapat secara keliru memasukkan alamat yang tidak lengkap atau salah.

Untuk mengurangi masalah pertama, batasi bidang ke apa yang Anda pikir sebagai batas yang masuk akal. Secara pribadi, saya akan mulai dengan 1000 karakter, dan kemudian menguranginya berdasarkan panjang alamat yang dimasukkan oleh pengguna pertama setelah Anda mendapatkan kumpulan data yang cukup besar.

Untuk mengurangi dua masalah lainnya, Anda dapat menggunakan API pihak ketiga yang mem-parsing alamat dan memberi Anda data yang berisi negara, kota, kode pos, dll. Jika memungkinkan, API harus dapat menampilkan alamat tersebut di peta kembali ke pengguna untuk mengurangi risiko bagi pengguna memasukkan alamat yang tidak lengkap atau salah: sebagian besar pengguna tahu di mana mereka tinggal, dan melihat posisi yang berbeda pada peta akan segera memberi mereka petunjuk bahwa mereka harus memeriksa input mereka.

Perhatikan bahwa API apa pun yang Anda gunakan, itu tidak akan sempurna. Ini akan menemukan sebagian besar alamat, tetapi tidak semuanya. Ini berarti bahwa jika API memberi tahu bahwa alamat tersebut tidak ada, tetapi pengguna bersikeras bahwa itu memang ada, Anda harus secara apriori mempercayai pengguna, meskipun ia mungkin salah.

Ini juga berarti bahwa Anda masih harus menyimpan input pengguna asli, berdampingan dengan hasil API. Ini berarti bahwa skema tersebut menjadi:

[RawAddress] nvarchar(max) not null
[ParsedAddress] xml null

Catatan: Paling tidak, Anda dapat menyimpan negara secara terpisah, jika ini diperlukan. Misalnya, ini dapat secara otomatis dideduksi dari bidang alamat, dengan opsi bagi pengguna untuk mengubahnya.
Matthieu M.

'gunakan API' berarti ada orang lain yang telah mendapatkan format resmi semua negara. Tidak ada alasan Anda tidak dapat melakukannya sendiri
Ewan

@Wan Tidak ada alasan kecuali waktu, uang, bahasa, dan hambatan lainnya.
Andrew mengatakan Reinstate Monica

tentu, tetapi apakah kami memberikan jawaban tentang cara melakukan hal-hal atau membandingkan harga orang lain yang melakukan hal untuk Anda?
Ewan

@ Ewan: pertanyaannya adalah tentang format penyimpanan alamat. API tidak menentukan format ini: tujuan dari jawaban saya adalah untuk menunjukkan bahwa segera setelah Anda memiliki bidang teks biasa dan bidang XML / JSON / apa pun untuk data yang diuraikan, Anda dapat menyimpan dan secara statistik memproses alamat dari mana saja Di dalam dunia.
Arseni Mourzenko

37

Tidak ada.

Setiap negara memiliki format alamat yang berbeda. Jika Anda beruntung, dan mereka memiliki format sama sekali!

Jelas lintang / bujur akan memberi Anda titik di dunia, tetapi itu tidak benar-benar berguna untuk mengidentifikasi setiap rumah. Pertimbangkan saja blok menara misalnya.

Taruhan terbaik Anda adalah untuk memeriksa setiap layanan pos negara untuk format resmi. Ini bisa bagus untuk database backend Anda. Tetapi Anda mungkin harus menyederhanakannya untuk pengguna akhir karena akan berisi lebih banyak bidang daripada kebanyakan orang.

Misalnya di Inggris termasuk hal-hal seperti 'lokalitas tergantung ganda', tetapi tidak ada yang akan tahu apa artinya jika Anda bertanya kepada mereka.


3
Apa itu cara universal ...........
Xwaro

40
@Xwaro Mereka hanya berkata, Tidak ada.
Zymus

6
Saya kira Xwaro berarti saya mengasumsikan alamat di bumi.
Ewan

3
Ini adalah yang sumber resmi untuk format alamat dicetak: Universal Postal Union
grahamj42

3
menarik. Saya pikir ini adalah halaman yang relevan: upu.int/en/activities/addressing/s42-standard/… Anda dapat melihat bagaimana A: hanya beberapa negara, dan B: pemetaan dari s42 ke format alamat negara tidak 1
banding

21

Satu-satunya format universal adalah memiliki satu bidang teks yang mungkin memiliki beberapa baris teks. Ini akan memungkinkan alamat apa pun yang mungkin ada di bumi.


2
Hebat, sekarang semua orang bisa menggambarkan alamat yang sama dengan cara yang berbeda dan tidak kompatibel. Saya kira pertanyaannya tidak bertanya tentang standar, jadi ini secara teknis jawaban yang benar.
Michael

@ Michael: Alamat yang berbeda dan tidak kompatibel di seluruh dunia. Ada adalah tidak ada template standar. Memiliki bidang beberapa baris memungkinkan pengguna untuk benar-benar menulis alamat yang benar.
JacquesB

@Michael Field terpisah sering memaksa saya untuk memotong / menyingkat satu field atau yang lainnya, yang juga mengarah pada representasi yang tidak konsisten. (Masih berfungsi biasanya, layanan pos cukup berpengalaman dalam hal ini).
Hulk


Hanya berita gembira yang menarik, secara teknis ini tidak benar. Di beberapa daerah di negara-negara, bagian dari alamat digambarkan sebagai gambar.
KayakinKoder

9

Saya telah mengembangkan solusi perangkat lunak untuk digunakan di banyak negara. Kami mengatasi masalah ini dengan memulai dengan entitas yang lebih besar terlebih dahulu, yaitu negara kemudian memiliki bidang ke bawah yang paling umum atau terkecil. Ini bekerja dengan baik untuk semua negara yang telah kami uji sejauh ini. Kami juga memiliki sistem pencegahan duplikat yang cerdas, dan penggabungan untuk mereka yang entah bagaimana masuk ke dalam sistem karena pengguna sangat 'kreatif'. Di bagian admin kami memiliki urutan bidang alamat per pengaturan negara. yaitu Jepang memiliki Post / Zip-code pertama di mana sebagai Inggris / AS terakhir.

Secara umum, kami menggunakan:

  • Negara
  • Posting / kode pos
  • Negara Bagian / Provinsi / Prefektur / Kabupaten
  • Kota / Kota / Desa
  • Jalan / Jalan / Blok
  • Nama / Nomor Bangunan
  • Informasi Khusus / Khusus

Setelah dimasukkan dan disimpan, versi terkonjugasi dapat ditampilkan meninggalkan bidang yang tidak perlu.

Seperti yang saya katakan, ini berfungsi untuk semua negara tempat kami memiliki perangkat lunak dan merupakan hasil pengembangan sejak 1989.

Semoga ini bisa membantu entah bagaimana atau setidaknya memberikan wawasan lain.


bagaimana Anda memberi nama kolom di db Anda untuk "Negara / Propinsi / Prefektur / Kabupaten"?
Xwaro

6
@Xwaro Tidak masalah, beri nama apa pun kata yang menurut Anda paling tidak dikacaukan oleh pengembang Anda. Ini karena namanya internal untuk perangkat lunak Anda dan tidak akan pernah dilihat oleh pengguna. Alamat tidak pernah ditampilkan dengan nama bidang. Yaitu, Anda tidak pernah melihat No 10 Street Downing Street, City Westminster, State London, Country UK. Sebaliknya, Anda akan melihat10 Downing Street, Westminster, London, UK
slebetman

@slebetman Pertanyaannya adalah: bagaimana Anda memberi nama kolom di db Anda untuk "Negara / Provinsi / Prefektur / Kabupaten"? Bukan "bagaimana Anda merekomendasikan saya untuk memberi nama sebuah kolom di db saya untuk" Negara / Provinsi / Prefektur / Kabupaten "?
Dari

@Dari Tidak masalah, saya beri nama apa pun kata yang menurut saya paling tidak membingungkan para pengembang saya. Ini karena namanya internal untuk perangkat lunak saya dan tidak akan pernah dilihat oleh pengguna. Jadi itu tergantung pada apa yang digunakan tim saya.
Slebetman

@slebetman - apa nama Anda?
Dari

0

Seperti yang telah dinyatakan, yang paling universal (tetapi tidak praktis untuk divalidasi dan mungkin paling tidak berguna) adalah bidang unicode besar tunggal.

Anda dapat memisahkan negara dari sisa alamat dan menyimpannya sebagai kode negara ISO. Ini akan menormalkan negara dan menawarkan beberapa utilitas dalam memvalidasi sisa alamat.

Anda juga dapat memisahkan kode pos alias kode pos dari sisa alamat. Ini juga akan memiliki beberapa utilitas dalam memvalidasi sisa alamat, dan dapat membantu (meskipun tidak tepat) dalam geolokasi. Misalnya: di Kanada Anda dapat secara unik mengidentifikasi alamat yang hanya menentukan kode pos dan nomor jalan (alias nomor rumah); ini mungkin tidak benar di semua negara.

Mendedikasikan bidang ke negara bagian / provinsi atau kota mulai menjadi lebih bermasalah karena variasi dalam cara masing-masing negara merumuskan alamat. Saya telah menyiapkan tabel alamat yang memiliki bidang-bidang seperti itu karena audiens awal difokuskan pada Amerika Utara, mengetahui bahwa audiens internasional akan menimbulkan masalah untuk menyesuaikan diri. Dalam kebanyakan kasus, mereka dapat "ditanduk sepatu", tetapi ini merupakan kompromi yang canggung dan berpotensi gagal - jelas tidak universal.


0

Bertentangan dengan jawaban Mitchdav, saya akan menyarankan agar tidak menggunakan perpustakaan Google. Saya mencari di repositori untuk berbagai tempat internasional dengan skema pengalamatan yang tidak ortodoks, berharap menemukan data unit test, tetapi yang mengkhawatirkan saya menemukan nol hit di seluruh repositori.

Saya pikir taruhan terbaik Anda adalah memperlakukan alamat sebagai teks multi-baris bentuk bebas. Ini menyebalkan bahwa Anda mungkin tidak dapat memvalidasi semua alamat, tetapi beberapa format pengalamatan benar-benar aneh dan mungkin tidak diantisipasi dan pada akhirnya tanggung jawab mengisi alamat yang benar terletak pada pengguna dan dalam sebagian besar aplikasi pengguna menanggung konsekuensi negatif dari mengisi sebuah alamat tidak valid.

Anda mungkin, mungkin, menggunakan validator untuk memberikan peringatan , tetapi tidak lebih dari itu. Tetapi jangan menolak alamat yang tidak divalidasi, karena jika tidak, Anda mungkin kehilangan beberapa pelanggan. Yang mengarah ke pertanyaan tentang bagaimana mengkomunikasikan peringatan kepada pengguna sedemikian rupa sehingga akan berkomunikasi bahwa, jika pengguna tinggal di daerah dengan format alamat yang aneh, aman untuk mengabaikan peringatan ...


-1

Seperti yang Anda katakan alamat di bumi hanya ada panjang lat atau ...

https://what3words.com

Apa 3 kata, adalah sebuah algoritma (jadi bukan basis data sehingga dapat tertanam ke dalam apa pun) yang dapat menentukan patch 3x3 meter di mana saja di Bumi.

Tonga dan beberapa negara bagian lain telah mengadopsinya sebagai sistem kode pos mereka, sementara itu tidak akan menggantikannya sebagai overlay yang keren, dan dibuat dengan sangat baik dan dipikirkan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.