2008-09-24 165 views
23

是否有任何最佳實踐(或甚至是標準)以一致且全面的方式在數據庫中存儲地址?數據庫中一致且全面地址存儲的最佳實踐

更具體地講,我認爲在這個階段,有兩種情況地址存儲:

  • 你只需要一個地址,一個人,一個建築物或任何項目(最常見的情況相關聯)。然後,一個帶有文本列(地址1,地址2,郵編,城市)的平坦表可能就足夠了。這並非我所感興趣的情況。
  • 您想要對您的地址進行統計:特定街道或城市中有多少物品或......然後,您要避免任何類型的拼寫錯誤,並確保一致性。我的問題是關於這個特定情況下的最佳實踐:建立一致的地址數據庫的最佳方法是什麼?

國家特定設計/解決方案將是一個很好的開始。

答案:似乎有不存在一個完美的答案,這個問題還沒有,但是:

  • xAL,爲suggested by Hank,是最接近的全球標準彈出。這似乎是一個相當大的矯枉過正,但我​​不知道很多人會想要在他們的數據庫中實現它...
  • 要開始自己的設計(對於特定的國家),Dave's linkUniversal Postal Union(萬國郵聯)網站是一個非常好的起點。
  • 至於法國,地址有一個規範(非官方的,但事實上的標準),它的可愛名稱爲AFNOR XP Z10-011(僅限法語),必須付費。法國的UPU描述基於這一規範。
  • 我碰巧找到了瑞典的等效標準:SS 613401
  • 在歐洲一級,已經做出了一些努力,導致標準EN 14142-1。它可以通過CEN national members獲得。
+0

在哪個國家/地區?地址格式和組成在不同國家之間差異很大。如果你只處理一個國家的話,那麼這個模型比你想以結構化方式存儲來自任何國家的地址要簡單得多...... – KristoferA 2008-09-24 09:34:07

+0

法國將是完美的;-)你是對的:單一國家地址(美國將是最常見的,我相信)將是一個很好的起點。 – Mac 2008-09-24 09:45:58

回答

3

我會用一個Address表,如你所說,我想它的基礎上通過xAL跟蹤的數據。

0

正常化您的數據庫模式,您將擁有完美的結構以保證正確的一致性。這是爲什麼: http://weblogs.sqlteam.com/mladenp/archive/2008/09/17/Normalization-for-databases-is-like-Dependency-Injection-for-code.aspx

+0

是的,但是您是否知道這樣的數據庫已經得到驗證的設計/規範化,還是每個人都必須重新創造我認爲是非常常用的輪子? – Mac 2008-09-24 09:53:27

+0

你可以谷歌的地址設計。但通常的設計取決於您的業務需求。不是所有的人都需要同一個模型。 – Mladen 2008-09-24 14:23:32

1

在英國有一個叫PAF from Royal Mail

產品這給你每個地址的唯一關鍵 - 有箍通過跳,雖然。

1

我主要看2種選擇,如果你想一致性:

  1. 數據清理
  2. 基本數據表看UPS

廣告1。我使用SAS系統,SAS Institute提供數據清理工具 - 基本上對您的數據進行一些檢查和驗證,並建議將「Abram Lincoln Road」和「Abraham Lincoln Road」合併到同一條街道。我也認爲它利用了包含城市郵政編碼匹配等的國家數據庫。

廣告2.您建立了一個多選列表(即基本數據),並且添加新條目的人可以從您的基本數據中的現有條目中選擇。在您的事實表中,您將密鑰存儲爲街道名稱,而不是街道名稱本身。如果您檢測到拼寫錯誤,則只需在基本數據中對其進行更正,並通過關鍵關係修正所有實例。

請注意,這些選項不排除對方,您可以同時使用這兩種方法。

0

在美國,我建議選擇一個國家地址變更供應商並在他們返回之後對DB進行建模。

28

我一直在考慮這個問題。以下是我迄今爲止的一些想法,我想知道別人怎麼想。

