2008-09-24 30 views
23

Có bất kỳ thực hành tốt nhất nào (hoặc thậm chí cả tiêu chuẩn) để lưu trữ địa chỉ một cách nhất quán và toàn diện trong cơ sở dữ liệu không?Thực hành tốt nhất để lưu trữ địa chỉ nhất quán và toàn diện trong cơ sở dữ liệu

Để cụ thể hơn, tôi tin rằng ở giai đoạn này là có hai trường hợp để lưu trữ địa chỉ:

  • bạn chỉ cần kết hợp một địa chỉ để một người, một tòa nhà hoặc bất kỳ mục nào (trường hợp phổ biến nhất). Sau đó, một bảng phẳng với các cột văn bản (address1, address2, zip, city) có lẽ là đủ. Đây không phải là trường hợp tôi quan tâm.
  • bạn muốn chạy thống kê về địa chỉ của mình: số lượng mặt hàng trong một đường phố cụ thể hoặc thành phố hoặc ... Sau đó bạn muốn tránh lỗi chính tả của bất kỳ loại nào và đảm bảo tính nhất quán . Câu hỏi của tôi là về các phương pháp hay nhất trong trường hợp cụ thể này: các cách tốt nhất để mô hình hóa một cơ sở dữ liệu địa chỉ nhất quán là gì?

Thiết kế/giải pháp cụ thể theo quốc gia sẽ là một khởi đầu tuyệt vời.

ĐÁP: Có dường như không tồn tại một câu trả lời hoàn hảo cho câu hỏi này, nhưng:

  • xAL, như suggested by Hank, là điều gần gũi nhất với một tiêu chuẩn toàn cầu mà popped lên. Nó có vẻ khá là quá mức cần thiết, và tôi không chắc chắn nhiều người muốn thực hiện nó trong cơ sở dữ liệu của họ ...
  • Để bắt đầu thiết kế của riêng mình (cho một quốc gia cụ thể), Dave's link đến trang web Universal Postal Union (UPU) là một điểm khởi đầu rất tốt.
  • Đối với Pháp, có một tiêu chuẩn (không chính thức, nhưng thực tế là tiêu chuẩn) cho địa chỉ, mang tên đáng yêu của AFNOR XP Z10-011 (chỉ bằng tiếng Pháp) và phải được thanh toán. Mô tả UPU cho Pháp dựa trên tiêu chuẩn này.
  • Tôi tình cờ tìm thấy tiêu chuẩn tương đương cho Thụy Điển: SS 613401.
  • Ở cấp độ châu Âu, một số nỗ lực đã được thực hiện, dẫn đến tiêu chuẩn EN 14142-1. Có thể truy cập thông qua CEN national members.
+0

Ở quốc gia/quốc gia nào? Định dạng và thành phần địa chỉ thay đổi rất nhiều giữa các quốc gia khác nhau. Nếu bạn chỉ giao dịch với một quốc gia, mô hình có thể đơn giản hơn nhiều nếu bạn muốn lưu trữ địa chỉ từ bất kỳ quốc gia nào theo cách có cấu trúc .... – KristoferA

+0

Pháp sẽ là hoàn hảo ;-) Bạn nói đúng: một quốc gia địa chỉ (Mỹ sẽ là phổ biến nhất, tôi tin) sẽ là một điểm khởi đầu tuyệt vời. – Mac

Trả lời

3

Tôi muốn sử dụng bảng Address, như bạn đã đề xuất và tôi sẽ dựa trên dữ liệu được theo dõi bởi xAL.

0

bình thường hóa giản đồ cơ sở dữ liệu của bạn và bạn sẽ có cấu trúc hoàn hảo cho tính nhất quán chính xác. và đây là lý do tại sao: http://weblogs.sqlteam.com/mladenp/archive/2008/09/17/Normalization-for-databases-is-like-Dependency-Injection-for-code.aspx

+0

