データベース(RDBMS)に住所を保存するためのベストプラクティス


106

RDBMSに住所を保存するためのベストプラクティスに関する適切なリファレンスはありますか?評価できるトレードオフはたくさんあり、それぞれの長所と短所がたくさんあるようです-確かにこれは何度も何度も行われていますか?たぶん誰かが少なくともどこかで学んだいくつかのレッスンを書いたことがありますか?

私が話しているトレードオフの例は、郵便番号を整数フィールドと文字フィールドとして格納すること、家番号を別のフィールドまたは住所行1の一部として格納する場合、スイート/アパートメント/その他の番号を正規化するか、または単に住所行2のテキストのチャンク。zip+4(個別のフィールドまたは1つの大きなフィールド、整数とテキスト)をどのように処理しますか?等

この時点では主に米国の住所に関心がありますが、グローバルになる可能性に備えていくつかのベストプラクティスがあると思います(たとえば、州ではなく地域や郵便番号ではなく郵便番号などのフィールドに適切な名前を付ける)等


3
すぐにzipは文字フィールドでなければなりません-そうでなければ、0で始まる特定の郵便番号は不正確になります。
Menasheh 2017年

1
経験則として、数値を使って数学計算を行う必要がある場合は、整数でなければなりません。表示するだけの場合は、char(電話、郵便番号など)にする必要があります
Zikato

回答:


37

より国際的な使用のために、考慮すべき1つのスキーマはDrupal Address Fieldによって使用されるものです。これはxNAL標準に基づいており、ほとんどの国際的なケースをカバーしているようです。そのモジュールを少し掘り下げると、国際的に住所を解釈および検証するためのいくつかの素晴らしい真珠が明らかになります。また、ISOコードを備えた一連の優れた行政区域(州、州、州など)もあります。

モジュールページからコピーしたスキーマの要点は次のとおりです。

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)

私が学んだ教訓:

  • 数値を保存しないでください。
  • 可能な場合は、国と行政区域をISOコードとして保管してください。
  • わからないときは、フィールドの入力を控えてください。一部の国では、locality&のような基本的なものでさえ、当然のことと考えているフィールドを使用しない場合がありますthoroughfare

1
「name_line」の目的は何ですか?Drupal DocsやxNal Standardでの説明は本当に見つかりません。どのように私はそれを理解name_lineはメールで本当の手紙や小包を送るためのものです。first_nameのは / LAST_NAMEはあなたが電子メールで例えば、直接顧客に対処したい場合にのみ必要とされている(「親愛なるミスター<LAST_NAME>」)。それとも他の目的/利点がありますか?
luba

(大規模な)商業施設に配送する場合、内部のメール配送システムに名前が必要になることがよくあります(郵便室のあるオフィスビルを考えてください)
Chris Browne

住所フィールドは、住所に置き換えられました。フィールドは少し異なるように見える
ギャビンヘインズ

24

「国際的な」ユーザーとして、米国形式のアドレスのみを中心としたウェブサイトを扱うことほど苛立たしいことはありません。最初は少し失礼ですが、検証も熱心すぎると深刻な問題になります。

グローバル化に関心がある場合、私が唯一のアドバイスは、物事を自由形式に保つことです。国によって表記規則は異なります。番地の前に番地が付いている場合もあれば、後になっている場合もあります。いくつかは州、いくつかの地域、いくつかの郡、それらのいくつかの組み合わせを持っています。ここ英国では、郵便番号は郵便番号ではなく、文字と数字の両方を含む郵便番号です。

可変長の文字列を10行以下に、郵便番号用の個別のフィールドと共に(そして国の感性に対処するためにそれをどのように説明するかに注意して)ください。ユーザー/顧客に自分のアドレスを書き込む方法を決定させます。


価値のあるものとしては、これはWebサイト用ではありませんが、国際アドレスに関する要点はまだ十分に理解されています。
ジョン

47
私はメッセージに同意しませんが、実際にはあなたが取るスタンスに拍手を送っていますが、アドレスデータをクレンジングするためにツールの作成に大部分の時間を費やす人としてその事実を嫌うので、私はあなたに反対票を投じなければなりませんでした自由形式の住所データの保存方法。アドレスのフォーマットは異なる場合がありますが、データはほとんど同じです。番地が通りの名前の前に表示されるか後に表示されるかは、保存目的ではほとんど関係ありません-表示目的のみです。
BenAlabaster、2009

20

