powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Как хранить адреса в БД?
25 сообщений из 55, страница 1 из 3
Как хранить адреса в БД?
    #39761963
tasyusha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Понимаю, что этот вопрос был здесь задан не раз, те топики я читал и полезного как-то не вынес. Поэтому прошу не судить строго, подниму эту тему еще раз.

Мне нужно хранить в БД персональные данные (имя человека, email, телефон) и адреса (допустим этих же людей). Вопрос в том, как спроектировать таблицу(ы) для хранения адресов. Первой моей идеей было хранить адреса прямо в таблице юзеров (вместе с мейлом и телефоном).

Вторая идея - вынести в отдельную таблицу адресов и хранить там в форме id, city, street, house, apt. Но это не решает проблему вертикальной дупликации строковых значений: у меня будет очень много Москв и Санкт-Петербургов, например. Значит, нужно создать таблицу city и снова делать туда FK и потом JOINить все это дело. Улицы, по идее тоже бы неплохо хранить в своей таблице и связать их с теми городами, которым они принадлежат.

На самом деле уже получается довольно громоздкая БД для такого просто приложения (по сути простейшая CRM система). Вот и когда я уже дошел до такого состояния, что для выполнения простейшего запроса нужно сделать запрос в 3 JOINа на 4 таблицы, я заметил интересную вещь у меня вертикальную дупликация как минимум идет по именам: и вот я сейчас думаю, почему меня должно смущать, что у меня в таблице 2000 Москв, а 2000 Андреев - это нормально?

Или нужно создавать таблицу с именами? ;)

В общем, по большому счету вопрос сводится к тому, насколько она нужна в данном случае нормализация и насколько глубоко это все нужно нормализовывать?
...
Рейтинг: 0 / 0
Как хранить адреса в БД?
    #39761978
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tasyushaВ общем, по большому счету вопрос сводится к тому, насколько она нужна в данном случае нормализация и насколько глубоко это все нужно нормализовывать?

Замечательный вопрос.
Осталось выяснить для чего нужна сама нормализация (ну не нужна же она только для галочки, правда?) и вы сразу получите ответ.
...
Рейтинг: 0 / 0
Как хранить адреса в БД?
    #39762016
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привязывайтесь к ФИАС.
...
Рейтинг: 0 / 0
Как хранить адреса в БД?
    #39762017
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tasyushaпочему меня должно смущать, что у меня в таблице 2000 Москв, а 2000 Андреев - это нормально?
Потому что Москва одна, а Андреи разные.
Смущать должно то, что это непонятно.
...
Рейтинг: 0 / 0
Как хранить адреса в БД?
    #39762024
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрите что такое КЛАДР.
...
Рейтинг: 0 / 0
Как хранить адреса в БД?
    #39762091
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не нужно смотреть КЛАДР, он не обновляется.
...
Рейтинг: 0 / 0
Как хранить адреса в БД?
    #39762130
tasyusha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PizzaPizzaОсталось выяснить для чего нужна сама нормализация (ну не нужна же она только для галочки, правда?) и вы сразу получите ответ.

Вот это и непонятно. Т.е. почему email и телефон я храню в таблице user, а адрес этого user'а выношу в таблицу address? Вот читаю, например:

авторНормализация нужна для борьбы с избыточностью. т.е. данные не дублируются и связаны только внешними ключами.
Ок, допустим хранить имя клиента в таблице order - это глупо (у одного юзера может быть овер до черта заказов). Но в моем случае - адрес у него может быть только один. Где здесь дупликация?

В принципе тут вопрос, а является ли мой вариант в принципе не нормализованным. Смотрим по формам:
авторПервая нормальная форма:

запрещает повторяющиеся столбцы (содержащие одинаковую по смыслу информацию)
запрещает множественные столбцы (содержащие значения типа списка и т.п.)
требует определить первичный ключ для таблицы, то есть тот столбец или комбинацию столбцов, которые однозначно определяют каждую строку

Повторяющихся столбцов нет (номер дома и город - это не одинаковая по смыслу информация).
Множественных столбцов нет.
Первичный ключ есть. Дальше, аленькая ремарочка: если таблица находится в первой нормальной форме и первичный ключ у нее состоит из одного столбца, то она автоматически находится и во второй нормальной форме (мой pk - user_id, один столбец).

