Найкращі практики зберігання поштових адрес у базі даних (RDBMS)?


106

Чи є якісь посилання на кращі методи зберігання поштових адрес у RDBMS? Здається, існує безліч вигід, які можна здійснити, і багато плюсів і мінусів, які можна оцінити кожному - напевно, це робилося знову і знову? Може, хтось хоч десь написав, що десь засвоїв уроки?

Приклади компромісів, про які я говорю, зберігають поштовий індекс як ціле число проти знакового поля, якщо номер будинку повинен зберігатися як окреме поле або частина адресного рядка 1, якщо номер набору / квартири / тощо буде нормалізований або просто зберігається як шматок тексту в адресному рядку 2, як ви обробляєте zip +4 (окремі поля або одне велике поле, ціле число проти тексту)? тощо.

На даний момент я переймаюся, перш за все, адресами США, але, думаю, є кілька найкращих практик щодо того, щоб підготуватися до того, що ви також можете стати глобальними (наприклад, імена полів, як регіон, а не штат або поштовий індекс, а не поштовий індекс, тощо.


3
Безпосередньо біля поштового індексу має бути поле char - інакше деякі поштові коди, які починаються з 0, стануть неточними.
Менашех

1
Як правило, коли потрібно робити математичні обчислення з числом, воно повинно бути цілим числом. Якщо ви лише відображаєте його, він повинен бути char (телефон, поштовий індекс тощо)
Zikato

Відповіді:


37

Для більш міжнародного використання одна з розглянутих схем - це та, яку використовує поле Drupal Address . Він заснований на стандарті 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. Як я розумію, це ім'я_лінії - це відправлення справжніх листів або посилок поштою. First_name / last_name потрібен тільки якщо ви хочете , щоб звернутися до клієнта безпосередньо, наприклад , по електронній пошті ( «Шановний пане <last_name>»). Або є якась інша мета / користь для цього?
луба

При доставці до (великих) комерційних приміщень часто потрібна назва для внутрішньої системи доставки пошти (розгляньте офісні будівлі з поштовими кімнатами)
Кріс Браун

Поле адреси було замінено адресою . Схоже, поля можуть бути дещо іншими
Гевін Хейнес

24

Як "міжнародний" користувач, немає нічого страшнішого, ніж спілкуватися з веб-сайтом, орієнтованим лише на адреси у форматі США. Спочатку це трохи грубо, але стає серйозною проблемою, коли перевірка також надмірно ревна.

Якщо ви переймаєтесь глобальним розвитком, єдина порада, яку я маю - це підтримувати речі вільними. У різних країнах є різні умовності - в деяких номер будинку походить перед назвою вулиці, в деяких - після. Деякі мають штати, деякі регіони, деякі графства, деякі їх поєднання. Тут, у Великобританії, поштовий індекс - це не поштовий індекс, це поштовий індекс, що містить і букви, і цифри.

Я б радив просто ~ 10 рядків рядків змінної довжини разом з окремим полем для поштового індексу (і будьте уважні, як ви описуєте це, щоб впоратися з національною чутливістю). Нехай користувач / замовник вирішує, як писати свої адреси.


Наскільки це варте, це не веб-сайт, але питання щодо міжнародних адрес все ще добре прийнято.
Іван

47
Хоча я не погоджуюся з повідомленням, і насправді я аплодую вам за позицію, яку ви займаєте, мені довелося порушити вас за те, що я ненавиджу цього, як хтось, хто витрачає значну більшість мого часу на написання інструментів для очищення даних адреси. зберігання адресних даних у вільному форматі. Адреси можуть бути відформатовані по-різному, але дані все ще в основному однакові. Незалежно від того, чи відображається номер вулиці перед назвою вулиці або після неї, в цілому не має значення для цілей зберігання - лише для відображення.
BenAlabaster


17

Ви обов'язково повинні розглядати збереження номеру будинку як поле символів, а не число, через особливі випадки, такі як "пів числа", або мою поточну адресу, яка є щось на зразок "129A" ​​- але А не вважається квартирою номер служби доставки.


11

Я це зробив (жорстко моделював адреси адресних структур у базі даних), і більше ніколи б це не зробив. Ви не можете собі уявити, наскільки шалені винятки, що вам доведеться брати до уваги, як правило.

Я тумано згадую якусь проблему з норвезькими поштовими індексами (я думаю), які були усіма 4 позиціями, крім Осло, в якому було 18 або близько того.

Я впевнений, що з моменту, коли ми почали використовувати географічно правильні поштові індекси для всіх наших власних національних адрес, досить багато людей почали скаржитися на те, що їх пошта надходить надто пізно. Виявилося, що ці люди жили поблизу кордону між поштовими районами, і, незважаючи на те, що хтось дійсно проживав у поштовій зоні, скажімо, 1600, насправді його пошту слід адресувати до поштової області 1610, адже насправді це була сусідня поштова зона що насправді його обслуговувало, тож відправлення пошти на його правильний поштовий простір зайняло б цю пошту на пару днів довше, ніж через небажане втручання, яке було потрібно в правильному поштовому відділенні, щоб переслати його у неправильну поштову зону ...

(Ми закінчили реєструвати тих людей, які мають адресу за кордоном в країні, з ISO-кодом "ZZ".)


8

Ви, звичайно, повинні проконсультуватися " Чи це хороший спосіб моделювання адреси адреси у реляційній базі даних ", але ваше запитання не є прямим дублікатом цього.

Напевно є багато попередніх відповідей (наприклад, ознайомтеся з прикладними моделями даних у DatabaseAnswers ). Багато попередніх відповідей за певних обставин є дефектними (зовсім не вибираючи відповіді БД).

Одне важливе питання, яке слід врахувати, - це обсяг адрес. Якщо ваша база даних має справу з міжнародними адресами, ви повинні бути більш гнучкими, ніж якщо вам доведеться мати справу лише з адресами в одній країні.

На мій погляд, часто (що не означає завжди ) доцільно одночасно записувати «зображення мітки адреси» адреси та окремо аналізувати вміст. Це дозволяє подолати відмінності між розміщенням поштових індексів, наприклад, між різними країнами. Звичайно, ви можете написати аналізатор та формат, які керують ексцентриситетами різних країн (наприклад, американські адреси мають 2 або 3 рядки; навпаки, британські адреси можуть мати значно більше; одна адреса, яку я записую періодично, має 9 рядків). Але може бути простіше змусити людей робити аналіз та форматування, а СУБД просто зберігати дані.


7

Якщо ви не збираєтеся займатися математикою на вуличних номерах або поштових індексах, ви просто запрошуєте майбутні болі, зберігаючи їх як числові дані.

Ви можете зберегти кілька байтів тут і там і, можливо, отримати більш швидкий індекс, але що робити, коли американська поштова або будь-яка інша країна, з якою ви маєте справу, вирішує ввести альфафайли в коди?

Вартість місця на диску буде набагато дешевшою, ніж вартість його виправлення пізніше ... y2k кого?


7

Додавши до того, що сказали Джонатан Леффлер та @ Пол Фішер

Якщо ви коли-небудь передбачаєте, що до ваших вимог будуть додані поштові адреси для Канади чи Мексики, зберігання postal-codeу вигляді рядка є обов'язковим. У Канаді є буквено-цифрові поштові індекси, і я не пам’ятаю, як виглядає Мексика у верхній частині голови.


7

Я виявив, що перерахування всіх можливих полів від найменшої дискретної одиниці до найбільшої є найпростішим способом. Користувачі заповнять поля, які вважають за потрібне. Моя адресна таблиця виглядає так:

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

Як зберігати поштові ящики?
Джовен

просто додайте ще один стовпець PO_box Якщо вам потрібно зробити це заднім числом, це означає, що для попередніх адрес не потрібна поштова скринька, тому її можна встановити на нуль
Gaz_Edge

2

Де "розпродаж" у зберіганні ZIP у вигляді НОМЕРА чи ВАРХАРУ? Це лише вибір - це не розпродаж, якщо немає вигод для обох, і вам доведеться відмовитися від деяких вигод, щоб отримати інші.

Якщо сума кліпів взагалі не має жодного значення, блискавки як число не корисні.


Один компроміс може бути розміром бази даних. У mysql 5 середній рядок займе лише 3 байти в ряд, тоді як varchar (5) займе вдвічі більше. Я також вважав, що числові пошуки швидші, ніж текстові, але я не позитивний з цього приводу.
gpojd

4
слід використовувати варчар. Канадський поштовий індекс використовує альфа-цифрове кодування, яке не вписується добре в число.
EvilTeach

1
Хоча я розумію логіку "сумісного вперед" використання цього варшара в цьому сенсі, твердження про те, що "блискавки як число не корисні" є занадто догматичним. Якщо ви знаєте , що будете працювати з поштовими індексами, призначеними лише для США, має сенс зберігати поштові індекси як цілі числа, як і під час написання строго набраною мовою, ви не визначаєте все як тип String ... Якщо ви знайте, що це буде число, чому б не спиратися на перевірку типу мови DB / програмування і не називати його таким, яким він є - Цілий чисельність?
rinogo

1
@rinogo один аргумент використання varchar полягає в тому, що поштові індекси не є числовими в математичному сенсі; не має сенсу робити додавання чи віднімання на них; вони просто закодовані обмеженим набором символів. stackoverflow.com/a/893489/48659
Стів Фоллі

1
@SteveFolly І в подальшій підтримці рядків Zip-кодів провідні символи мають особливе значення: en.wikipedia.org/wiki/ZIP_Code#Primary_state_prefixes Якщо хтось збирається впроваджувати логіку на кшталт ", які є найбільш ліві символи значення ? " то це впевнено звучить більше як рядок, ніж ціле число.
Девід Олдрідж

2

Це може бути зайвим, але якщо вам потрібно рішення, яке б працювало з кількома країнами, і вам потрібно програмно обробити частини адреси:

Ви можете мати обробку адрес для кожної країни за допомогою двох таблиць: Одна загальна таблиця з 10 стовпцями VARCHAR2, 10 стовпцями номерів, інша таблиця, яка відображає ці поля підказки, і стовпець країни прив'язує структуру адреси до країни.


Я сам це вважав. На додаток до, або, можливо, замість таблиці, яка відображає стовпці для підказок на основі країни, я думав про створення оновлених представлень для кожного конкретного формату адреси. Ще не натиснув на курок, але подумав про це.
Ендрю Штайц

1

Якщо вам коли-небудь доведеться підтвердити адресу або використовувати її для обробки платежів кредитною карткою, вам, принаймні, потрібна невелика структура. Блок тексту тексту у вільній формі не дуже підходить для цього.

Поштовий індекс - це загальне необов’язкове поле для перевірки транзакцій платіжними картками без використання всієї адреси. Отже, майте для цього окреме і щедро розмірене поле (принаймні 10 символів).



-2

Я б просто поклав всі поля разом у велике поле NVARCHAR (1000) з текстовим елементом для користувача, який повинен ввести значення для (якщо ви не хочете провести аналіз, наприклад, поштові індекси). Усі ці вхідні рядки 1, адресний рядок 2 і т. Д. Просто набридають, якщо у вас є адреса, яка не добре відповідає цьому формату (і, ви знаєте, є інші країни, крім США).


3
Яка жахлива ідея! У "Коментарі" не вистачає місця, щоб описати кошмар, який цей запрошує. Краще витратити трохи додаткового часу на його правильне проектування, ніж намагатися потім розплутати безлад. Дивіться відповідь Семма Купера. Я думаю, що я проголосував лише за одну іншу відповідь тут, так, але ця, безумовно, заробила голос відмови.
Ендрю Штайц

Який безлад? Для чого потрібні дані? Часто вам це потрібно лише для того, щоб передати його безпосередньо на якийсь принтер етикеток або подібне, і тоді ви можете просто ставитися до цього, як до тексту. Інший раз, коли ви можете піклуватися про міста та поштові індекси (але краще переконайтесь, що у вас є лише клієнти в підтримуваних країнах)
erikkallen

2
ОП не згадувала "лише про те, щоб передати її принтеру етикеток", і в будь-якій роботі, яку я коли-небудь робив, ми використовували адресу як "дані", працювали звіти, збирали податки (податки з продажу в Колорадо на техніку, що розміщується в новому будинку варіюються від однієї сторони вулиці до іншої), призначаючи клієнтів із продажу, які відповідають вимогам дотримання державних вимог, список продовжується та продовжується. "Знищення" даних (шляхом перемішування різних предметів в одне поле або не фіксування наявних даних) є "гріхом" у моїй книзі і завжди виявляється кошмаром, про який я попереджав, коли люди мене ігнорували.
Ендрю Штайц

Якщо згодом ви виявите, що вам не потрібен фрагмент даних, ви завжди зможете "знищити" його згодом. "Створення" даних - від кошмару (розбиття інформації на окремі поля) до неможливого (фіксація даних після факту). Якби ОП сказала, "потрібно лише надіслати це на принтер етикеток", я б аплодував і схвалив вашу відповідь. Однак без конкретної згадки про щось подібне - пропозиція "знищити" дані, ІМО стоїть на межі безвідповідальності або навіть означати.
Ендрю Штайц

Там, де я працював (переважно електронна комерція), ми прагнемо зберігати її в 5-6 різних сферах, але ми ніколи і ніколи нічого не робимо з інформацією, окрім як використовувати її для надсилання для доставки.
erikkallen
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.