web-dev-qa-db-ja.com

住所をモデル化する方法

複数行の住所、都市、州(州)、および郵便番号を持つことができる郵便住所をモデル化する必要があります。国は省略されています。

住所の改行を保持する必要がありますが、住所を検索できます。

私はそれを行う2つの方法を見ます:

class Address(models.Model):
    street = models.ForeignKey('StreetAddress')
    city = models.TextField()
    province = models.TextField()
    code = models.TextField()<br>
class StreetAddress(models.Model):
    line_number = models.IntegerField()
    text = models.TextField()

または、番地を単一のテキストフィールドに格納しますが、改行をエンコードするために特別な区切り文字を使用するもの:

class Address(models.Model):
    street = models.TextField()
    city = models.TextField()
    province = models.TextField()
    code = models.TextField()

コードの可読性と効率(またはそれらのバランス)の観点からそれを行うための最良の方法は何ですか?

25
akonsu

あなたの住所の大部分が複数行のストリートパーツを持っている(そして多くのラインを持っている)場合を除いて、私は後者を選び、すべてを単一のフィールドに保存し、追加のモデルを気にしません。複数行の住所のほとんどが2行しかない場合は、住所モデルにstreetフィールドとstreet2フィールドを作成することを検討してください(これら2つの「street」フィールドにはよりわかりやすい名前を選択できます)。最初のフィールドには最初のストリートラインが格納され、2番目のフィールドにはすべての追加のラインが格納されます(改行で区切られます)。住所を検索するときは、番地を含む住所行を検索することが最も多いと思います。したがって、プログラムロジックでは、番地行が常に最初の「番地」フィールドに格納されていることを確認します。次に、データベースにインデックスを追加できます。

一方、ほとんどの住所に複数行のストリートパーツがあり、3つ以上の行がある場合、その2番目のモデルを作成することは理にかなっています。

事前にわからず、将来「移行」する可能性を気にしない場合は、より単純なモデルを選択してください。それ以外の場合は、2モデルの設計を選択してください。

4
imm

これが私が米国の住所をモデル化する方法です。必要に応じて、10桁の郵便番号(XXXXX-XXXX)を保存することもできます。

また、アドレスを何に使用するかに応じて、geodjangoからポイントフィールドまたはポリゴンフィールドを追加することもできます。

from Django.contrib.gis.db import models
from Django.utils.translation import ugettext as _
from Django.contrib.localflavor.us.models import USStateField

class UsLocation(models.Model):
    address_1 = models.CharField(_("address"), max_length=128)
    address_2 = models.CharField(_("address cont'd"), max_length=128, blank=True)

    city = models.CharField(_("city"), max_length=64, default="Zanesville")
    state = USStateField(_("state"), default="OH")
    Zip_code = models.CharField(_("Zip code"), max_length=5, default="43701")
12
Issac Kelly

あなたの住所データについていくつか質問があります。

  1. データは配信ポイントまで検証済みですか?
  2. もしそうなら、あなたはまだ複数の配達ライン(ストリートフィールド)を持っている高い割合を持っていますか?

ほとんどの配送先住所には1行しかありません。多くの人が二次配送ラインに誤って二次情報(ユニット番号)を配置しています。これはUSPS標準に反します( SPS出版物28 を参照)。したがって、 CASS-Certified ベンダーを使用して住所データを検証することをお勧めします。これにより、扱っている住所が実際に標準化されていることがわかります。そうすれば、データを分析し、それを格納する方法について決定を下すのにより適した位置にいるはずです。私の推測では、データベースでアドレス検証を実行した後、複数の配信ラインを持つ非常に多くのアドレス(あるとしても)はありません。その時点で、別のフィールドを用意する価値があるのか​​、それとも改行で区切られた単一のフィールドに保持する価値があるのか​​を判断する必要があります。

完全な開示:私は SmartyStreets のソフトウェア開発者であり、住所検証会社であり、CASS認定ベンダーです。

8
mdwhatcott