Задача типовая, может подскажете типовое наилучшее решение?
В проекте на MySQL нужно хранить данные клиентов их контрагентов. И там и там есть адреса.
Я хочу под адреса сделать отдельную сущность-таблицу, заносить их туда, а потом просто ссылаться в виде внешних ключей.
Вопрос по структуре таблицы:
- Есть ли какое-то типовое ОПТИМАЛЬНОЕ решение для этого случая?
Т.е.:
- Какие поля?
- Может лучше в несколько таблиц разнести?
В общем, это ведь все делают, многие поколения уже))) да?
Выработался ли какой-то стандарт?
Где его взять?
Спасибо.
upd.: по мотивам ответов от кэпов (ребят, я по-доброму :) - да, разумеется, речь НЕ идет о записи адресов одной строкой, речь идет о квантизации адреса :) вопрос в том - какие именно поля делать для этого? нужно ли страны и города выносить в отдельные таблицы (99% что нужно)? в общем, какое-то готовое решение хочется получить, или узнать где его получить.
Роман Мирр, да, спасибо, похоже на правду :) к тому же есть готовые SDK для разных движков. Правда один только взгляд на эту простыню вызывает дрожь в коленях )) Думаю, для локальных целей нужно будет его почикать :) Еще раз спасибо! Надо постестить, даже любопытно стало посмотреть как оно будет работать))
Ну во первых если у вас уже есть разные сущности которые могут на один и тот же адрес ссылаться, то конечно же стоит вынести адреса в свою таблицу, это требования НФ в построении БД. Так мы уменьшаем дублирование.
А вот дальше по структуре самой таблицы уже нужно от задачи плясать. Если вы просто будете выбирать адрес целиком, то хреначьте просто в строку весь адрес. Если нужно будет найти все дома под номером "6", то логично в отдельную колонку вынести номер дома и т.д.
Ну вообще я бы сразу распилил адрес, т.к. сегодня нам не нужно искать дома с номером 6, а завтра нужно.
Вопрос на сколько частей адрес распиливать, тоже хороший вопрос. Как минимум номер дома отделять нужно.
По классике есть 2 вышеупомянутых подхода: Разбивать адрес на составные сущности и записывать все что можно в виде ключей, и писать адрес 1 строкой, забив на всякие быстрые агрегации/селекции. Что подходит конкретно в вашем случае из вопроса абсолютно не ясно, так как не содержит главного - как оно используется.
Сейчас многие склоняются к максиме "все как сервис"
В итоге вы имеете табличку со ссылкой на адрес (id) и полную строку адреса
При необходимости запрашиваете.
Другой вариант это разбор адреса на своей стороне. Для России я что то подобное сделал посмотрите в моем гите
Роми, Адрес это guid из внешнего сервиса, и строка адреса для локального отображения.
Когда нужно работать с полями адреса вы делаете запрос по этому guid