国際的な地理的アドレスをリレーショナルテーブルに格納するタスクを考えると、最も柔軟なスキーマは何ですか?アドレスのすべての部分を独自のフィールドに分割する必要がありますか、それともフリーテキストのようにする必要がありますか?
異なる形式のアドレスを異なるテーブルに分割することに意味はありますか?たとえば、USAAddress、CanadianAddress、UKAddress ...のテーブルがありますか?
国際的な地理的アドレスをリレーショナルテーブルに格納するタスクを考えると、最も柔軟なスキーマは何ですか?アドレスのすべての部分を独自のフィールドに分割する必要がありますか、それともフリーテキストのようにする必要がありますか?
異なる形式のアドレスを異なるテーブルに分割することに意味はありますか?たとえば、USAAddress、CanadianAddress、UKAddress ...のテーブルがありますか?
私のブログ投稿からの私の考えを要約します-アドレスストレージ(archive.org)のレッスン。
私の現在のプロジェクト[私は物流会社で働いています]では、国際的な住所を保存しています。私は、データベースのこの部分の設計において、世界中のアドレスについて調査を行いました。さまざまな形式があります。西洋の世界では、かなり統一された形式を使用する傾向があります-いくつかの違いがありますが、ほとんどは次のとおりです。
これはほとんどの国をカバーしているように見えますが、フィールドの順序は異なって表示される場合があります。表示形式のリストは、http: //www.bitboost.com/ref/international-address-formats.html#Formatsにあります。
たとえば、多くの国では、郵便番号は都市名の前にあり、通り番号は通りの名前の後にあります。カナダ、米国、英国では、通りの番号が通りの名前の前にあり、郵便番号(または郵便番号)が都市の名前の後にあります。
住所をさまざまな国に分けることについてのあなたの質問に答えて、私はそれを提案しません、それは他の分野での生活を難しくするでしょう-例えば報告。私が提供したフォーマットは、米国、カナダ、メキシコ、英国を問題なくカバーするロジスティクスデータベースのすべてのアドレスをカバーしています。また、ヨーロッパ、中国、日本、マレーシアのすべての住所をカバーしています。他の国について話すことはできませんが、これらのフィールドでサポートされていない国の住所を保存する必要はまだありません。
英数字の文字列からアドレス情報を解析することは、最初に思われるほど単純ではないため、他の人が提案し、多くのデータベースで見られるAddress1、Address2、Address3形式を使用することはお勧めしません。特に、データが正しく入力されていない場合はそうです。 、誤った情報、タイプミス、スペルミスなどが原因です。フィールドを区切る場合は、距離アルゴリズムを使用して考えられる意味を確認したり、確率を使用して番地を郵便番号や番地と照合したり、州や市を番地などと照合したりできます。番地全体を示す文字列がある場合は、そのいずれかを実行します。それは想像力の範囲によって些細なことではありません。
住所データベースのQAは、頭痛の種です。この分野での生活を簡素化する最も簡単な方法は、すべてのフィールドに、入力時に正しいと自動的に確認できる単一の情報のみが含まれていることを確認することです。確率、距離アルゴリズム、および正規表現は、入力の有効性をチェックし、ユーザーの間違いが何であるかについてフィードバックを提供し、適切な修正を提案することができます。
注意すべき注意点の1つは、通りのタイプでもある名前の道路です。カナダをカバーしている場合は、トロントの「アベニューロード」に注意する必要があります。これは、Address1、2を使用している場合に非常に時間がかかります。 、3フォーマット。これは他の場所でも発生する可能性がありますが、私はそれらに気づいていません-この単一のインスタンスは私がWTFを叫ぶのに十分でしたか?!
アドレス形式を過度に分析しないように注意してください。そうすると、ほとんどのユーザーが回避する必要のある仕様になってしまう可能性が高く、効果的に間違ったフィールドを使用するように強制するか、プライマリフィールドのみに入力して余分なフィールドを無視します。
物事をシンプルにしてください。
BenAlabasterが言及しているようなStreetTypeは、英語やスペイン語などの孤立語とは異なる言語で作業を開始するときに問題を引き起こします。
アムステルダムの「HenrietteRolandHolststraat」は、「Henriette」+「RolandHolst」+「straat」から構成され、「Roland Holststraat」、または「 Roland Holststr。」、または「HRHolststr。」のスペルミス。または「ヘンリエッテローランド-ホルスト通り」、天候に応じて。地球上の各国の最新のストリートレジスターを持っていない限り、どこにも行きません。
そして最後に、多言語の国によっては、名前が言語ごとに異なる場合があることに注意してください。たとえば、ブリュッセルでは、多くの通りにフランス語とオランダ語の両方の名前が付けられています。宛先の優先言語に応じて、「AvenuduPort」と「Havenlaan」があります。(Googleマップでは、念のため、両方の名前を交互に表示しています。)
ここではあらゆる種類の巧妙なトリックを考案することができますが、それは営業担当者です。これを理解するつもりですか?
それはあなたがそれで何をしたいかによります。
アドレスが分離されていると、他の目的(USPSデータに対する検証やUPS / FEDEXからの配送料の取得など)でアドレスを使用する方が常に簡単であることがわかりました。
私が通常アドレスに使用するものは次のとおりです。
編集への応答: ほとんどの状況で、私は使用法を見ていません。上にリストした表には、ほとんどの国の住所に対して十分なフィールドがあります(そして十分に一般的です)。
この質問に出くわした人のための逸話は次のとおりです。
私は多くの大陸(ヨーロッパ、アジア、北アメリカ)に住み、働いてきた人として話します。私の経験、および私が一緒に働く人々の経験では、次のことを行うシステムを使用する方がはるかに簡単でした。
このように構築されたシステムは、私の人生を最も楽にしてくれます。特に、あなたの会社が実質的に機能的な内部知識を持っていない郵便システムにメールを送るとき。
あなたの会社が特定の郵便システムに関する内部知識を持っている場合は、ポイント3での私の選択を使用して、どのビューを表示するかを通知してください。多くの人々は、米国の郵便システムがパッケージングに何を期待しているのかを知っています。ポイント3で米国を選択した場合は、ビューが米国の住所に適しているように見せてください。あなたの会社が何も知らない国を選択した場合、一般的な3行を表示し、残りは私に任せてください。ASCIIの使用を強制しないでください。
そして、ここで現実になりましょう。すべてのグローバルな郵便システム(公的および私的)の完全な百科事典データベースを構築することは、不可能ではないにしても、せいぜい非常に困難な作業です。たとえば、住所がどこにあるかを実際に知っているのは、地元のラストマイルの運送業者だけである郵便システムがあります。パッケージ上のそのキャリアにメモを渡すことができると、非常に便利な場合があります。そして、すべてのエッジケースキャリアのローカル知識をデータベースにマッピングすることは、確かに不可能な作業です。
ゲーデルに聞いてください。(そして、あなたが談話の宇宙をモデル化するために公理的システムを使用しようとしているのか、集合論や関係代数のようなある種の算術を与えるか取るのかを自問してください。)
@BenAlabasterが提供した優れた答えとは正反対なので、次のようにすることができます。
address TEXT(300)
postal_code VARCHAR(15)
country_code VARCHAR(2)
クライアント側のフォームのレイアウトは、必要に応じて複雑にすることができます(または、ユーザーが手動でアドレスを入力できる複数行の入力を使用することもできます)。その後、必要に応じてアドレスに改行を追加できます。
国の表は次のようになります。
country_code VARCHAR(2)
country_name VARCHAR(255)
さらに、次のいずれかを使用できます。
postal_code_required TINYINT(1)
postal_code_regex VARCHAR(255) NULL DEFAULT NULL
次に、次のリストを使用して国別テーブルを設計します。
Ben Alabasterの回答のコメント:国に基づいて住所をフォーマットするには、各国の列の順序を個別の行として持つフォーマットテーブルを使用できます。
フィールドの順序は、複雑なグリッドレイアウトを使用するようにコーディングすることもできます。
国ごとに住所を分ける意味はありません。これは国の数が増えるにつれて混沌とし、たとえば国際的なクライアントのすべての住所を見つけたい場合は問題が発生します。ベンによって提案された住所タイプがあると、建物番号とアパート番号の両方を持つ住所がある場合にもあいまいさが生じる可能性があります。私は、建物ごとに名前が異なる集合住宅にいる可能性があります。これはインドでは非常に一般的です。
https://github.com/commerceguys/addressingライブラリを使用して国際住所をフォーマットし、次の要素を使用します。
Country
Administrative area
Locality (City)
Dependent Locality (in: BR, CN, IR, MY, MX, NZ, PH, KR, ZA, TH)
Postal code
Sorting code
Address line 1
Address line 2
Organization
Recipient
これは、通り(名前、家番号など)を解析する場合には役立ちません。
ところで。多言語の国リストをお探しの場合:https ://github.com/umpirsky/country-list
唯一の方法は、それらを次のように分割することです。
Name varchar,
Title varchar,
StreetAddress varchar,
StreetAddressLine2 varchar,
zipCode varchar,
City varchar,
Province varchar,
Country lookup
ほぼすべての国に住所データを保持するための独自の標準があり、国ごとに異なる形式の郵便番号があるためです。同様の質問から、私の投稿
に問題の小さなサンプルを含めることができます。
住所の規則がほとんどない国もあるため、これは国ごとに住所を分けることには意味がありません。いくつかの人気のある慣習には、小さな村には通りがなく、村の名前と番号だけがあり、通りは大都市の住所にあります。ハンガリーの首都ブダペストでは、同じ名前の街路はほとんどありませんが(都市の地区番号で区別します)、他の都市にはそのような住所がありません(ハンガリーの誰かが実際にこれが正しいかどうかを確認する場合があります)。したがって、住所形式の総数は、numer_of_countriesにこの国の住所形式の数を掛けたものになります…さまざまなテーブルで実行できますが、実行するのは恐ろしい作業になります。
これはすでに答えられている非常に古いトピックであることを私は知っていますが、私も2セントを投入すると思いました。それはすべて、プロジェクトの目標と、ターゲットユーザーがアドレスを入力する方法によって異なります。ベンの提案により、アドレスを正確に解析できるようになりますが、一方で、ユーザーデータ入力プロセスが長くなる(場合によってはイライラする)可能性があります。Stephen Wrightonの提案はより単純であり、結果としてユーザーがアドレスを入力するのがより簡単になる可能性があります。
また、都市、国、地域などを維持しながら、一般的な番地、タイプ、番地、ユニット/アパート番号などをすべて1つの列にキャプチャする「住所」列を単純に持つモデルもいくつか見ました。他の列内。スティーブンのモデルと似ていますが、Address1、Address2、およびAddress3がすべて1つの列に統合されている点が異なります。
私の意見では、最も柔軟なモデルは、柔軟性の解釈に応じて、最も制限の少ないモデルになる傾向があります。