Cách phổ biến để lưu trữ địa chỉ / vị trí địa lý trong cơ sở dữ liệu là cách này:
[Address] nvarchar(max) not null
Điều này đòi hỏi số lượng mã lập trình ít nhất (và do đó cắt giảm chi phí bảo trì) và hoàn toàn tương thích với bất kỳ địa chỉ nào. Tuy nhiên, nó có ba vấn đề lớn:
Việc thiếu xác thực dữ liệu có nghĩa là trường có thể được sử dụng cho các mục đích khác ngoài việc lưu trữ địa chỉ. Một trong những mục đích là một cuộc tấn công DOS nhằm lấp đầy không gian cơ sở dữ liệu của bạn bằng cách nhập 2 GB dữ liệu vào trường địa chỉ.
Dữ liệu được lưu trữ theo cách này làm cho nó không thể xử lý nó cho mục đích khai thác dữ liệu và thông minh kinh doanh. Chẳng hạn, có bao nhiêu người dùng đến từ Ấn Độ? Không có cách nào dễ dàng để nói, vì những địa chỉ đó sẽ không được bình thường hóa.
Người dùng có thể nhập nhầm địa chỉ không đầy đủ hoặc hoàn toàn sai.
Để giảm thiểu vấn đề đầu tiên, hãy giới hạn trường theo những gì bạn cho là giới hạn hợp lý. Cá nhân, tôi sẽ bắt đầu với 1000 ký tự, và sau đó giảm nó dựa trên độ dài của các địa chỉ được nhập bởi những người dùng đầu tiên sau khi bạn nhận được một bộ dữ liệu đủ lớn.
Để giảm thiểu hai vấn đề khác, bạn có thể sử dụng API của bên thứ ba để phân tích địa chỉ và cung cấp cho bạn dữ liệu chứa quốc gia, thành phố, mã bưu chính, v.v. Nếu có thể, API sẽ có thể hiển thị địa chỉ trên một bản đồ trở lại cho người dùng để giảm rủi ro cho người dùng nhập địa chỉ không đầy đủ hoặc sai: hầu hết người dùng biết nơi họ sống và nhìn thấy một vị trí khác trên bản đồ sẽ ngay lập tức cung cấp cho họ manh mối rằng họ nên kiểm tra đầu vào của họ.
Lưu ý rằng bất kỳ API nào bạn sử dụng, nó sẽ không hoàn hảo. Nó sẽ tìm thấy hầu hết các địa chỉ, nhưng không phải tất cả chúng. Điều này có nghĩa rằng nếu API nói rằng địa chỉ không tồn tại, nhưng người dùng khẳng định rằng nó không, bạn nên một tiên nghiệm lòng tin của người dùng, ngay cả khi ông có thể sai.
Điều này cũng có nghĩa là bạn vẫn nên lưu trữ đầu vào của người dùng ban đầu, song song với kết quả của API. Điều này có nghĩa là lược đồ trở thành:
[RawAddress] nvarchar(max) not null
[ParsedAddress] xml null