Có, nhưng bạn có biết về một thiết kế/chuẩn hóa đã được chứng minh cho một cơ sở dữ liệu như vậy hay không, hay mọi người phải tái tạo lại những gì tôi tin là một bánh xe thường cần thiết? – Mac

+0

bạn cũng có thể google để thiết kế địa chỉ. nhưng thường thì thiết kế phụ thuộc vào nhu cầu kinh doanh của bạn. không phải tất cả chúng đều cần cùng một mô hình. – Mladen

1

Tại Anh có một sản phẩm gọi là PAF from Royal Mail

này mang đến cho bạn một khóa duy nhất cho mỗi địa chỉ - có hoops để nhảy qua, mặc dù.

+1

Có vấn đề với PAF vì nó chỉ chứa địa chỉ bài đăng được gửi. Tương đương khảo sát Ordnance (OSAPR) là lý thuyết cao hơn vì nó nên bao gồm tất cả các địa chỉ nhưng trong thực tế là dễ bị lỗi và không được cập nhật thường xuyên. Nhiều chính quyền địa phương kết thúc bằng hệ thống nội bộ của riêng họ – Cruachan

1

tôi về cơ bản thấy 2 lựa chọn nếu bạn muốn tính nhất quán:

  1. liệu sạch
  2. Basic bảng dữ liệu nhìn ups

rao 1.Tôi làm việc với hệ thống SAS và SAS Institute cung cấp công cụ dọn dẹp dữ liệu - về cơ bản thực hiện một số kiểm tra và xác thực trên dữ liệu của bạn, và gợi ý rằng "Abram Lincoln Road" và "Abraham Lincoln Road" được hợp nhất vào cùng một đường phố. Tôi cũng nghĩ rằng nó dựa trên các cơ sở dữ liệu quốc gia có chứa các thành phố-mã bưu chính phù hợp và như vậy.

Quảng cáo 2. Bạn tạo danh sách nhiều lựa chọn (tức là dữ liệu cơ bản) và mọi người thêm mục nhập mới sẽ chọn từ các mục nhập hiện có trong dữ liệu cơ bản của bạn. Trong bảng sự kiện của bạn, bạn lưu trữ khóa cho tên phố thay vì tên đường phố. Nếu bạn phát hiện lỗi chính tả, bạn chỉ sửa lỗi đó trong dữ liệu cơ bản của mình và tất cả các phiên bản đều được sửa với nó, thông qua quan hệ khóa.

Lưu ý rằng các tùy chọn này không loại trừ lẫn nhau, bạn có thể sử dụng cả hai phương pháp cùng một lúc.

0

Tôi đã hỏi một số điều khá giống trước đó: Dynamic contact information data/design pattern: Is this in any way feasible?.

Câu trả lời ngắn: Lưu trữ adderres hoặc bất kỳ loại thông tin liên hệ nào trong cơ sở dữ liệu phức tạp. Liên kết Ngôn ngữ Địa chỉ Mở rộng (xAL) ở trên có một số thông tin thú vị gần nhất với một tiêu chuẩn/thực tiễn tốt nhất mà tôi đã đạt được ...

0

Ở Hoa Kỳ, tôi khuyên bạn nên chọn Thay đổi Địa chỉ Quốc gia nhà cung cấp và mô hình hóa DB sau khi họ quay trở lại.

1

Các nhà chức trách về cách các địa chỉ được xây dựng nói chung là các dịch vụ bưu chính, vì vậy cho một sự khởi đầu tôi sẽ xem xét các yếu tố dữ liệu được sử dụng bởi các dịch vụ bưu chính cho các thị trường lớn bạn hoạt động trong.

Xem trang web của Universal Liên minh Bưu điện để có thông tin rất cụ thể và chi tiết về các định dạng địa chỉ bưu chính quốc tế: http://www.upu.int/post_code/en/postal_addressing_systems_member_countries.shtml

28

