Praktik terbaik untuk menyimpan alamat pos dalam database (RDBMS)?

106

Apakah ada referensi yang baik untuk praktik terbaik untuk menyimpan alamat pos di RDBMS? Tampaknya ada banyak pengorbanan yang dapat dilakukan dan banyak pro dan kontra untuk dievaluasi - tentunya ini telah dilakukan berkali-kali? Mungkin seseorang setidaknya telah menulis beberapa pelajaran yang dipelajari di suatu tempat?

Contoh pengorbanan yang saya bicarakan adalah menyimpan kode pos sebagai bilangan bulat vs bidang karakter, haruskah nomor rumah disimpan sebagai bidang terpisah atau bagian dari baris alamat 1, apakah nomor suite / apartemen / dll harus dinormalisasi atau hanya disimpan sebagai potongan teks di baris alamat 2, bagaimana Anda menangani zip +4 (bidang terpisah atau satu bidang besar, integer vs teks)? dll.

Saya terutama prihatin dengan alamat AS pada saat ini, tetapi saya membayangkan ada beberapa praktik terbaik dalam hal mempersiapkan diri Anda untuk kemungkinan menjadi global juga (misalnya, menamai bidang dengan tepat seperti wilayah, bukan negara bagian atau kode pos, bukan kode pos, dll.

John
sumber
3
Langsung dari zip kelelawar harus berupa kolom karakter - jika tidak, kode zip tertentu yang dimulai dengan 0 akan menjadi tidak akurat.
Menasheh
1
Sebagai aturan praktis, saat Anda perlu melakukan penghitungan matematika dengan angka, itu harus bilangan bulat. Jika Anda hanya menampilkannya, itu harus char (telepon, kode pos, dll.)
Zikato

Jawaban:

37

Untuk penggunaan yang lebih internasional, satu skema yang perlu dipertimbangkan adalah yang digunakan oleh Bidang Alamat Drupal . Ini didasarkan pada standar xNAL , dan tampaknya mencakup sebagian besar kasus internasional. Sedikit menggali ke dalam modul itu akan mengungkapkan beberapa mutiara bagus untuk menafsirkan dan memvalidasi alamat secara internasional. Ini juga memiliki satu set area administratif yang bagus (provinsi, negara bagian, oblast, dll) dengan kode ISO.

Berikut inti dari skema, disalin dari halaman modul:

country => Country (always required, 2 character ISO code)
name_line => Full name (default name entry)
first_name => First name
last_name => Last name
organisation_name => Company
administrative_area => State / Province / Region (ISO code when available)
sub_administrative_area => County / District (unused)
locality => City / Town
dependent_locality => Dependent locality (unused)
postal_code => Postal code / ZIP Code
thoroughfare => Street address
premise => Apartment, Suite, Box number, etc.
sub_premise => Sub premise (unused)

Pelajaran yang saya pelajari:

  • Jangan simpan apapun secara numerik.
  • Simpan negara dan wilayah administratif sebagai kode ISO jika memungkinkan.
  • Jika Anda tidak tahu, lalai dalam meminta ladang. Beberapa negara mungkin tidak menggunakan bidang yang Anda anggap remeh, bahkan hal-hal dasar seperti locality& thoroughfare.
Samm Cooper
sumber
1
Bolehkah saya bertanya untuk apa "name_line" itu? Saya tidak benar-benar menemukan penjelasan di Drupal Docs atau xNal Standard. Bagaimana saya memahaminya, name_line adalah untuk mengirim surat atau paket nyata melalui surat. The first_name / last_name hanya diperlukan jika Anda ingin alamat pelanggan secara langsung, misalnya melalui email ( "yang terhormat Pak <last_name>"). Ataukah ada tujuan / manfaat lain darinya?
luba
Saat mengirim ke tempat komersial (besar), nama sering kali diperlukan untuk sistem pengiriman email internal (pertimbangkan gedung kantor dengan ruang surat)
Chris Browne
Bidang Alamat telah diganti dengan Alamat . Sepertinya ladangnya mungkin sedikit berbeda
Gavin Haynes
24

Sebagai pengguna 'internasional', tidak ada yang lebih membuat frustrasi daripada berurusan dengan situs web yang hanya berorientasi pada alamat format AS. Ini sedikit kasar pada awalnya, tetapi menjadi masalah serius ketika validasinya juga terlalu berlebihan.

Jika Anda ingin menjadi global, satu-satunya saran yang saya miliki adalah menjaga agar segala sesuatunya tetap bebas. Negara yang berbeda memiliki konvensi yang berbeda - di beberapa negara, nomor rumah muncul sebelum nama jalan, di beberapa negara lainnya setelah. Beberapa memiliki negara bagian, beberapa wilayah, beberapa kabupaten, beberapa kombinasi dari itu. Di sini, di Inggris, kode posnya bukanlah kode pos, ini adalah kode pos yang berisi huruf dan angka.

Saya hanya menyarankan ~ 10 baris string dengan panjang variabel, bersama dengan bidang terpisah untuk kode pos (dan hati-hati bagaimana Anda menggambarkannya untuk mengatasi kepekaan nasional). Biarkan pengguna / pelanggan memutuskan bagaimana menulis alamat mereka.

Andrew Ferrier
sumber
Untuk apa nilainya, ini bukan untuk situs web, tetapi poin tentang alamat internasional masih diambil dengan baik.
Yohanes
47
Meskipun saya tidak setuju dengan pesan tersebut, dan sebenarnya saya memuji Anda atas sikap yang Anda ambil, saya harus meremehkan Anda karena saya membenci kenyataan sebagai seseorang yang menghabiskan sebagian besar waktu saya menulis alat untuk membersihkan data alamat penyimpanan data alamat dalam format bentuk bebas. Alamat mungkin diformat berbeda, tetapi sebagian besar datanya masih sama. Apakah nomor jalan ditampilkan sebelum atau sesudah nama jalan sebagian besar tidak relevan untuk tujuan penyimpanan - hanya untuk tujuan tampilan.
BenAlabaster
20

Jika Anda memerlukan informasi lengkap tentang bagaimana negara lain menggunakan alamat pos, berikut adalah tautan referensi yang sangat bagus (Universitas Columbia):

Panduan Kompulsif Frank untuk Alamat Pos
Pengalamatan yang Efektif untuk Surat Internasional

percikan
sumber
17

Anda pasti harus mempertimbangkan untuk menyimpan nomor rumah sebagai bidang karakter daripada angka, karena kasus khusus seperti "setengah-angka", atau alamat saya saat ini, yang seperti "129A" ​​- tetapi A tidak dianggap sebagai apartemen nomor untuk layanan pengiriman.

Paul Fisher
sumber
11

Saya telah melakukan ini (model struktur alamat yang ketat dalam database), dan saya tidak akan pernah melakukannya lagi. Anda tidak dapat membayangkan betapa gilanya pengecualian yang harus Anda perhitungkan sebagai suatu peraturan.

Saya samar-samar mengingat beberapa masalah dengan kode pos Norwegia (menurut saya), yang semuanya 4 posisi, kecuali Oslo, yang memiliki 18 atau lebih.

Saya sangat yakin bahwa sejak kami mulai menggunakan kode pos yang benar secara geografis untuk semua alamat nasional kami, cukup banyak orang mulai mengeluh bahwa surat mereka datang terlambat. Ternyata orang-orang itu tinggal di dekat perbatasan antar wilayah pos, dan meskipun sebenarnya ada yang tinggal di wilayah pos, katakanlah 1600, pada kenyataannya suratnya harus ditujukan ke wilayah pos 1610, karena kenyataannya itu adalah wilayah pos tetangga. yang benar-benar melayaninya, jadi mengirim surat ke area pos yang benar akan membutuhkan waktu beberapa hari lagi untuk sampai, karena intervensi yang tidak diinginkan yang diperlukan di kantor pos yang benar untuk meneruskannya ke area pos yang salah ...

(Kami akhirnya mendaftarkan orang-orang dengan alamat di luar negeri di negara dengan kode ISO 'ZZ'.)


sumber
8

Anda tentunya harus berkonsultasi dengan " Apakah ini cara yang baik untuk memodelkan informasi alamat dalam database relasional ", tetapi pertanyaan Anda bukanlah duplikat langsung dari itu.

Pasti ada banyak jawaban yang sudah ada sebelumnya (lihat contoh model data di DatabaseAnswers , misalnya). Banyak dari jawaban yang sudah ada sebelumnya rusak dalam beberapa keadaan (tidak memilih DB Answers sama sekali).

Salah satu masalah utama yang perlu dipertimbangkan adalah cakupan alamat. Jika database Anda harus berurusan dengan alamat internasional, Anda harus lebih fleksibel daripada jika Anda hanya berurusan dengan alamat di satu negara.

Dalam pandangan saya, seringkali (yang tidak berarti selalu ) masuk akal untuk merekam 'gambar label alamat' dari alamat dan menganalisis konten secara terpisah. Ini memungkinkan Anda untuk mengatasi perbedaan antara penempatan kode pos, misalnya, di antara negara yang berbeda. Tentu, Anda dapat menulis penganalisis dan pemformat yang menangani keeksentrikan negara yang berbeda (misalnya, alamat AS memiliki 2 atau 3 baris; sebaliknya, alamat Inggris dapat memiliki lebih banyak; satu alamat yang saya tulis secara berkala memiliki 9 baris). Tetapi akan lebih mudah untuk meminta manusia melakukan analisis dan pemformatan dan membiarkan DBMS hanya menyimpan data.

Jonathan Leffler
sumber
7

Kecuali jika Anda akan mengerjakan matematika tentang nomor jalan atau kode pos / pos, Anda hanya mengundang rasa sakit di masa depan dengan menyimpannya sebagai angka.

Anda mungkin menghemat beberapa byte di sana-sini, dan mungkin mendapatkan indeks yang lebih cepat, tetapi apa yang Anda lakukan ketika pos AS, atau negara lain mana pun yang Anda hadapi, memutuskan untuk memasukkan alfa ke dalam kode?

Biaya ruang disk akan jauh lebih murah daripada biaya memperbaikinya nanti ... y2k siapa?

seanb
sumber
7

Menambahkan apa @ Jonathan Leffler dan @ Paul Fisher mengatakan

Jika Anda pernah berharap memiliki alamat pos untuk Kanada atau Meksiko ditambahkan ke kebutuhan Anda, menyimpan postal-codesebagai string adalah suatu keharusan. Kanada memiliki kode pos alfa-numerik dan saya tidak ingat seperti apa rupa Meksiko.

Ken Gentle
sumber
7

Saya telah menemukan bahwa mendaftar semua bidang yang mungkin dari unit diskrit terkecil hingga terbesar adalah cara termudah. Pengguna akan mengisi bidang yang mereka inginkan. Tabel alamat saya terlihat seperti ini:

*********************************
  Field              Type
*********************************
  address_id (PK)    int
  unit               string
  building           string        
  street             string
  city               string
  region             string
  country            string
  address_code       string
*********************************
Gaz_Edge
sumber
Bagaimana Anda menyimpan PO Box?
Jowen
cukup tambahkan kolom lain PO_box Jika Anda harus melakukan ini secara retrospektif, itu berarti non dari alamat sebelumnya membutuhkan PO Box, sehingga dapat disetel ke null
Gaz_Edge
2

Di mana "trade off" dalam menyimpan ZIP sebagai NOMOR atau VARCHAR? Itu hanya sebuah pilihan - ini bukan trade off kecuali ada manfaat bagi keduanya dan Anda harus melepaskan beberapa manfaat untuk mendapatkan yang lain.

Kecuali jumlah ritsleting memiliki arti sama sekali, Zips sebagai angka tidak berguna.


sumber
Salah satu tradeoff mungkin adalah ukuran database. Di mysql 5, baris mediumint hanya akan mengambil 3 byte per baris sementara varchar (5) akan memakan waktu dua kali lebih banyak. Saya juga berpikir bahwa pencarian numerik lebih cepat daripada pencarian teks, tetapi saya tidak yakin akan hal itu.
gpojd
4
seseorang harus menggunakan varchar. Kode pos Kanada menggunakan encoding alfa numerik, yang tidak akan pas dengan sebuah angka.
EvilTeach
1
Meskipun saya memahami logika "kompatibel ke depan" di balik penggunaan varchar dalam pengertian ini, klaim bahwa "ritsleting sebagai angka tidak berguna" agak terlalu dogmatis. Jika Anda tahu Anda akan bekerja dengan kode pos khusus AS, masuk akal untuk menyimpan kode pos sebagai bilangan bulat, seperti saat menulis dalam bahasa yang diketik dengan ketat, Anda tidak mendefinisikan semuanya sebagai tipe String ... Jika Anda tahu itu akan menjadi angka, mengapa tidak bersandar pada pemeriksaan jenis DB / bahasa pemrograman dan menyebutnya apa itu - Integer?
rinogo
1
@rinogo satu argumen untuk menggunakan varchar adalah bahwa kode pos bukan numerik dalam pengertian matematis; tidak masuk akal untuk melakukan penjumlahan atau pengurangan pada mereka; mereka hanya dikodekan dengan kumpulan karakter terbatas. stackoverflow.com/a/893489/48659
Steve Folly
1
@SteveFolly Dan untuk lebih mendukung kode Zip menjadi string, karakter utama memiliki arti khusus: en.wikipedia.org/wiki/ZIP_Code#Primary_state_prefixes Jika seseorang akan menerapkan logika seperti "apa karakter paling kiri dari nilai ? " maka itu pasti terdengar lebih seperti string daripada integer.
David Aldridge
2

Ini mungkin berlebihan, tetapi jika Anda memerlukan solusi yang dapat digunakan dengan banyak negara dan Anda perlu memproses bagian alamat secara terprogram:

Anda dapat meminta penanganan alamat khusus negara menggunakan dua tabel: Satu tabel umum dengan 10 kolom VARCHAR2, 10 kolom Angka, tabel lain yang memetakan bidang ini ke petunjuk dan memiliki kolom negara yang mengikat struktur alamat ke suatu negara.

Shanmu
sumber
Saya sebenarnya telah mempertimbangkannya sendiri. Selain itu, atau mungkin bukan tabel yang memetakan kolom ke prompt berdasarkan negara yang saya pikirkan untuk membuat tampilan yang dapat diperbarui untuk setiap format alamat tertentu. Belum menarik pelatuknya, tapi sudah memikirkannya.
Andrew Steitz
1

Jika Anda harus memverifikasi alamat atau menggunakannya untuk memproses pembayaran kartu kredit, Anda setidaknya memerlukan sedikit struktur. Blok teks bentuk bebas tidak berfungsi dengan baik untuk itu.

Kode pos adalah bidang opsional umum untuk memvalidasi transaksi kartu pembayaran tanpa menggunakan alamat lengkap. Jadi, miliki bidang terpisah dan berukuran besar untuk itu (setidaknya 10 karakter).

Ted Bigham
sumber
1

Terinspirasi oleh Jawaban Database

Line1
Line2
Line3
City
Country_Province
PostalCode
CountryId
OtherDetails
Jowen
sumber
-1

Saya hanya akan menempatkan semua bidang bersama-sama dalam bidang NVARCHAR (1000) besar, dengan elemen textarea bagi pengguna untuk memasukkan nilai (kecuali Anda ingin melakukan analisis pada misalnya kode pos). Semua masukan baris alamat 1, baris alamat 2, dll. Sangat mengganggu jika Anda memiliki alamat yang tidak sesuai dengan format itu (dan, Anda tahu, ada negara lain selain AS).

erikkallen
sumber
3
Ide yang sangat buruk! Tidak ada cukup ruang dalam "Komentar" untuk menggambarkan mimpi buruk yang diundang ini. Lebih baik meluangkan sedikit waktu ekstra untuk mendesainnya dengan benar daripada mencoba mengurai kekacauan sesudahnya. Lihat jawaban Samm Cooper. Saya pikir saya hanya memilih satu jawaban lain di sini di SO, tetapi yang ini pasti mendapatkan suara rendah dari saya.
Andrew Steitz
Kekacauan yang mana? Untuk apa Anda membutuhkan data tersebut? Seringkali Anda hanya perlu mengirimkannya langsung ke beberapa label printer atau yang serupa, dan kemudian Anda dapat memperlakukannya sebagai gumpalan teks. Di lain waktu Anda mungkin peduli tentang kota dan kode pos (tetapi sebaiknya Anda memastikan hanya memiliki pelanggan di negara yang didukung)
erikkallen
2
OP tidak menyebutkan "hanya perlu meneruskannya ke printer label" dan di setiap pekerjaan yang pernah saya lakukan, kami menggunakan alamat itu sebagai "data", menjalankan laporan, mengumpulkan pajak (pajak penjualan Colorado untuk peralatan yang dipasang di rumah baru bervariasi dari satu sisi jalan ke sisi lain), menetapkan prospek ke staf penjualan, memenuhi persyaratan kepatuhan pemerintah, daftarnya terus bertambah. "Menghancurkan" data (dengan menumbuk item yang berbeda ke dalam satu bidang atau tidak menangkap data yang tersedia) adalah "dosa" dalam buku saya dan selalu terbukti sebagai mimpi buruk yang saya peringatkan ketika orang mengabaikan saya.
Andrew Steitz
Jika Anda kemudian menemukan bahwa Anda tidak membutuhkan sepotong data, Anda selalu dapat "menghancurkannya" nanti. "Membuat" data, berkisar dari mimpi buruk (membagi informasi menjadi beberapa bidang) hingga tidak mungkin (menangkap data setelah fakta). Jika OP berkata, "hanya perlu mengirimkannya ke printer label" Saya akan bertepuk tangan dan memilih jawaban Anda. Namun, tanpa menyebutkan secara khusus tentang sesuatu seperti itu, saran untuk "menghancurkan" data, IMO, hampir tidak bertanggung jawab atau bahkan kejam.
Andrew Steitz
Di tempat saya bekerja (kebanyakan e-commerce), kami cenderung menyimpannya di 5-6 bidang yang berbeda, tetapi kami tidak pernah, pernah, melakukan apa pun dengan informasi selain menggunakannya untuk mengirim ke pengiriman.
erikkallen