Il modo universale per memorizzare un indirizzo / posizione geografica in un database è questo:
[Address] nvarchar(max) not null
Ciò richiede la minor quantità di codice di programmazione (e quindi riduce i costi di manutenzione) ed è completamente compatibile con qualsiasi indirizzo. Ha, tuttavia, tre grandi problemi:
-
La mancanza di convalida dei dati indica 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 tuo database inserendo 2 GB di dati nel campo dell'indirizzo.
-
I dati memorizzati in questo modo rendono impossibile l'elaborazione per scopi di business intelligence e data mining. Ad esempio, quanti utenti provengono dall'India? Non c'è un modo semplice per dirlo, dal momento che quegli indirizzi non saranno normalizzati.
-
Gli utenti potrebbero erroneamente inserire un indirizzo incompleto o chiaramente errato.
Per mitigare il primo problema, limita il campo a ciò che ritieni sia un limite ragionevole. Personalmente, vorrei iniziare con 1000 caratteri e quindi 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 per l'utente per ridurre il rischio per l'utente di inserire un indirizzo incompleto o errato: la maggior parte degli utenti sa dove vive e vedere una posizione diversa su una mappa darebbe loro immediatamente l'idea che dovrebbero controllare la loro ingresso.
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 lo fa, dovresti a priori fidarti dell'utente, anche se potrebbe essere sbagliato.
Questo significa anche che dovresti comunque memorizzare l'input dell'utente originale, affiancato al risultato dell'API. Ciò significa che lo schema diventa:
[RawAddress] nvarchar(max) not null
[ParsedAddress] xml null