Tôi cũng đã nghĩ về điều này. Dưới đây là suy nghĩ của tôi cho đến nay, và tôi tự hỏi những gì người khác nghĩ.

xAL (và chị em của nó bao gồm tên cá nhân, XNAL) được cả dịch vụ mã hóa địa lý của Google và Yahoo sử dụng, cung cấp cho nó một số trọng lượng. Nhưng vì cùng một địa chỉ có thể được mô tả bằng xAL theo nhiều cách khác nhau - một số cụ thể hơn những cách khác - sau đó tôi không thấy cách chính xAL là định dạng được chấp nhận để lưu trữ dữ liệu. Một số tên trường của nó có thể được sử dụng, tuy nhiên, nhưng trong thực tế chỉ có định dạng cơ bản có thể được sử dụng trong 16 quốc gia mà tàu công ty của tôi để như sau:

 

enum address-fields 
{ 
    name, 
    company-name, 
    street-lines[], // up to 4 free-type street lines 
    county/sublocality, 
    city/town/district, 
    state/province/region/territory, 
    postal-code, 
    country 
} 
 

Đó là đủ dễ dàng để ánh xạ vào một đơn bảng cơ sở dữ liệu, chỉ cho phép NULL trên hầu hết các cột. Và có vẻ như đây là cách Amazon và rất nhiều tổ chức thực sự lưu trữ dữ liệu địa chỉ. Vì vậy, câu hỏi vẫn còn là làm thế nào tôi nên mô hình này trong một mô hình đối tượng được dễ dàng sử dụng bởi các lập trình viên và bởi bất kỳ mã GUI nào. Chúng tôi có loại cơ sở Address với các lớp con cho từng loại địa chỉ, chẳng hạn như AmericanAddress, CanadianAddress, GermanAddress, v.v.? Mỗi loại địa chỉ này sẽ biết cách tự định dạng và tùy ý sẽ biết một chút về xác thực các trường.

Họ cũng có thể trở lại một số loại siêu dữ liệu về mỗi lĩnh vực, chẳng hạn như cấu trúc dữ liệu giả sau đây:

 

structure address-field-metadata 
{ 
    field-number,  // corresponds to the enumeration above 
    field-index,  // the order in which the field is usually displayed 
    field-name,  // a "localized" name; US == "State", CA == "Province", etc 
    is-applicable, // whether or not the field is even looked at/valid 
    is-required,  // whether or not the field is required 
    validation-regex, // an optional regex to apply against the field 
    allowed-values[] // an optional array of specific values the field can be set to 
} 
 

Trong thực tế, thay vì có đối tượng địa chỉ cá nhân cho mỗi quốc gia, chúng ta có thể lấy cách tiếp cận hướng đối tượng hơi ít có đối tượng Address tránh được.NET tài sản và sử dụng một AddressStrategy để xác định định dạng và xác nhận quy tắc:

 

object address 
{ 
    set-field(field-number, field-value), 
    address-strategy 
} 

object address-strategy 
{ 
    validate-field(field-number, field-value), 
    cleanse-address(address), 
    format-address(address, formatting-options) 
} 
 

Khi thiết lập một lĩnh vực, đối tượng Address sẽ gọi phương thức thích hợp trên đối tượng AddressStrategy nội bộ của mình.

Lý do sử dụng phương pháp tiếp cận phương pháp SetField() thay vì thuộc tính với getters và setters là dễ dàng hơn để mã thực sự đặt các trường này theo cách tổng quát mà không cần phải phản ánh hoặc chuyển báo cáo.