авторТретья нормальная форма

Чтобы таблица находилась в третьей нормальной форме, необходимо, чтобы неключевые столбцы в ней не зависели от других неключевых столбцов, а зависели только от первичного ключа. Самая распространенная ситуация в данном контексте - это расчетные столбцы, значения которых можно получить путем каких-либо манипуляций с другими столбцами таблицы. Для приведения таблицы в третью нормальную форму такие столбцы из таблиц надо удалить.
Здесь непонятно: столбец город не зависит ни от первичного ключа, ни от других столбцов - никаким образом получить город пользователя из других столбцов нельзя.

Вот так вот.
авторЗачастую, чтобы извлечь информацию из нормализованной базы данных, приходится конструировать очень сложные запросы, которые к тому же, бывает, работают довольно медленно - из-за, главным образом, большого количества соединений таблиц. Поэтому, чтобы увеличить скорость выборки данных и упростить программирование запросов, нередко приходится идти на выборочную денормализацию базы.
...
Рейтинг: 0 / 0
Как хранить адреса в БД?
    #39762138
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tasyushaВот это и непонятно. Т.е. почему email и телефон я храню в таблице user, а адрес этого
user'а выношу в таблицу address?

Не с этого надо начинать. Базовым вопросом является "а для чего именно ты вообще
хранишь почту, телефон и телеграф адрес в своей базе".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как хранить адреса в БД?
    #39762139
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНормализация нужна для борьбы с избыточностью. т.е. данные не дублируются и связаны только внешними ключами.

Вы так и не ответили на вопрос, зачем нужна нормализация. Нормализация и есть, в частности, борьба с избыточностью. А вот зачем эта борьба с избыточностью нужна вам? Это вопрос.

Если у вас максимумы порядка несколько десятков тысяч записей на таблицу и/или пару запросов в секунду и нет требований по ожиданиям, то можно обойтись без нормализации.

Нормализация дает вам
а) Производительность и требования к оборудованию. Уменьшение объёмов базы за счет уменьшения объёма данных. Меньше памяти надо - меньше информации обрабатывать - быстрее запросы. Меньше памяти надо - больше влезает в кеши - быстрее запросы. Меньше размеры индексов - быстрее запросы.
б) Логическую цельность. Когда у вас 2000 Москв или 2000 Андреев в базе, то, при некоторых условиях (bulk insert или ручное редактирование/вставка) у вас будет 1999 Москв и 1 Маскв или 1999 Андреев и 1 Андрев.

Вопрос только в том, вам это надо все в ваших конкретных условиях или нет.
...
Рейтинг: 0 / 0
Как хранить адреса в БД?
    #39762143
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tasyusha
Здесь непонятно: столбец город не зависит ни от первичного ключа, ни от других столбцов - никаким образом получить город пользователя из других столбцов нельзя.
Ээ, Вы уверены что не зависит?
Скажем, по улице и дому "Красная площадь, 7" - никак-никак нельзя узнать город?
...
Рейтинг: 0 / 0
Как хранить адреса в БД?
    #39762147
Фотография Megabyte
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tasyushaОк, допустим хранить имя клиента в таблице order - это глупо (у одного юзера может быть овер до черта заказов). Но в моем случае - адрес у него может быть только один. Где здесь дупликация?


У юзера может быть 2 адреса: регистрации и проживания. Вы же не указали, что это за адрес...
...
Рейтинг: 0 / 0
Как хранить адреса в БД?
    #39762149
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MegabyteУ юзера может быть 2 адреса: регистрации и проживания. Вы же не указали, что это за адрес..
а 2-4 почти что норма(встречала и 72)
...
Рейтинг: 0 / 0
Как хранить адреса в БД?
    #39762153
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПЕНСИОНЕРКАа 2-4 почти что норма(встречала и 72)

Да ладно, братки разберутся из какой квартиры вещи выносить. В случае чего соседей ласково
попросят о сотрудничестве добрым словом и револьвером.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как хранить адреса в БД?
    #39762154
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tasyushaPizzaPizzaОсталось выяснить для чего нужна сама нормализация (ну не нужна же она только для галочки, правда?) и вы сразу получите ответ.

Вот это и непонятно. Т.е. почему email и телефон я храню в таблице user
А действительно, почему? Что стало причиной такого решения?

