Uniwersalny sposób przechowywania adresu / lokalizacji geograficznej w bazie danych jest następujący:
[Address] nvarchar(max) not null
Wymaga to najmniejszej ilości kodu programowania (a więc obniża koszty utrzymania) i jest w pełni kompatybilny z dowolnym adresem. Ma jednak trzy duże problemy:
Brak walidacji danych oznacza, że pole może być wykorzystane do celów innych niż zapisanie adresu. Jednym z celów jest atak DOS, którego celem jest wypełnienie przestrzeni bazy danych poprzez wprowadzenie 2 GB danych w polu adresu.
Przechowywane w ten sposób dane uniemożliwiają ich przetwarzanie do celów analizy biznesowej i eksploracji danych. Na przykład ilu użytkowników pochodzi z Indii? Nie ma łatwego sposobu na określenie, ponieważ adresy te nie zostaną znormalizowane.
Użytkownicy mogą omyłkowo wprowadzić niepełny lub po prostu zły adres.
Aby złagodzić pierwszy problem, ogranicz pole do tego, co uważasz za rozsądny limit. Osobiście zaczynałbym od 1000 znaków, a następnie zmniejszałbym go na podstawie długości adresów wprowadzonych przez pierwszych użytkowników, gdy tylko dostaniesz wystarczająco duży zestaw danych.
Aby złagodzić pozostałe dwa problemy, możesz użyć interfejsu API innej firmy, który analizuje adresy i przedstawia dane zawierające kraj, miasto, kod pocztowy itp. Jeśli to możliwe, interfejs API powinien być w stanie wyświetlać adres na mapa z powrotem do użytkownika, aby zmniejszyć ryzyko wprowadzenia niekompletnego lub niewłaściwego adresu: większość użytkowników wie, gdzie mieszkają, a zobaczenie innej pozycji na mapie dałoby od razu wskazówkę, że powinni sprawdzić swój wkład.
Pamiętaj, że bez względu na to, jakiego interfejsu API używasz, nie będzie on idealny. Znajduje większość adresów, ale nie wszystkie. Oznacza to, że jeśli interfejs API mówi, że adres nie istnieje, ale użytkownik nalega, aby tak było, a priori należy mu ufać, nawet jeśli może się mylić.
Oznacza to również, że nadal powinieneś przechowywać dane oryginalnego użytkownika, obok wyników API. Oznacza to, że schemat staje się:
[RawAddress] nvarchar(max) not null
[ParsedAddress] xml null