Il modo universale per memorizzare un indirizzo / posizione geografica in un database è questo:
[Address] nvarchar(max) not null
Ciò richiede la minima quantità di codice di programmazione (e quindi riduce i costi di manutenzione) ed è pienamente compatibile con qualsiasi indirizzo. Ha, tuttavia, tre grandi problemi:
La mancanza di convalida dei dati significa che il campo può essere utilizzato per scopi diversi dalla memorizzazione dell'indirizzo. Uno degli scopi è un attacco DOS destinato a riempire lo spazio del database immettendo 2 GB di dati nel campo dell'indirizzo.
I dati memorizzati in questo modo rendono impossibile elaborarli per scopi di business intelligence e data mining. Ad esempio, quanti utenti provengono dall'India? Non esiste un modo semplice per dirlo, dal momento che tali indirizzi non saranno normalizzati.
Gli utenti possono inserire erroneamente un indirizzo incompleto o chiaramente sbagliato.
Per mitigare il primo problema, limita il campo a quello che ritieni sia un limite ragionevole. Personalmente, inizierei con 1000 caratteri, per poi ridurlo in base alla lunghezza degli indirizzi inseriti dai primi utenti una volta ottenuto un set di dati abbastanza grande.
Per mitigare gli altri due problemi, puoi utilizzare un'API di terze parti che analizza gli indirizzi e ti presenta i dati contenenti il paese, la città, il codice postale, ecc. Se possibile, l'API dovrebbe essere in grado di visualizzare l'indirizzo su una mappa di ritorno all'utente per ridurre il rischio per l'utente di inserire un indirizzo incompleto o errato: la maggior parte degli utenti sa dove vivono e vedere una posizione diversa su una mappa darebbe loro immediatamente un indizio che dovrebbero controllare il loro input.
Nota che qualunque API tu usi, non sarà perfetta. Troverà la maggior parte degli indirizzi, ma non tutti. Ciò significa che se l'API dice che l'indirizzo non esiste, ma l'utente insiste che sia così, dovresti fidarti a priori dell'utente, anche se potrebbe sbagliarsi.
Ciò significa anche che è comunque necessario memorizzare l'input dell'utente originale, fianco a fianco con il risultato dell'API. Ciò significa che lo schema diventa:
[RawAddress] nvarchar(max) not null
[ParsedAddress] xml null