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