Cách phổ biến để lưu trữ địa chỉ / vị trí địa lý trong cơ sở dữ liệu là gì? [đóng cửa]


25

Định dạng chính xác của địa chỉ / vị trí địa lý phù hợp với bất kỳ địa chỉ nào trên Trái đất? Hiện tại tôi có:

  • Quốc gia
  • thành phố
  • đường phố
  • con số
  • dữ liệu văn bản (để đơn giản)
  • khóa kéo
  • lat / lng

Nhưng tôi tin rằng tôi có thể cải thiện nó: có thể có một tiểu bang / khu vực của một quốc gia hoặc một cái gì đó giống như khu vực. Hoặc không có khu vực / khu vực / tiểu bang, giả sử, ở Singapore hoặc Hồng Kông.

Có thể không có đường, nhưng đường hay đại lộ hay thứ gì khác. Một số tòa nhà có thể là hợp chất. Có thể có một tầng. Một số phòng. V.v ...


11
Bạn cần giải thích cho ứng dụng nào, và ai đang cung cấp địa chỉ đó. Ví dụ: trên hầu hết các cửa hàng / trang web thương mại Web, tôi không nhập bất kỳ "vĩ độ / kinh độ" nào mà ngược lại là điều cần thiết cho ICBM (hoặc GPS). Ngoài ra, độ cao (và thời gian và ngày) rất quan trọng trong một số trường hợp (nghĩ về một số tàu trên biển, hoặc một số khách du lịch trên đỉnh Everest). Vì vậy, tôi không chắc chắn có bất kỳ câu trả lời phổ quát.
Basile Starynkevitch


6
@BasileStarynkevitch: Tôi nghĩ nó không quá quan trọng "cho ứng dụng gì", nhưng "cho trường hợp sử dụng (s)". Ví dụ, nếu trường hợp sử dụng là để đảm bảo các dịch vụ bưu chính trên toàn thế giới có thể gửi thư, tôi đoán câu hỏi này có thể được trả lời một cách hợp lý. Tuy nhiên, đối với trường hợp sử dụng này "lat / lng" sẽ không được yêu cầu.
Doc Brown

34
Tôi nghĩ định dạng phổ quát cho một địa chỉ là một Chuỗi.
Erik Eidt

12
Vấn đề bạn nêu ra rất đau đớn, đến nỗi một số công ty ngoài kia phát triển cách phổ biến của họ để giải quyết nó, ví dụ: what3words.com (nắm rõ cách ánh xạ tọa độ vị trí thành ba từ). Họ tuyên bố rằng "Với what3words, mọi người và mọi nơi hiện có một địa chỉ."
Roman Susi

Câu trả lời:


51

Google đã phát triển một thư viện giúp xác thực địa chỉ bưu chính cho mọi quốc gia trên thế giới mà bạn có thể sử dụng để thiết kế một lược đồ để lưu trữ dữ liệu này.

Tìm kiếm các trường bắt buộc phổ biến nhất trên các địa chỉ từ cơ sở khách hàng mục tiêu của bạn để bắt đầu và khi bạn xác định các quốc gia khác với các yêu cầu khác nhau, bạn có thể tiếp tục điều chỉnh lược đồ của mình.


5
+1 để nghiên cứu các giải pháp hiện có. Các Addresslớp từ Android SDK có thể là một nơi tốt để bắt đầu.
Kevin Krumwiede

4
Quét nhanh thư viện Google cho thấy rằng nó được xây dựng trên oocation-open.org/committees/ciq/doad.shtml
grahamj42

@ grahamj42, lol, trang đó rất hỏng.
Nakilon

41

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

Lưu ý: Ít nhất, bạn có thể lưu trữ quốc gia một cách riêng biệt, nếu điều này là cần thiết. Ví dụ: nó có thể được suy luận tự động từ trường địa chỉ, với tùy chọn cho người dùng thay đổi nó.
Matthieu M.

'sử dụng API' chỉ có nghĩa là ai đó đã có tất cả các định dạng chính thức của quốc gia. Không có lý do gì bạn không thể tự làm điều đó
Ewan

@Ewan Không có lý do ngoại trừ thời gian, tiền bạc, ngôn ngữ và các rào cản khác.
Andrew nói Phục hồi lại

chắc chắn, nhưng chúng tôi có cung cấp câu trả lời về cách làm công cụ hoặc so sánh giá cả của những người khác làm công cụ cho bạn không?
Ewan

@Ewan: câu hỏi là về định dạng lưu trữ của địa chỉ. API không đưa ra định dạng này: mục tiêu của câu trả lời của tôi là chỉ ra rằng ngay khi bạn có trường văn bản đơn giản và trường XML / JSON / bất cứ trường nào cho dữ liệu được phân tích cú pháp, bạn có thể lưu trữ xử lý thống kê một địa chỉ từ bất cứ đâu trên thế giới.
Arseni Mourzenko

37

Không có cái nào cả.

