Подтвердить что ты не робот

Как смоделировать почтовый адрес

Мне нужно смоделировать почтовый адрес, который может содержать многострочный адрес, город, штат (провинцию) и почтовый индекс. страна опущена.

Мне нужно сохранить разрывы строк в адресах улиц, но все же иметь возможность искать адреса.

Я вижу два способа сделать это:

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

Каков наилучший способ сделать это с точки зрения читабельности и эффективности кода (или их баланса)?

4b9b3361

Ответ 1

Если большинство ваших адресов имеют многострочные уличные части (и у них много строк), я бы пошел за последним, сохранив все это в одном поле и не потрудившись с дополнительной моделью. Если большинство ваших многострочных адресов - всего две строки, подумайте о создании в вашей модели адресов улицы и улицы2 (вы можете выбрать более описательные имена для этих двух "уличных" полей). Первый сохранит первую улицу, а второе поле сохранит все дополнительные строки (разделенные символами новой строки). Я бы подумал, что при поиске адресов вы чаще всего просматриваете адресную строку, содержащую номер улицы, поэтому, возможно, в вашей логике программы вы должны убедиться, что строка номера улицы всегда хранилась в первом поле "улица", которое вы можете добавить индекс в свою базу данных.

С другой стороны, если большинство ваших адресов будут иметь многострочные уличные части и иметь более двух строк, тогда имеет смысл создать эту вторую модель.

Если вы не знаете заранее и не возражаете, чтобы потенциально "мигрировать" в будущем, перейдите к более простой модели. В противном случае перейдите к вашему двухмоторному дизайну.

Ответ 2

Вот как я моделирую адреса для США. Вы также можете сохранить 10-значный почтовый индекс (XXXXX-XXXX), если вам нужно.

Вы также можете рассмотреть возможность добавления поля точки или поля poly из 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")

Ответ 3

У меня есть некоторые вопросы о ваших адресных данных:

  • Проверяются ли данные до точки доставки?
  • Если да, у вас есть высокий процент, который все еще имеет более одной линии доставки (поле улицы)?

Большинство адресов доставки имеют только одну строку. Многие люди ошибочно размещают вторичную информацию (номер единицы) на второй линии доставки. Это противоречит стандартам USPS (см. публикация USPS 28). Поэтому я рекомендую вам проверить ваши данные адреса с помощью CASS-Certified, чтобы вы знали, что адреса, с которыми вы имеете дело, являются реальными и стандартизированными. Тогда вы, вероятно, будете в лучшем положении для анализа ваших данных и принятия решения о том, как его хранить. Я предполагаю, что после выполнения проверки адреса в вашей базе данных у вас будет не так много (если есть) адрес с более чем одной линией доставки. Вы должны решить в этот момент, стоит ли иметь отдельное поле для него или хранить его в одном поле, которое ограничено разрывом строки.

Полное раскрытие информации: Я разработчик программного обеспечения для SmartyStreets, компании, проверяющей адрес и сертифицированного CASS.