他の国が住所をどのように使用しているかについての包括的な情報が必要な場合は、非常に優れた参照リンク(コロンビア大学)をご覧ください。

フランクの強迫的な郵送先案内書
国際郵便の効果的な宛先指定


17

"半数"や "129A"のような現在の住所などの特殊なケースのため、家の番号を数字ではなく文字フィールドとして格納することを検討してください。ただし、Aはアパートとは見なされません。配送サービスの番号。


11

私はこれを実行しました(データベースのアドレス構造を厳密にモデル化しています)。原則として考慮しなければならない例外がどれほどクレイジーかは想像できません。

ノルウェーの郵便番号に関するいくつかの問題を漠然と思い出します(私が思う)、18かそこらを持っているオスロを除いて、すべて4つのポジションでした。

私たちがすべての自国の住所に地理的に正しい郵便番号を使い始めた瞬間から、かなりの数の人々がメールの到着が遅すぎると不平を言い始めたと確信しています。それらの人々は郵便区域間の境界線近くに住んでいることが判明しました、そして誰かが郵便区域に実際に住んでいたという事実にもかかわらず、たとえば1600、実際には彼の郵便は郵便区域1610に宛てられるべきです。それは実際に彼に仕えたので、彼の郵便を彼の正しい郵便区域に送ることは、正しい郵便局が間違った郵便区域にそれを転送するために必要とされた不必要な介入のために、到着するまでに数日かかるでしょう...

(私たちは、ISOコード「ZZ」を使用して、国の海外住所を持つ人々を登録することになりました。)


8

リレーショナルデータベースでアドレス情報をモデル化するのにこれは良い方法ですか」を必ず確認してください。

確かに多くの既存の回答があります(たとえば、DatabaseAnswersのサンプルデータモデルをチェックしてください)。既存の回答の多くは、状況によっては不完全です(DB Answersをまったく選択していません)。

考慮すべき1つの主要な問題は、アドレスの範囲です。データベースで国際住所を処理する必要がある場合は、1つの国の住所のみを処理する必要がある場合よりも柔軟にする必要があります。

私の見解では、住所の「住所ラベル画像」を記録し、内容を個別に分析することは常にというわけではありませんが)しばしば賢明です。これにより、たとえば国間の郵便番号の配置の違いに対処できます。もちろん、さまざまな国の偏心を処理するアナライザーとフォーマッターを作成できます(たとえば、米国の住所には2行または3行ありますが、対照的に、英国の住所にはかなり多くの行がある可能性があります。定期的に書き込む1つの住所には9行あります)。しかし、人間に分析とフォーマットを行わせ、DBMSにデータを格納させるだけの方が簡単です。


7

番地や郵便番号で計算を行うのでない限り、それらを数値として保存することで将来の苦痛を招くだけです。

あなたはあちこちに数バイトを節約し、おそらくより速いインデックスを取得するかもしれませんが、米国の郵便、またはあなたが扱っている他の国がコードにアルファを導入することを決定したとき、あなたは何をしますか?

ディスク容量のコストは、後で修正するコストよりもはるかに安くなります... y2k誰か?



7

Iveは、最小の離散単位から最大までのすべての可能なフィールドをリストすることが最も簡単な方法であることを発見しました。ユーザーは自分が適切だと思うフィールドに入力します。私のアドレステーブルは次のようになります。

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

私書箱はどのように保管しますか?
Jowen

別の列PO_boxを追加するだけです。これを遡及的に行う必要がある場合は、以前の住所ではPO Boxが必要ないため、nullに設定できます
Gaz_Edge

2

ZIPをNUMBERまたはVARCHARとして保存する際の「トレードオフ」はどこにありますか?これは単なる選択肢です。両方にメリットがあり、他のユーザーを獲得するためにいくつかのメリットを放棄する必要がある場合を除いて、トレードオフではありません。

zipの合計がまったく意味がない場合を除いて、数値としてのZipは役に立ちません。


1つのトレードオフは、データベースのサイズです。mysql 5では、mediumint行は行ごとに3バイトしかかかりませんが、varchar(5)は2倍かかります。また、数値検索はテキスト検索よりも速いと思いましたが、私はそれについて肯定的ではありません。
gpojd 2008年

4
varcharを使用する必要があります。カナダの郵便番号は英数字のエンコードを使用しているため、数値にうまく適合しません。
EvilTeach 2008年

