13

假設您正在處理您的正常聯繫人數據庫(您知道...姓名,電話號碼,地址,電子郵件等)。如果你在本地認識這件事,通常不是一個大問題需要處理,但是當我們看到國際化的時候它就是這樣。正常化/驗證數據庫中的國際數據集?

看着電話號碼系統,你會認爲它很簡單,但實際上並非如此。在北美,我們通常有呼叫人的1-222-333-4444格式。 這當然被分解成您的國際撥號代碼,地區代碼,交換前綴和行號。問題:真實的電話號碼是有限的,在潛在的1000中美國大約有220個地區代碼,每個區號只有有限的交換次數,並且線路號僅限於該國家的特定用途(例如, 911的模式受到限制,只有10000箇中的3/4被使用)。把這個交給英國,他們有自己的一系列線路規則,比如預留大部分0300-0399區塊用於特定用途,以及其他限制。國際代碼也是有限的。規範區號,交換和將數據驗證檢查放入電話號碼變得複雜。我不會詳細討論我們何時進入不屬於NPA scheme的地方,但我們只需確定我們不能真正相信北美模板,踢回來,並在一天內打電話。

我們如何規範這樣的事情呢?我們如何驗證數據?我們如何處理這些看似特殊的擴展代碼或內部撥號指令?

International addresses沒有太大的好處,不僅數據保留的差異,而且輸出格式也不盡相同。在加拿大,我們如何處理國際郵政編碼,格式爲A1A1A1,美國有55555 [-4444]這樣的系統?

我很想在我遇到這些情況時爲每種情況編寫類,並將它們作爲XML/JSON /類似的方式存儲在數據庫中,但是如何關聯字段並輕鬆搜索我的內容?我不想最終爲每個國家創建數千張桌子。我想要一個可輕鬆擴展的解決方案,我可以規範我的地址並驗證內容。這太難以問了嗎?

+0

這真的很有趣的問題。您是否希望從存儲過程或觸發器中驗證這些數據,還是希望DB客戶端驗證它們? – 2010-11-05 13:20:58

+0

我有一種感覺,在實現中可能需要這些組合,但理論上我認爲存儲過程和觸發器可能是最佳選擇。 – Incognito 2010-11-05 17:27:29

回答

7

處理這個問題的方式可以是:

採用三種觀點的地址/電話號碼/ POST代碼等

  1. 第一種觀點是,地址(比如說)爲多行的的文字。

  2. 第二種觀點是地址標記(更多見下文)。

  3. 第三視圖是爲地址

所需要這種方法是用於驗證的通用過程(類/觸發)的其它部件的驗證規則;用於打印目的的格式化例程;和一個規則庫,以及一個管理員機制來更新驗證規則。即使它不符合規則庫中的任何規則,一個「catchall」規則表明這是一個有效的地址 - 它已經被手動驗證過。

組件: 1地址由多行組成,每行都有一個關聯的序列號和一些標記(通常爲一個)。它也可以與地址線相關聯,這是一組規則和它們經過驗證的規則版本,但這是一種改進,取決於您的更新/插入/計算速率。

2地址標籤就像城市;鎮;門牌號碼;並確定地址的不同行。有可能有一個沒有任何標籤的地址行,但在這種情況下,只有通用搜索(例如紐約)可能在整行行上。搜索「城市=紐約」)是不可能的。