谷歌和雅虎的地理編碼服務都使用xAL(及其姐妹,包括個人名稱,XNAL),這給了它一定的權重。但是由於可以用許多不同的方式在xAL中描述相同的地址 - 一些比其他地方更具體 - 然後我沒有看到xAL本身是如何用於數據存儲的可接受的格式。它的一些字段名稱可以使用,然而,但在現實中,可以在16個國家中使用的基本格式,我公司船舶如下:

 

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 
} 
 

這是很容易映射到一個單一的數據庫表,只允許大多數列的NULL。亞馬遜和許多組織實際上存儲地址數據似乎就是這樣。所以現在仍然存在的問題是,我應該如何在一個容易被程序員和任何GUI代碼使用的對象模型中對它進行建模。我們是否有一個基地Address類型與每類地址的子類,如AmericanAddress,CanadianAddress,GermanAddress,等等?這些地址類型中的每一個都知道如何格式化自己,並且可以選擇知道一些關於字段驗證的信息。

他們還可以返回一些類型的元數據的關於每個字段,如下面的僞數據結構:

 

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 
} 
 

事實上,而不是每個國家單獨的地址對象,我們可以採取讓一個Address避免的對象稍微少一些面向對象的方法。NET特性和用途的AddressStrategy以確定的格式和驗證規則:

 

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) 
} 
 

當設置一個字段,即Address對象將援引其內部AddressStrategy對象上的適當的方法。

使用SetField()方法方法而不是使用getter和setter屬性的原因是,代碼更容易以通用方式實際設置這些字段,而無需使用反射或切換語句。

你能想象的過程會是這樣的:

  1. GUI代碼調用工廠方法或一些這樣的創建基於一個國家的地址。 (然後,國家/地區下拉菜單是客戶選擇的第一項內容,或根據文化信息或IP地址爲他們預先選好的猜測)。
  2. GUI調用address.GetMetadata()或類似的方法,並接收如上所述的AddressFieldMetadata結構。它可以使用此元數據來確定要顯示哪些字段(忽略is-applicable設置爲false),標記這些字段的內容(使用field-name成員),按特定順序顯示這些字段,以及執行粗略的表示級驗證該數據(使用is-requiredvalidation-regexallowed-values成員)。
  3. GUI使用field-number(對應於上面的枚舉)及其給定值調用address.SetField()方法。然後Address對象或其策略可以在這些領域進行一些先進的地址驗證,調用地址清潔工等

可能有上述的微小變化,如果我們想使Address對象本身表現得像一個不變對象一旦創建。 (我可能會這樣做,因爲Address對象實際上更像是一個數據結構,並且可能永遠不會有與其本身相關的任何真實行爲。)

這是否有任何意義?我偏離OOP路徑太遠了嗎?對我而言,這是一個非常明智的折衷辦法,因爲這樣抽象,實現幾乎是不可能的(xAL),而不是嚴格偏向於美國。


更新2年後:我終於結束了一個類似的系統,並在my defunct blog寫它。

我覺得這個解決方案是傳統數據和關係數據存儲之間的平衡點,至少在電子商務領域是這樣。

0

地址問題的1%是它們的格式:足夠正確標記和排序所需大小的字段。 99%是他們的內容:無效的數字,拼寫錯誤,縮寫和拼寫錯誤,缺失或多餘的單詞等等。不要擔心1%(在任何時候很容易改變),直到您控制了99%。

www.upu.int具有國際地址的格式標準。 usps.com上的出版物28具有美國格式標準。 CASS軟件如http://semaphorecorp.com對美國地址進行驗證。

1

「XAL是最接近的一個全球性的標準彈出。這似乎是相當矯枉過正,雖然,我不知道很多人會想實現它在他們的數據庫......」

這不是一個相關的論點。如果系統需要「全面和一致」(即全球),則實現地址並非輕而易舉的任務。實施這樣一個標準確實很耗時,但是爲了滿足特定的要求仍然是強制性的。