La forma universal de almacenar una dirección / ubicación geográfica en una base de datos es esta:
[Address] nvarchar(max) not null
Esto requiere la menor cantidad de código de programación (y así reduce los costos de mantenimiento) y es totalmente compatible con cualquier dirección. Sin embargo, tiene tres grandes problemas:
La falta de validación de datos significa que el campo se puede utilizar para fines distintos al almacenamiento de la dirección. Uno de los propósitos es un ataque de DOS destinado a llenar el espacio de su base de datos al ingresar 2 GB de datos en el campo de dirección.
Los datos almacenados de esta manera hacen que sea imposible procesarlos para fines de inteligencia empresarial y minería de datos. Por ejemplo, ¿cuántos usuarios son de la India? No hay una manera fácil de saberlo, ya que esas direcciones no se normalizarán.
Los usuarios pueden ingresar por error una dirección incompleta o simplemente incorrecta.
Para mitigar el primer problema, limite el campo a lo que cree que es un límite razonable. Personalmente, comenzaría con 1000 caracteres y luego lo reduciría según la longitud de las direcciones ingresadas por los primeros usuarios una vez que obtenga un conjunto de datos lo suficientemente grande.
Para mitigar los otros dos problemas, puede utilizar una API de terceros que analiza las direcciones y le presenta los datos que contienen el país, la ciudad, el código postal, etc. Si es posible, la API debería poder mostrar la dirección en un mapa para el usuario para reducir el riesgo de que el usuario ingrese una dirección incompleta o incorrecta: la mayoría de los usuarios saben dónde viven, y ver una posición diferente en un mapa les daría inmediatamente una pista de que deberían verificar su entrada.
Tenga en cuenta que cualquier API que use, no será perfecta. Encontrará la mayoría de las direcciones, pero no todas. Esto significa que si la API le dice que la dirección no existe, pero el usuario insiste en que sí, debe confiar a priori en el usuario, incluso si puede estar equivocado.
Esto también significa que aún debe almacenar la entrada del usuario original, junto con el resultado de la API. Esto significa que el esquema se convierte en:
[RawAddress] nvarchar(max) not null
[ParsedAddress] xml null