Bạn có thể tưởng tượng quá trình này xảy ra một cái gì đó như thế này:

  1. GUI mã gọi một phương pháp nhà máy hoặc một số ví dụ để tạo ra một địa chỉ dựa trên một quốc gia. (Sự sụt giảm quốc gia, sau đó, là điều đầu tiên mà khách hàng lựa chọn, hoặc có một dự đoán tốt được lựa chọn trước cho họ dựa trên thông tin văn hóa hoặc địa chỉ IP.)
  2. GUI gọi address.GetMetadata() hoặc phương pháp tương tự và nhận danh sách các cấu trúc AddressFieldMetadata như mô tả ở trên. Nó có thể sử dụng siêu dữ liệu này để xác định những trường nào hiển thị (bỏ qua những trường có is-applicable được đặt thành false), để gắn nhãn các trường đó (sử dụng thành viên field-name), hiển thị các trường đó theo thứ tự cụ thể và thực hiện xác thực cấp độ trình bày dữ liệu đó (sử dụng các thành viên is-required, validation-regexallowed-values thành viên).
  3. GUI gọi phương thức address.SetField() bằng cách sử dụng field-number (tương ứng với điều tra ở trên) và các giá trị đã cho. Các đối tượng Address hay chiến lược của nó sau đó có thể thực hiện một số xác nhận địa chỉ tiên tiến trên các lĩnh vực này, gọi tẩy rửa địa chỉ, vv

Có thể có thay đổi nhỏ trên trên nếu chúng ta muốn làm cho đối tượng Address bản thân cư xử giống như một bất biến một khi nó được tạo ra. (Mà tôi có thể sẽ cố gắng làm, vì đối tượng Address thực sự giống một cấu trúc dữ liệu hơn, và có lẽ sẽ không bao giờ có bất kỳ hành vi thực sự nào liên kết với chính nó.)

Có bất kỳ điều này hợp lý không? Tôi có đi lạc quá xa con đường OOP không? Đối với tôi, điều này thể hiện một sự thỏa hiệp khá hợp lý giữa việc quá trừu tượng đến mức việc thực hiện là không thể xảy ra (xAL) so với việc hoàn toàn bị thiên vị.


Cập nhật 2 năm sau: tôi cuối cùng đã kết thúc với một hệ thống tương tự như sau và viết về nó ở my defunct blog.

Tôi cảm thấy giải pháp này là sự cân bằng hợp lý giữa dữ liệu cũ và lưu trữ dữ liệu quan hệ, ít nhất là cho thế giới thương mại điện tử.

+0

Liên kết blog của bạn là mã 410 "Đã qua". Bạn có liên kết được cập nhật không? –

+0

Cảm ơn, tôi đã cập nhật liên kết đến một bản sao lưu trữ –

0

1% vấn đề với địa chỉ là định dạng của chúng: đủ các trường được gắn nhãn và đặt hàng theo kích thước yêu cầu. 99% là nội dung của họ: số không hợp lệ, lỗi chính tả, viết tắt và lỗi chính tả, thiếu hoặc thừa từ, v.v. Đừng lo lắng về 1% (có thể dễ dàng thay đổi bất kỳ lúc nào) cho đến khi bạn kiểm soát 99%.

www.upu.int có tiêu chuẩn định dạng cho địa chỉ quốc tế. Ấn bản 28 tại usps.com có ​​các tiêu chuẩn định dạng của Hoa Kỳ. Phần mềm CASS như http://semaphorecorp.com không xác thực cho các địa chỉ ở Hoa Kỳ.

1

"xAl là điều gần gũi nhất với một tiêu chuẩn toàn cầu mà popped lên. Nó có vẻ là khá một overkill tuy nhiên, và tôi không chắc chắn nhiều người sẽ muốn thực hiện nó trong cơ sở dữ liệu của họ ..."

Đây không phải là một đối số có liên quan. Việc triển khai địa chỉ không phải là một nhiệm vụ tầm thường nếu hệ thống cần phải "toàn diện và nhất quán" (tức là trên toàn thế giới). Việc thực hiện một tiêu chuẩn như vậy thực sự là tốn thời gian, nhưng để đáp ứng các yêu cầu quy định, tuy nhiên bắt buộc.

Các vấn đề liên quan