Mỗi quốc gia có định dạng địa chỉ khác nhau. Nếu bạn may mắn, và họ có một định dạng nào cả!

Rõ ràng vĩ độ / kinh độ sẽ cho bạn một điểm trên toàn cầu, nhưng nó không thực sự hữu ích để xác định các ngôi nhà riêng lẻ. Chỉ cần xem xét một khối tháp chẳng hạn.

Đặt cược tốt nhất của bạn là kiểm tra từng quốc gia dịch vụ bưu chính cho một định dạng chính thức. Điều này có thể là tuyệt vời cho cơ sở dữ liệu phụ trợ của bạn. Nhưng bạn có thể sẽ phải đơn giản hóa nó cho người dùng cuối vì nó sẽ chứa nhiều trường hơn hầu hết mọi người đã quen.

Ví dụ như Vương quốc Anh bao gồm những thứ như 'địa phương phụ thuộc kép', nhưng không ai biết điều đó có nghĩa gì nếu bạn hỏi họ.


3
Thật là một cách phổ quát ...........
Xwaro

40
@Xwaro Họ chỉ nói, Không có ai.
Zymus

6
Tôi đoán Xwaro có nghĩa là tôi đang giả sử địa chỉ trên trái đất.
Ewan

3
Đây là những nguồn chính thức cho các định dạng địa chỉ được in: Phổ Liên minh Bưu chính
grahamj42

3
hấp dẫn. Tôi nghĩ rằng đây là trang có liên quan: upu.int/en/activities/addressing/s42-st Chuẩn / Giả bạn có thể thấy cách A: chỉ một vài quốc gia và B: ánh xạ từ s42 sang định dạng địa chỉ quốc gia không 1 đến 1
Ewan

21

Định dạng phổ quát duy nhất là có một trường văn bản duy nhất có thể có nhiều dòng văn bản. Điều này sẽ cho phép bất kỳ địa chỉ có thể trên trái đất.


2
Tuyệt vời, bây giờ mọi người có thể mô tả cùng một địa chỉ theo một cách khác nhau, không tương thích. Tôi cho rằng câu hỏi đã không hỏi về tiêu chuẩn, vì vậy đây về mặt kỹ thuật là một câu trả lời đúng.
Michael

@ Michael: Địa chỉ khác nhau và không tương thích trên toàn thế giới. Có không có mẫu chuẩn. Có một trường nhiều dòng cho phép người dùng thực sự viết địa chỉ chính xác.
JacquesB

@Michael Các trường riêng biệt thường buộc tôi cắt bớt / viết tắt một lĩnh vực này hoặc lĩnh vực khác, điều này cũng dẫn đến các đại diện không nhất quán. (Vẫn hoạt động bình thường, dịch vụ bưu chính khá có kinh nghiệm về việc này).
Hulk


Chỉ là một mẩu tin thú vị, điều này không đúng về mặt kỹ thuật . Ở một số khu vực của các quốc gia, các phần của địa chỉ được vẽ dưới dạng hình ảnh.
Thuyền kayak

9

Tôi đã phát triển các giải pháp phần mềm được sử dụng ở nhiều nước. Chúng tôi giải quyết vấn đề này bằng cách bắt đầu với thực thể lớn hơn trước, tức là quốc gia sau đó có các trường xuống mức thấp nhất hoặc nhỏ nhất. Nó hoạt động tốt cho tất cả các quốc gia mà chúng tôi đã thử nghiệm cho đến nay. Chúng tôi cũng có một hệ thống ngăn ngừa trùng lặp thông minh và sáp nhập cho những người có cách nào đó có được trong hệ thống vì người dùng rất 'sáng tạo'. Trong phần quản trị, chúng tôi có thứ tự trường địa chỉ cho mỗi cài đặt quốc gia. tức là Nhật Bản có Mã bưu điện / Mã bưu điện trước tiên là Vương quốc Anh / Hoa Kỳ.

Nói chung, chúng tôi sử dụng:

  • Quốc gia
  • Mã / Mã bưu điện
  • Bang / Tỉnh / Tỉnh / Quận
  • Làng thị trấn
  • Đường / Đường / Khối
  • Tên tòa nhà / số
  • Thông tin cụ thể / tùy chỉnh

Sau khi nhập và lưu, một phiên bản liên hợp có thể được hiển thị mà không cần các trường.

Như tôi đã nói, điều này hoạt động cho tất cả những quốc gia chúng ta có phần mềm có phần mềm và là kết quả của sự phát triển từ năm 1989.

Hy vọng điều này sẽ giúp bằng cách nào đó hoặc ít nhất cung cấp một cái nhìn sâu sắc khác.


Làm thế nào để bạn đặt tên một cột trong db của bạn cho "Bang / Tỉnh / Tỉnh / Quận"?
Xwaro