1
私はこの意味でvarcharを使用する背後にある「前方互換」ロジックを理解していますが、「数値として圧縮」は役に立たないという主張は少し独断的すぎます。米国のみの郵便番号で作業することがわかっている場合は、厳密に型指定された言語で書く場合と同様に、郵便番号を整数として格納することは理にかなっています。すべてを文字列型として定義するのではなく...数値になることを知っているので、DB /プログラミング言語の型チェックに頼って、それを整数と呼んでみませんか?
rinogo 2013

1
@rinogo varcharを使用するための1つの引数は、郵便番号は数学的な意味で数値ではないということです。それらに対して加算や減算を行うことは意味がありません。制限された文字セットでエンコードされているだけです。 stackoverflow.com/a/893489/48659
Steve Folly

1
@SteveFollyとZIPコードは、文字列であることのさらなる支持で、主人公は特別な意味を持っている:en.wikipedia.org/wiki/ZIP_Code#Primary_state_prefixes 1のようなロジックを実装しようとしている場合は、「値の一番左の文字を何ですか?」すると、整数よりも文字列のように聞こえます。
David Aldridge 2017

2

これはやり過ぎかもしれませんが、複数の国で機能するソリューションが必要で、アドレスの一部をプログラムで処理する必要がある場合:

2つのテーブルを使用して国固有の住所処理を行うことができます。1つの汎用テーブルは10のVARCHAR2列、10の列、これらのフィールドをプロンプトにマップし、国の列を国に関連付ける国の列を持つ別のテーブルです。


私は実際にそれを自分で考えました。それに加えて、またはおそらく国に基づいて列をプロンプトにマップするテーブルの代わりに、特定の住所フォーマットごとに更新可能なビューを作成することを考えていました。まだ引き金を引いていないが、それについて考えている。
Andrew Steitz、2016年

1

住所を確認したり、クレジットカードの支払いを処理するために住所を使用したりする必要がある場合は、少なくとも小さな構造が必要になります。そのため、自由形式のテキストブロックはあまり機能しません。

郵便番号は、住所全体を使用せずに支払いカード取引を検証するための一般的なオプションのフィールドです。そのため、個別の十分なサイズのフィールド(少なくとも10文字)を用意してください。



-2

ユーザーが値を入力するためのtextarea要素を使用して、すべてのフィールドを大きなNVARCHAR(1000)フィールドにまとめます(郵便番号などで分析を実行する場合を除く)。これらの住所行1、住所行2などのすべての入力は、その形式に適さない住所がある場合は非常に煩わしいです(そして、ご存知のとおり、米国以外の国もあります)。


3
なんて恐ろしい考えでしょう!「コメント」には、これが招く悪夢を説明するのに十分なスペースがありません。後で混乱を解くのではなく、少し時間をかけて適切に設計することをお勧めします。Samm Cooperの回答を参照してください。私はここで他に1つだけ回答に反対票を投じたと思いますが、これは間違いなく私から反対票を獲得しました。
Andrew Steitz

どの混乱?何のためにデータが必要ですか?多くの場合、必要なのは、ラベルプリンターなどに直接渡すだけで、テキストの塊として扱うことができます。また、都市や郵便番号を気にする場合もあります(ただし、サポートされている国にのみ顧客がいることを確認してください)
erikkallen

2
OPは「ラベルプリンターに渡すだけでよい」とは述べておらず、すべての仕事で住所を「データ」として使用し、レポートを実行し、税金を徴収しました(アプライアンスのコロラド州の消費税は新しい家に置かれます)。通りの片側から反対側まで変化します)、リードを営業担当者に割り当て、政府のコンプライアンス要件を満たすなど、リストはどんどん続きます。「個別の項目を1つのフィールドにマッシュアップするか、利用可能なデータを取得しないことによって」データを「破壊する」ことは私の本の「罪」であり、人々が私を無視したときに警告した悪夢であることが常に証明されています。
Andrew Steitz 2016年

後でデータの一部が不要であることがわかった場合は、後でいつでも「破棄」できます。「作成」データは、悪夢(情報を個別のフィールドに分割)から不可能(事後のデータを取得)までの範囲です。OPが「ラベルプリンターに送信するだけでよい」と言っていたら、私は拍手を送ってあなたの答えに賛成票を投じたでしょう。ただし、そのような何かについての具体的な言及がなければ、IMOは無責任な、あるいは平均的なものの瀬戸際に迫っています。
Andrew Steitz、2016年

私が働いていた場所(主にeコマース)では、5から6の異なるフィールドに保存する傾向がありますが、それを使用して配信に送信する以外に情報を使用することは決してありません。
erikkallen 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.