как смоделировать почтовый адрес
мне нужно смоделировать почтовый адрес, который может иметь многострочный адрес улицы, город, штат (провинция) и почтовый индекс. страна опущена.
мне нужно сохранить разрывы строк в адресах улиц, но все же иметь возможность искать адреса.
Я вижу два способа сделать это:
или этот, который хранит адрес улицы в одном текстовом поле, но использует специальные символы-разделители для кодирования разрывов строк:
как лучше всего это сделать в условия удобочитаемости и эффективности кода (или их баланс)?
3 ответов
Если большинство ваших адресов не имеют многострочных уличных частей (и имеют много строк), я бы пошел на последнее, сохраняя все это в одном поле и не беспокоясь о дополнительной модели. Если большинство ваших многострочных адресов всего две строки, подумайте о создании поля street и street2 в адресной модели (вы можете выбрать более описательные имена для этих двух полей "street"). В первом будет храниться первая линия улицы, а во втором поле будут храниться все дополнительные линии (разделено новыми строками). Я бы подумал, что при поиске адресов вы чаще всего будете искать в адресной строке, содержащей номер улицы, поэтому, возможно, в вашей логике программы вы убедитесь, что строка номера улицы всегда хранится в первом поле "улица", которое вы можете добавить индекс в свою базу данных.
с другой стороны, если большинство ваших адресов будут иметь многострочные уличные части и иметь более двух строк, то имеет смысл создать эту вторую модель.
Если вы не знаете заранее и не возражаете против потенциальной "миграции" в будущем, перейдите к более простой модели. В противном случае, перейдите к дизайну двух моделей.
вот как я моделирую адреса для США. Вы также можете сохранить 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")
У меня есть несколько вопросов о вашем адресные данные:
- данные уже проверены до точки доставки?
- Если да, то у вас есть высокий процент, который все еще имеет более одной строки доставки (уличное поле)?
большинство адресов доставки имеют только одну строку. Многие люди ошибочно помещают вторичную информацию (номер единицы) во вторую строку доставки. Это противоречит стандартам USPS (см. публикация USPS 28). Поэтому я рекомендую вам проверить свои адресные данные с помощью аттестованный касс Вендер, чтобы вы знали, что вы имеете дело с реальными и стандартизированы. Тогда вы, вероятно, будете в лучшем положении для анализа ваших данных и принятия решения о том, как их хранить. Я предполагаю, что после выполнения проверки адреса в вашей базе данных у вас будет не очень много (если есть) адресов с более чем одной строкой доставки. Тебе придется принять решение. укажите, стоит ли иметь отдельное поле для него или сохранить его в одном поле, которое разделено разрывом строки.
полное раскрытие информации: я разработчик программного обеспечения для SmartyStreets, компания проверки адреса и Cass-аттестованный торговец.