3以域專用語言編寫的規則。這可能是正則表達式;一種特定於你的語言;你的正常開發語言(儘管這可能是最不實用的方法,因爲編程語言可能難以精確準確地表達我所談論的規則。代表性規則的一個例子可能是(處理你對美國郵遞區號) - 前五個字符必須是數字

前五個字符表示「區號」

郵政編碼必須是地址的最後一行

的。規則將被分成組和集(例如美國地址)規則必須能夠引用其他規則以及地址數據。

  1. 您的驗證例程需要佔用地址的行並將規則應用於它(通常通過設置)。它將返回一個布爾型的有效或無效地址,以及可選的驗證規則集。

  2. 打印例程將再次將相應的規則集(可能與驗證集不同)應用於地址數據以提供格式化的地址。

我希望其他組成部分是明顯的整體方法。

這種做法是爲了應對你的問題確定了這些問題:

  1. 的電話代碼分區。

  2. 正在使用的可能區號的數量有限。

  3. 爲特定目的保留的電話號碼塊。

  4. 數據標準化 - 數據被標準化。但是,除了數據倉庫軟件和包含大量實時傳感器信息的數據庫,通常不會使用這種標準化(反向索引)。在實施此解決方案時,您可能最終選擇(可控地)重複數據。這不是解決方案的固有部分,但可能很方便。

  5. 我強烈建議不要爲每個變體添加類 - 這不是可縮放的,也不可維護的。

  6. 搜索將在下面詳細介紹。

  7. 避免使用怪物表 - 規則庫很可能是實際數據之外的數百到數千條規則的順序。

  8. 該解決方案是可擴展的 - 只需添加或修改規則即可。

並且還處理一些相關的問題。

  1. 即使你可以將驗證規則地址的國家形式,總會有例外的標準爲特定國家。我自己的地址就是一個例子 - 我住在一條船上,並且需要我的地址中包含的其他信息,超出郵局標準地址。這種異常總是可能需要人工干預 - 因此人工干預可以接受這一規則。

  2. 不同的國家有不同的地址排列順序 - 例如中國的地址寫爲:國家;郵政編碼;市;城區;街道名稱;門牌號碼;人名。

  3. 接受您沒有規則的地區的第一個地址,並且國家的規則與您所記錄的地區不同。

  4. 希望使用(例如辦公室)地址與「他們的」地址不同的地址的人。

  5. 具體的個人解決問題 - 有人希望隱藏他們離他們最近和最親愛的信件。

  6. 該解決方案可以擴展到像問題 - 例如指一個人。這可能涉及標題 - Dr,Rev等;多重連字符(ffoulkes-symthe); (CPA,BSC等;以及家族資格(第三等);以及取決於人文化的多種命名模式(來自印度次大陸的人們通常沒有姓氏,並且每個人顯然會有不同的姓氏。)

  7. 變化解決規則(例如增加了一個新的發展的新郵編),可以方便,快捷地取得

問題仍然出現在:

  1. 搜索會更復雜一些需要搜索地址的所有行和相關標記而不是特定地址字段

  2. 建立此類規則庫需要時間 - 儘管初始規則加載可以相當快地完成 - 示例存在於您的問題 - 只有在處理了多個異常和異常後,纔會出現完整集合。

編輯:

我不知道的BigTable的時候,我寫我的迴應。在看了這篇文章之後,它似乎是一個非常相似的概念。至於在ACID開發中實現它,我認爲這對聯繫人數據集和規則數據庫是可能的。根據我的經驗,我知道它很容易在這樣的環境下輕鬆擴展到5 * 10^7套聯繫人詳細信息(儘管有背景,不需要時間關鍵的聯繫方式驗證)。

在考慮ACID/SQL的情況下,我對單詞「view」的使用可能已經開始了一個向我不打算的方向發展的兔子。一個更合適的詞可能是概述或展望(沒有關係模型或DBMS運費的東西)。事實上,我將把我稱之爲視圖的每一件事都視爲候選人桌。

我爲我的方法提供了一個草圖,以幫助討論。這個模式使用了一些M:N連接,這顯然會在一個實現中被標準化爲關聯表。這是留給讀者的練習:-)。我已將一些示例屬性和數據放入一些表中。

alt text

在草圖中,規則集的編輯;規則;並且與其他規則(管理應用程序)相關的規則顯然可以通過Address User上的SQL Normal CRUD操作使用ACID屬性完成;地址;和地址行可以同樣以ACID/SQL方式完成,將地址行作爲用戶的輸入。您可能希望對交易進行一些預處理,以從道路名稱中分離(在我的示例中)房屋號碼,並因此丟失「道路名稱」規則。其他可能有用的預處理是大寫的標準化 - 儘管這也可能是驗證步驟的一部分。也可以簡單地接受完整的「9 Richmond Road」作爲輸入,並將其標記爲「需要驗證」。在任何一種情況下,我都沒有問題(我知道)關於創建此事務ACID的問題。

我不太清楚的是驗證和後續標記如何結合到ACID/SQL事務中。看起來,要進行驗證步驟ACID,可能需要根據規則集對測試應用進行排序(首先測試最常見的情況,並在驗證成功時停止)。此外,爲了使交易ACID只針對最常見的情況進行驗證,可能有必要將其他標籤標記爲「需要驗證」,然後將其作爲後臺任務完成。

驗證的實際任務涉及檢查整個規則庫,按集合設置,直到找到一組驗證所有輸入行的規則。數據本身顯然有潛在的指導原則 - 如果您記錄了國家/地區,那麼這兩者都可以讓您立即在國家/地區標記該行,併爲必須測試的規則集提供過濾器。我很抱歉,但就目前來說,我可以採取這一方面。順便提一句,這個草圖模式只是部分走向了總歸一化。如圖所示,每個地址都有其自己的地址線序列,並且沒有超出各行的數據標準化作爲輸入(加或減您選擇執行的任何預處理)。有可能進一步採用這種方法 - 通過在地址和地址線M:N之間建立鏈接並確保地址線表的線域是其主鍵。

當談到這個概念更詳細的資源時,我有兩個問題。

第一個(也是微不足道的)一個是,這個概念是我的原創工作,基於我作爲方法顧問和IT策略顧問的20多年經驗,對開發環境技術和開發方法有着特別的興趣。我所有的工作生活都是在環境中度過的,環境中的聯繫方式一直是主要關注的問題(出於財務和法規/立法原因)。事實上,在我讀完你的問題之前,我對你的問題的原始回答在我的腦海中完成了,儘管它讓我花了四分之三個小時才完成。

更重要的原因是這個想法的一些來源是保密的或祕密的。在我的工作生涯中,我的部分工作涉及與技術發展保持同步,並預測十年後技術對業務的影響。這涉及訪問研究實驗室並與主要研究人員就各種主題進行討論。雖然我不是,我自己是一流的研究人員,但我似乎很擅長綜合其他人的研究成果。然而,在這樣做的時候,我總是在商業機密和/或軍事保密的條件下運營。我的答案都沒有違反這些條件。由於這個原因,我只能給出如何得到信息的模糊指導。

我的來源是:

  1. 被CĴ日期進行的,在IBM,探索正常化的進一步下游和關係模型(而不是作爲在SQL中實現的關係模型)的研討會。這包括探索第五(?)和第六(?)正常形式。

  2. 一段時間內與Oracle技術人員進行的一系列討論,討論元數據;元元數據;和其他這樣的概括。

  3. 與英國軍事研究機構的討論。儘管這是幾年前的事情,但我不確定在我們正在討論的主題上是否發佈過任何內容。

  4. 在一家大型金融機構工作,其聯繫細節系統與我的建議非常相似,但是源於非關係型根源;在記憶,持久記憶和備份容量成爲主要關注的時代,最初的技術動力是節省空間的。

編輯:

我完成上述編輯,閉嘴我的電腦,做了一些家務,上牀睡覺,勞改了下來,閉上了眼睛,我有解決部分我無法完成之前的編輯。

雖然標記/驗證大部分工作實際上是閱讀和比較,但仍有更新需要完成。因此它是樂觀鎖定的主要候選者。在僞代碼,這將是這樣的:

Start read transaction 
    Read set of address lines where one or more lines are "Needs Validation" 
    Read all rule set names 
    Read all rule lines which belong to the first rule set 
    If read is not successful then abandon and start process again 
End read transaction 
Do while address not validated and not end of rule sets 
    If set of address lines validates against first rule set then 
    prepare transaction by allocating the tags to be applied to each line of the 
    address and temporarily recording the rule set that has validated the address 
    Start validation transaction 
     Read same set of address lines and rule set (all fields) 
     Is the address and the rule set identical to what was obtained in the read 
     transaction? 
     If identical then 
     create appropriate set of Tag Usage records 
     if successful then 
      commit validation transaction 
      end overall process 
     if not successful or 
     if not identical then 
      rollback validation Tag and Tag Usage 
      ** This is the point where there might be problems if the rule set has 
      changed since reading it. The ordering may have changed due to amendment 
      deletion or creation of rule sets. This is the reason for the read of all 
      the read set names initially. However if there is such a change one can 
      afford to fail to validate and move on, aiming to come back to this address 
      later. 
    End of validation transaction 
    Start read transaction 
     Read rule lines which belong to the next rule set 
    End read transaction 
End while loop 
If end of rule sets reached and address not validated 
    begin create Tag Usage transaction 
    create tag usage pointing to Tag "Manual Intervention needed" 
    end create Tag Usage transaction 

所有三種類型的交易(地址,地址線的更新,規則集,規則更新,以及標籤,標籤的使用更新)符合酸性條件。我堅信(但沒有證明)這三種交易類型的任何交織,組合或交集都將滿足ACID條件。

+0

上面的答案也允許擴展到非羅馬字母 - 俄語,中文,印地文等。 – 2010-11-05 22:02:24

+0

有趣的概念,使三個視圖的數據集,但我不確定你是如何在ACID/SQL環境中實現它的。這聽起來像是幾乎BigTable。你知道這個概念的更詳細的資源嗎? – Incognito 2010-11-08 14:52:41

0

可能至少爲already answered。您可以爲郵政編碼做類似的事情。

+0

不完全。電話號碼是問題的一個例子,而不是我感興趣的問題。 – Incognito 2010-11-08 14:53:35

0

如果我會實現這個,我會保存電話號碼,郵政編碼等常規字符串。特別是數據應該以最終用戶需要的格式存儲。 (假設每個最終用戶都有相同的需求)。有一個德國人的地址:「Roadname 123」,美國地址? 「123 Roadname」。對郵政編碼也一樣,將它們與城市名稱結合使用。您可以將地址保存爲address_line_1(街道名稱,用戶輸入的國家特定順序的門牌號碼),address_line_2(郵政編碼,城市名稱...)。

如果您仍然需要在數據庫中搜索特定的郵政編碼,您可能會爲此編寫一個正則表達式或函數。考慮到城市名稱,你可以將它們從address_line_2中清除出去,並且很有可能最終得到郵政編碼。

我認爲每個國家的寫作驗證必須是非常出色的工作,這就是200個國家......您如何確定您沒有錯過一些當地的會議?您可以編寫一個函數eq,例如評估eq(「ABCDE-34」,「ABCDE.34」)== true。

儘管我沒有真正看到寫入客戶端服務器端驗證的要點。即使客戶端是Web瀏覽器,也可以通過AJAX使用服務器的驗證。

最終它取決於您正在使用的DBMS(支持Java存儲過程?),您的客戶端語言......還有如何輸入數據(在Web瀏覽器中輸入的數據是否非常不準確?)以及你想要做什麼。 (您是否打算給Skype提供數據庫中的電話號碼,或者將這些電話號碼輸入到手機中的人閱讀)?您是否需要執行一些特定的加入操作?當然,這取決於你可以花多少工時來解決這個問題......