6
@Xwaro Không thành vấn đề, hãy đặt tên cho nó bất cứ từ nào bạn cảm thấy các nhà phát triển của mình sẽ ít bị nhầm lẫn nhất. Điều này là do tên này là nội bộ cho phần mềm của bạn và người dùng sẽ không bao giờ nhìn thấy. Địa chỉ không bao giờ được hiển thị với tên của trường. Đó là, bạn không bao giờ nhìn thấy No 10 Street Downing Street, City Westminster, State London, Country UK. Thay vào đó bạn sẽ thấy10 Downing Street, Westminster, London, UK
slebetman

@slebetman Câu hỏi là: làm thế nào để bạn đặt tên một cột trong db của bạn cho "Bang / Tỉnh / Tỉnh / Quận"? Không phải "làm thế nào để bạn đề nghị tôi đặt tên một cột trong db của tôi cho" Bang / Tỉnh / Tỉnh / Quận "?
Dari

@Dari Không thành vấn đề, tôi đặt tên cho nó bất cứ từ nào tôi cảm thấy các nhà phát triển của mình sẽ ít bị nhầm lẫn nhất. Điều này là do tên này là nội bộ đối với phần mềm của tôi và người dùng sẽ không bao giờ nhìn thấy. Vì vậy, nó phụ thuộc vào những gì nhóm của tôi được sử dụng để.
slebetman

@slebetman - bạn đặt tên cho nó là gì?
Dari

0

Như đã nêu, phổ quát nhất (nhưng không thực tế để xác nhận và có lẽ ít hữu ích nhất) là một trường unicode lớn duy nhất.

Bạn có thể tách quốc gia khỏi phần còn lại của địa chỉ và lưu trữ dưới dạng mã quốc gia ISO. Nó sẽ bình thường hóa đất nước và cung cấp một số tiện ích trong việc xác nhận phần còn lại của địa chỉ.

Bạn cũng có thể tách mã bưu chính hay còn gọi là mã zip khỏi phần còn lại của địa chỉ. Điều này cũng sẽ có một số tiện ích trong việc xác nhận phần còn lại của địa chỉ và có thể hữu ích (mặc dù không chính xác) trong định vị địa lý. Ví dụ: ở Canada, bạn có thể xác định duy nhất bất kỳ địa chỉ nào chỉ định mã bưu chính và số đường phố (còn gọi là số nhà); điều này có thể không đúng ở tất cả các nước

Dành các lĩnh vực cho các tiểu bang / tỉnh hoặc thành phố bắt đầu gặp nhiều vấn đề hơn do sự khác biệt trong cách mỗi quốc gia hình thành một địa chỉ. Tôi đã thiết lập các bảng địa chỉ có các trường như vậy vì đối tượng ban đầu tập trung vào Bắc Mỹ, biết rằng khán giả quốc tế sẽ gây ra vấn đề phù hợp. Trong hầu hết các trường hợp, họ có thể bị "cắm sừng", nhưng đó là một lúng túng và có khả năng thỏa hiệp dễ thất bại - chắc chắn không phải là phổ quát.


0

Trái với câu trả lời của Mitchdav, tôi sẽ khuyên bạn không nên sử dụng thư viện của Google. Tôi đã tìm kiếm kho lưu trữ cho các địa điểm quốc tế khác nhau với các sơ đồ địa chỉ không chính thống với hy vọng tìm thấy dữ liệu thử nghiệm đơn vị, nhưng đáng lo ngại là tôi không tìm thấy lượt truy cập nào trong toàn bộ kho lưu trữ.

Tôi nghĩ rằng đặt cược tốt nhất của bạn là coi một địa chỉ là văn bản nhiều dòng tự do. Thật tệ khi bạn có thể không thể xác thực tất cả các địa chỉ, nhưng một số định dạng địa chỉ thực sự kỳ lạ và có thể không dự đoán được và cuối cùng, trách nhiệm điền địa chỉ chính xác thuộc về người dùng và trong hầu hết các ứng dụng, người dùng phải chịu bất kỳ hậu quả tiêu cực nào trong việc điền vào Địa chỉ không hợp lệ.

Bạn có thể, có thể, sử dụng trình xác nhận để đưa ra cảnh báo , nhưng không có gì hơn thế. Nhưng đừng từ chối các địa chỉ không xác thực, vì nếu không, bạn có thể mất một số khách hàng. Điều này dẫn đến câu hỏi làm thế nào để truyền đạt cảnh báo đến người dùng theo cách nó sẽ truyền đạt điều đó, nếu người dùng sống trong một khu vực có định dạng địa chỉ lạ, có thể bỏ qua cảnh báo ...


-1

Như bạn nói bất kỳ địa chỉ nào trên trái đất chỉ có lat lat hoặc ...

https://what3words.com

3 từ, là một thuật toán (không phải là cơ sở dữ liệu để có thể nhúng vào bất cứ thứ gì) có thể xác định một bản vá 3x3 mét ở bất cứ đâu trên Trái đất.

Tonga và một vài tiểu bang khác đã sử dụng nó làm hệ thống mã bưu điện của họ, trong khi nó sẽ không thay thế nó như một lớp phủ khá tuyệt, và được xây dựng và suy nghĩ rất tốt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.