Ведь у пользователя может быть три email-а, два телефона, какой-нибудь skype, linkedin, и ещё множество разнотипных контактов?
...
Рейтинг: 0 / 0
Как хранить адреса в БД?
    #39762165
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1 таблица - тип адреса
2 таблица - тип части адреса
3 таблица - адрес

2 -> 1
2 -> 3
2 -> 2
2 -> users

запрос к адресу - иерархический (для полного адреса)

Такая конструкция у меня пока работает успешно
...
Рейтинг: 0 / 0
Как хранить адреса в БД?
    #39762177
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сорри, опечатался

-> - это один-ко-многим

1 -> 3
1 -> 2
2 -> 3
3 -> 3
users -> 3
...
Рейтинг: 0 / 0
Как хранить адреса в БД?
    #39762213
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я может чего-то не понимаю, но автору религия не позволяет сделать view(по городам, улицам и так далее) и без всяких джоинов оттуда брать что угодно? Если структура уже готова и она рабочая - автоматизируйте свои запросы - вы ж затем специальность свою и получали.
...
Рейтинг: 0 / 0
Как хранить адреса в БД?
    #39762215
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.Не нужно смотреть КЛАДР, он не обновляется.

Актуальность базы: 2019.01.17
...
Рейтинг: 0 / 0
Как хранить адреса в БД?
    #39762216
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо же, действительно.
Но при этом: https://www.gnivc.ru/inf_provision/classifiers_reference/kladr/
выгрузка адресных сведений в формате КЛАДР 4.0 будет осуществляться до 31.12.2017г. После 31.12.2017г сведения из ГАР будут выгружаться только в формате ФИАС.
...
Рейтинг: 0 / 0
Как хранить адреса в БД?
    #39762217
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.Надо же, действительно.
Но при этом: https://www.gnivc.ru/inf_provision/classifiers_reference/kladr/
выгрузка адресных сведений в формате КЛАДР 4.0 будет осуществляться до 31.12.2017г. После 31.12.2017г сведения из ГАР будут выгружаться только в формате ФИАС.

и тем не менее, посмотреть можно(как это делают многие банки, например), просто потому что кладр на данный момент может иметь то, чего нет в ФИАС.
...
Рейтинг: 0 / 0
Как хранить адреса в БД?
    #39762223
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВ целях унификации адресных сведений, содержащихся в различных информационных ресурсах, с учетом предоставления переходного периода для модификации соответствующих информационных систем, выгрузка адресных сведений в формате КЛАДР 4.0 будет осуществляться до 31.12.2017г. После 31.12.2017г сведения из ГАР будут выгружаться только в формате ФИАС.
Очевидно речь идет о том, что ГНИВЦ после 31.12.2017г загружает адреса в формате ФИАС

А КЛАДР как был, так и останется.
...
Рейтинг: 0 / 0
Как хранить адреса в БД?
    #39762537
tasyusha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
О, книжка Харрингтона. Пацан складывает все в таблицу customer и не парится. Че, не нормализовано?

...
Рейтинг: 0 / 0
Как хранить адреса в БД?
    #39762575
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tasyusha,

customer != user
...
Рейтинг: 0 / 0
Как хранить адреса в БД?
    #39762619
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tasyusha,

Первое что надо сделать, это проимпортировать ФИАС (бывший кладр)

Но всё зависит от постановки задачи и требуемых операций от адресов.


Что такое проблема вертикальной дубликации осталось загадкой...
...
Рейтинг: 0 / 0
Как хранить адреса в БД?
    #39762712
Cane Cat Fisher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tasyushaпочему меня должно смущать, что у меня в таблице 2000 Москв, а 2000 Андреев - это нормально?
Потому что эти 2000 Москв - это одна сущность. И если ее переименуют в Старые Васюки, придется менять 2000 строк, а это то, чего хотят избежать с помощью нормализации.

А Андрей само по себе - это не сущность, это атрибут человека. Если даже человек Андрей решить через суд сменить себе имя на Сергей и принесет новые документы, переименовывать нужно будет его одного - апдейтить одну строку, и это нормально. Не существует такой ситуации, когда всех Андреев пришлось бы переименовывать в Сергеев.
...
Рейтинг: 0 / 0
25 сообщений из 55, страница 1 из 3
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Как хранить адреса в БД?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]