Универсальный способ сохранить географический адрес / местоположение в базе данных:
[Address] nvarchar(max) not null
Это требует наименьшего количества программного кода (и, следовательно, сокращает расходы на обслуживание) и полностью совместимо с любым адресом. Однако у него есть три большие проблемы:
Отсутствие проверки данных означает, что это поле можно использовать не для хранения адреса, а для других целей. Одной из целей является атака DOS, предназначенная для заполнения пространства вашей базы данных путем ввода 2 ГБ данных в поле адреса.
Данные, хранящиеся таким образом, делают невозможным их обработку в целях бизнес-аналитики и анализа данных. Например, сколько пользователей из Индии? Нет простого способа узнать, так как эти адреса не будут нормализованы.
Пользователи могут по ошибке ввести неполный или явно неправильный адрес.
Чтобы смягчить первую проблему, ограничьте поле тем, что вы считаете разумным. Лично я начну с 1000 символов, а затем уменьшу ее в зависимости от длины адресов, введенных первыми пользователями, когда вы получите достаточно большой набор данных.
Чтобы смягчить другие две проблемы, вы можете использовать сторонний API, который анализирует адреса и предоставляет вам данные, содержащие страну, город, почтовый индекс и т. Д. Если возможно, API должен иметь возможность отображать адрес на карту, возвращаемую пользователю, чтобы снизить риск для пользователя ввести неполный или неправильный адрес: большинство пользователей знают, где они живут, и, видя другую позицию на карте, сразу же даст им подсказку, что они должны проверить свои данные.
Обратите внимание, что какой бы API вы ни использовали, он не будет идеальным. Он найдет большинство адресов, но не все из них. Это означает, что если API сообщает, что адрес не существует, но пользователь настаивает на том, что он существует, вам следует априори доверять пользователю, даже если он ошибается.
Это также означает, что вы все равно должны хранить исходные данные пользователя, параллельно с результатами API. Это означает, что схема становится:
[RawAddress] nvarchar(max) not null
[ParsedAddress] xml null