Các phương pháp hay nhất để lưu trữ địa chỉ bưu điện trong cơ sở dữ liệu (RDBMS)?


106

Có bất kỳ tài liệu tham khảo tốt nào về các phương pháp hay nhất để lưu trữ địa chỉ bưu điện trong RDBMS không? Có vẻ như có rất nhiều sự cân bằng có thể được thực hiện và rất nhiều ưu và nhược điểm cho mỗi thứ cần được đánh giá - chắc chắn điều này đã được thực hiện hết lần này đến lần khác? Có lẽ ai đó đã viết ít nhất thực hiện một số bài học kinh nghiệm ở đâu đó?

Ví dụ về sự cân bằng mà tôi đang nói đến là lưu trữ mã zipcode dưới dạng số nguyên so với trường char, số nhà nên được lưu trữ dưới dạng trường riêng biệt hoặc một phần của dòng địa chỉ 1, số suite / căn hộ / v.v. có được chuẩn hóa hay chỉ được lưu trữ dưới dạng đoạn văn bản trong dòng địa chỉ 2, làm thế nào để bạn xử lý zip +4 (các trường riêng biệt hoặc một trường lớn, số nguyên so với văn bản)? Vân vân.

Tôi chủ yếu quan tâm đến các địa chỉ ở Hoa Kỳ vào thời điểm này nhưng tôi tưởng tượng có một số phương pháp hay nhất liên quan đến việc chuẩn bị cho bản thân trước tình huống phát triển ra toàn cầu (ví dụ: đặt tên các trường một cách thích hợp như vùng thay vì tiểu bang hoặc mã bưu điện thay vì mã zip, Vân vân.


3
Ngay bên ngoài mã zip phải là trường ký tự - nếu không, một số mã zip nhất định bắt đầu bằng 0 sẽ trở nên không chính xác.
Menasheh

1
Theo quy tắc chung, khi bạn cần làm các phép tính toán học với một số, nó phải là số nguyên. Nếu bạn chỉ hiển thị nó, nó phải là char (điện thoại, mã zip, vv)
Zikato

Câu trả lời:


37

Để sử dụng quốc tế nhiều hơn, một lược đồ cần xem xét là lược đồ được sử dụng bởi Trường địa chỉ Drupal . Nó dựa trên tiêu chuẩn xNAL và dường như bao gồm hầu hết các trường hợp quốc tế. Đào sâu một chút vào mô-đun đó sẽ tiết lộ một số viên ngọc trai tốt để diễn giải và xác thực địa chỉ trên phạm vi quốc tế. Nó cũng có một loạt các khu vực hành chính (tỉnh, bang, oblast, v.v.) với mã ISO.

Đây là ý chính của lược đồ, được sao chép từ trang mô-đun:

country => Country (always required, 2 character ISO code)
name_line => Full name (default name entry)
first_name => First name
last_name => Last name
organisation_name => Company
administrative_area => State / Province / Region (ISO code when available)
sub_administrative_area => County / District (unused)
locality => City / Town
dependent_locality => Dependent locality (unused)
postal_code => Postal code / ZIP Code
thoroughfare => Street address
premise => Apartment, Suite, Box number, etc.
sub_premise => Sub premise (unused)

Một bài học tôi đã học được:

  • Đừng lưu trữ bất cứ thứ gì ở dạng số.
  • Lưu trữ quốc gia và khu vực hành chính dưới dạng mã ISO nếu có thể.
  • Khi bạn không biết, hãy lỏng lẻo trong việc yêu cầu các trường. Một số quốc gia có thể không sử dụng các trường bạn cho là đương nhiên, ngay cả những thứ cơ bản như locality& thoroughfare.

1
Tôi có thể hỏi "dòng tên" dùng để làm gì không? Tôi thực sự không tìm thấy lời giải thích trong Tài liệu Drupal hoặc Tiêu chuẩn xNal. Tôi hiểu nó như thế nào thì tên_line là để gửi thư hoặc bưu kiện thực qua đường bưu điện. Các first_name / last_name chỉ cần thiết nếu bạn muốn giải quyết cho khách hàng trực tiếp, ví dụ như bằng email ( "Thưa Mister <last_name>"). Hay có mục đích / lợi ích nào khác cho nó không?
luba

Khi gửi đến các cơ sở thương mại (lớn), một cái tên thường cần thiết cho hệ thống gửi thư nội bộ (xem xét các tòa nhà văn phòng có phòng gửi thư)
Chris Browne

Trường Địa chỉ đã được thay thế bằng Địa chỉ . Có vẻ như các trường có thể hơi khác
Gavin Haynes

24

Là một người dùng 'quốc tế', không có gì khó chịu hơn việc phải đối mặt với một trang web chỉ xoay quanh các địa chỉ định dạng Hoa Kỳ. Thoạt đầu, nó hơi thô lỗ, nhưng sẽ trở thành một vấn đề nghiêm trọng khi việc xác nhận cũng quá sốt sắng.

Nếu bạn lo lắng về việc vươn ra toàn cầu, lời khuyên duy nhất mà tôi có là giữ mọi thứ ở dạng tự do. Các quốc gia khác nhau có những quy ước khác nhau - một số thì số nhà đứng trước tên đường, một số thì lại đứng sau. Một số có tiểu bang, một số khu vực, một số quận, một số kết hợp của chúng. Ở Vương quốc Anh, mã vùng không phải là mã vùng, mà là mã bưu điện chứa cả chữ cái và số.

Tôi chỉ khuyên đơn giản là ~ 10 dòng chuỗi có độ dài thay đổi, cùng với một trường riêng biệt cho mã bưu điện (và hãy cẩn thận cách bạn mô tả điều đó để đối phó với sự nhạy cảm của quốc gia). Hãy để người dùng / khách hàng quyết định cách viết địa chỉ của họ.


Đối với những gì nó đáng giá, đây không phải là một trang web, nhưng quan điểm về các địa chỉ quốc tế vẫn được coi trọng.
John

47
Mặc dù tôi không đồng ý với thông điệp và thực tế là tôi hoan nghênh bạn về lập trường của bạn, nhưng tôi đã phải từ chối bạn vì tôi ghét sự thật là một người dành phần lớn thời gian của mình để viết các công cụ để làm sạch dữ liệu địa chỉ lưu trữ dữ liệu địa chỉ ở định dạng biểu mẫu miễn phí. Địa chỉ có thể được định dạng khác nhau, nhưng phần lớn dữ liệu vẫn giống nhau. Việc số phố được hiển thị trước hay sau tên phố phần lớn không liên quan đến mục đích lưu trữ - chỉ dành cho mục đích hiển thị.
BenAlabaster


17

Bạn chắc chắn nên xem xét việc lưu trữ số nhà dưới dạng trường ký tự thay vì số, vì các trường hợp đặc biệt như "số nửa" hoặc địa chỉ hiện tại của tôi, giống như "129A" ​​- nhưng chữ A không được coi là căn hộ số cho các dịch vụ giao hàng.


11

Tôi đã làm điều này (mô hình hóa cấu trúc địa chỉ một cách chặt chẽ trong cơ sở dữ liệu) và tôi sẽ không bao giờ làm điều đó nữa. Bạn không thể tưởng tượng được mức độ điên rồ của các trường hợp ngoại lệ mà bạn sẽ phải tính đến như một quy tắc.

Tôi mơ hồ nhớ lại một số vấn đề với mã bưu chính của Na Uy (tôi nghĩ), có tất cả 4 vị trí, ngoại trừ Oslo, có 18 hoặc lâu hơn.

Tôi chắc chắn rằng kể từ thời điểm chúng tôi bắt đầu sử dụng mã ZIP chính xác về mặt địa lý cho tất cả các địa chỉ quốc gia của chúng tôi, khá nhiều người đã bắt đầu phàn nàn rằng thư của họ đến quá muộn. Hóa ra những người đó đang sống gần ranh giới giữa các khu vực bưu điện, và mặc dù thực tế là ai đó thực sự sống trong khu vực bưu điện, chẳng hạn như 1600, trên thực tế, thư của anh ta nên được gửi đến khu vực bưu điện 1610, bởi vì thực tế đó là khu vực bưu chính lân cận đó điều đó thực sự phục vụ anh ta, vì vậy việc gửi thư của anh ta đến đúng khu vực bưu chính của anh ta sẽ mất vài ngày nữa để đến nơi, do sự can thiệp không mong muốn được yêu cầu ở đúng bưu điện để chuyển nó đến khu vực bưu chính không chính xác ...

(Chúng tôi đã kết thúc việc đăng ký những người đó có địa chỉ ở nước ngoài trong nước với mã ISO 'ZZ'.)


8

Bạn chắc chắn nên tham khảo " Đây có phải là một cách tốt để lập mô hình thông tin địa chỉ trong cơ sở dữ liệu quan hệ ", nhưng câu hỏi của bạn không phải là bản sao trực tiếp của điều đó.

Chắc chắn có rất nhiều câu trả lời đã có từ trước (xem các mô hình dữ liệu mẫu tại DatabaseAnswers ). Nhiều câu trả lời tồn tại trước bị lỗi trong một số trường hợp (hoàn toàn không chọn các câu trả lời trên DB).

Một vấn đề chính cần xem xét là phạm vi của các địa chỉ. Nếu cơ sở dữ liệu của bạn phải xử lý các địa chỉ quốc tế, bạn phải linh hoạt hơn so với việc bạn chỉ phải xử lý các địa chỉ ở một quốc gia.

Theo quan điểm của tôi, thường (không có nghĩa là luôn luôn ) hợp lý khi vừa ghi lại 'hình ảnh nhãn địa chỉ' của địa chỉ và phân tích riêng nội dung. Điều này cho phép bạn giải quyết sự khác biệt giữa vị trí đặt mã bưu điện, chẳng hạn như giữa các quốc gia khác nhau. Chắc chắn, bạn có thể viết một trình phân tích và một công cụ định dạng để xử lý những điểm lập dị của các quốc gia khác nhau (ví dụ: địa chỉ Hoa Kỳ có 2 hoặc 3 dòng; ngược lại, địa chỉ Anh có thể có nhiều hơn đáng kể; một địa chỉ tôi viết cho định kỳ có 9 dòng). Nhưng có thể dễ dàng hơn nếu con người thực hiện phân tích và định dạng và để DBMS chỉ lưu trữ dữ liệu.


7

Trừ khi bạn định làm toán về số đường phố hoặc mã zip / mã bưu chính, bạn chỉ đang mời gọi những nỗi đau trong tương lai bằng cách lưu trữ chúng dưới dạng số.

Bạn có thể tiết kiệm một vài byte ở đây và ở đó, và có thể nhận được chỉ mục nhanh hơn, nhưng bạn sẽ làm gì khi bưu chính Hoa Kỳ, hoặc bất kỳ quốc gia nào khác mà bạn đang giao dịch, quyết định giới thiệu alphas vào mã?

Chi phí dung lượng ổ đĩa sẽ rẻ hơn rất nhiều so với chi phí sửa chữa nó sau này ... y2k ai?


7

Thêm vào những gì @ Jonathan Leffler và @ Paul Fisher đã nói

Nếu bạn từng dự đoán có thêm địa chỉ bưu điện cho Canada hoặc Mexico vào yêu cầu của mình, thì việc lưu trữ postal-codedưới dạng chuỗi là điều bắt buộc. Canada có các mã bưu chính gồm chữ và số và tôi không nhớ rõ Mexico trông như thế nào.


7

Ive nhận thấy rằng liệt kê tất cả các trường có thể có từ đơn vị rời rạc nhỏ nhất đến lớn nhất là cách dễ nhất. Người dùng sẽ điền vào các trường mà họ thấy phù hợp. Bảng địa chỉ của tôi trông như thế này:

*********************************
  Field              Type
*********************************
  address_id (PK)    int
  unit               string
  building           string        
  street             string
  city               string
  region             string
  country            string
  address_code       string
*********************************

Làm thế nào để bạn lưu trữ PO Box?
Jowen

chỉ cần thêm một PO_box cột Nếu bạn phải làm điều này truy, điều đó có nghĩa không trong những địa chỉ trước đó cần một PO Box, vì vậy nó có thể được thiết lập để null
Gaz_Edge

2

Đâu là "đánh đổi" trong việc lưu trữ ZIP dưới dạng NUMBER hoặc VARCHAR? Đó chỉ là một sự lựa chọn - nó không phải là sự đánh đổi trừ khi có lợi cho cả hai và bạn phải từ bỏ một số lợi ích để có được người khác.

Trừ khi tổng số các khóa kéo có bất kỳ ý nghĩa nào, các khóa kéo dưới dạng số không hữu ích.


Một sự cân bằng có thể là kích thước cơ sở dữ liệu. Trong mysql 5, một hàng mediumint sẽ chỉ chiếm 3 byte mỗi hàng trong khi một varchar (5) sẽ tốn gấp đôi. Tôi cũng nghĩ rằng các tìm kiếm số nhanh hơn tìm kiếm văn bản, nhưng tôi không tích cực về điều đó.
gpojd

4
người ta nên sử dụng một varchar. Mã bưu chính của Canada sử dụng bảng mã số chữ cái, mã này sẽ không khớp với một số.
EvilTeach

1
Mặc dù tôi hiểu logic "tương thích với chuyển tiếp" đằng sau việc sử dụng varchar theo nghĩa này, tuyên bố rằng "zip as number không hữu ích" hơi quá giáo điều. Nếu bạn biết rằng bạn sẽ làm việc với mã zip chỉ dành cho Hoa Kỳ, thì việc lưu trữ mã zip dưới dạng số nguyên là rất hợp lý, giống như khi viết bằng ngôn ngữ được nhập chính xác, bạn không định nghĩa mọi thứ là loại Chuỗi ... Nếu bạn biết nó sẽ là một số, tại sao không dựa vào việc kiểm tra kiểu của ngôn ngữ lập trình / DB và gọi nó là gì - một số nguyên?
rinogo

1
@rinogo một đối số để sử dụng varchar là mã zip không phải là số theo nghĩa toán học; không có ý nghĩa gì khi thực hiện cộng hoặc trừ chúng; chúng chỉ được mã hóa bằng một bộ ký tự hạn chế. stackoverflow.com/a/893489/48659
Steve Folly

1
@SteveFolly Và để hỗ trợ thêm cho mã Zip là chuỗi, các ký tự đứng đầu có ý nghĩa đặc biệt: en.wikipedia.org/wiki/ZIP_Code#Primary_state_prefixes Nếu một người sẽ triển khai logic như "các ký tự ngoài cùng bên trái của giá trị là gì ? " thì chắc chắn đó nghe giống một chuỗi hơn là một số nguyên.
David Aldridge

2

Đây có thể là một sự quá mức cần thiết, nhưng nếu bạn cần một giải pháp có thể hoạt động với nhiều quốc gia và bạn cần phải xử lý theo chương trình các phần của địa chỉ:

bạn có thể xử lý địa chỉ quốc gia cụ thể bằng cách sử dụng hai bảng: Một bảng chung với 10 cột VARCHAR2, 10 cột Số, một bảng khác ánh xạ các trường này tới lời nhắc và có một cột quốc gia liên kết cấu trúc địa chỉ với một quốc gia.


Tôi thực sự đã xem xét điều đó bản thân mình. Ngoài ra, hoặc có thể thay vì một bảng ánh xạ các cột tới lời nhắc dựa trên quốc gia, tôi đã nghĩ đến việc tạo các dạng xem có thể cập nhật cho từng định dạng địa chỉ cụ thể. Chưa bóp cò, nhưng đã nghĩ về nó.
Andrew Steitz,

1

Nếu bạn phải xác minh một địa chỉ hoặc sử dụng nó để xử lý các khoản thanh toán bằng thẻ tín dụng, ít nhất bạn sẽ cần một cấu trúc nhỏ. Một khối văn bản dạng tự do không hoạt động tốt cho điều đó.

Mã zip là trường tùy chọn phổ biến để xác thực các giao dịch thẻ thanh toán mà không cần sử dụng toàn bộ địa chỉ. Vì vậy, hãy có một trường riêng biệt và có kích thước rộng rãi cho trường đó (ít nhất 10 ký tự).



-2

Tôi sẽ chỉ đặt tất cả các trường lại với nhau trong một trường NVARCHAR (1000) lớn, với một phần tử textarea để người dùng nhập giá trị cho (trừ khi bạn muốn thực hiện phân tích trên mã zip). Tất cả những đầu vào dòng địa chỉ 1, dòng địa chỉ 2, v.v. thật khó chịu nếu bạn có địa chỉ không phù hợp với định dạng đó (và bạn biết đấy, có những quốc gia khác ngoài Hoa Kỳ).


3
Thật là một ý tưởng kinh khủng! Không có đủ chỗ trong "Nhận xét" để mô tả cơn ác mộng mà điều này mời gọi. Tốt hơn nên dành thêm một chút thời gian để thiết kế nó đúng cách hơn là cố gắng gỡ rối sau đó. Hãy xem câu trả lời của Samm Cooper. Tôi nghĩ rằng tôi đã chỉ bỏ phiếu cho một câu trả lời khác ở đây trên SO, nhưng câu trả lời này chắc chắn đã giành được một phiếu bầu không tốt từ tôi.
Andrew Steitz

Lộn xộn nào? Bạn cần dữ liệu để làm gì? Thường thì bạn chỉ cần chuyển nó trực tiếp đến một số máy in nhãn hoặc tương tự, và sau đó bạn có thể coi nó như một mảng văn bản. Vào những thời điểm khác, bạn có thể quan tâm đến các thành phố và mã zip (nhưng tốt hơn hết bạn nên đảm bảo rằng bạn chỉ có khách hàng ở các quốc gia được hỗ trợ)
erikkallen

2
OP không đề cập đến việc "chỉ cần chuyển nó cho máy in nhãn" và trong mọi công việc mà tôi từng làm, chúng tôi đã sử dụng địa chỉ làm "dữ liệu", chạy báo cáo, thu thuế (thuế bán hàng Colorado đối với các thiết bị được đưa vào một ngôi nhà mới thay đổi từ bên này sang bên kia của con phố), chỉ định khách hàng tiềm năng cho những người bán hàng, đáp ứng các yêu cầu tuân thủ của chính phủ, danh sách tiếp tục lặp lại. "Phá hủy" dữ liệu (bằng cách trộn các mục riêng biệt vào một trường hoặc không thu thập dữ liệu có sẵn) là một "tội lỗi" trong cuốn sách của tôi và luôn được chứng minh là cơn ác mộng mà tôi đã cảnh báo khi mọi người phớt lờ tôi.
Andrew Steitz

Nếu sau đó bạn phát hiện ra rằng bạn không cần một phần dữ liệu, bạn luôn có thể "hủy" nó sau. "Tạo" dữ liệu, từ ác mộng (tách thông tin thành các trường riêng biệt) đến không thể (thu thập dữ liệu sau khi thực tế). Nếu OP nói, "chỉ cần gửi nó đến máy in nhãn", tôi sẽ hoan nghênh và bỏ phiếu cho câu trả lời của bạn. Tuy nhiên, nếu không đề cập cụ thể về một điều gì đó tương tự như một gợi ý để "phá hủy" dữ liệu, IMO, sẽ đến bờ vực của sự vô trách nhiệm hoặc thậm chí có ý nghĩa.
Andrew Steitz

Nơi tôi đã làm việc (chủ yếu là thương mại điện tử), chúng tôi có xu hướng lưu trữ nó trong 5-6 lĩnh vực khác nhau, nhưng chúng tôi chưa bao giờ làm bất cứ điều gì với thông tin ngoài việc sử dụng nó để gửi đi giao hàng.
erikkallen
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.