powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Вопрос по проектированию БД
25 сообщений из 63, страница 1 из 3
Вопрос по проектированию БД
    #40007963
Здравствуйте. Помогите пожалуйста разобраться. В проектируемой базе есть таблица заказов и таблица юзеров. В каждой из них нужно хранить информацию об адресе. Юзер при регистрации в приложении указывает свой домашний адрес, а при формировании заказа может указать произвольный адрес либо оставить свой (он скопируется в новую запись заказа). Соответственно есть 2 варианта:

1. Хранить адреса как в таблице юзеров, так и в таблице заказов.
2. Вынести адреса в отдельную таблицу и связать их внешним ключом с юзерами и заказами.

В принципе 2й вариант выглядит логичнее т.к. адреса по сути отдельная сущность. Но я не уверен что это лучшее решение с токи зрения производительности. Таблица заказов в последствии будет огромной, а каждому заказу всегда будет соответствовать один адрес. В большинстве случаев адреса не будут использоваться в отрыве от заказов. То есть при каждом обращении к заказу будет джойнится таблица адресов. На сколько я понимаю любой джоин между таблицами ест больше ресурсов железа чем обращение к одной таблице, но с бОльшим количеством полей. Плюс вариант №2 добавляет некоторые неудобства при создании нового юзера или заказа, т.к. при сохранении регистрационной формы нужно сначала создать запись юзера/заказа, вернуть id новой записи для создания внешнего ключа и только потом делать новую запись в таблице адресов. Без особой необходимости не хотелось бы добавлять лишнюю логику в приложение.

Какой вариант на ваш взгляд лучше с точки зрения производительности? Буду благодарен за любую помощь.
...
Рейтинг: 0 / 0
Вопрос по проектированию БД
    #40008002
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр1918,

конечно второй. Производительность совершенно не причём. Нужно только правильно индексы и внешние ключи создать. А первый вариант скорее всего будет противоречить нормальным формам.
...
Рейтинг: 0 / 0
Вопрос по проектированию БД
    #40008008
Фотография Megabyte
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр1918

1) На сколько я понимаю любой джоин между таблицами ест больше ресурсов железа чем обращение к одной таблице, но с бОльшим количеством полей.
2) Плюс вариант №2 добавляет некоторые неудобства при создании нового юзера или заказа, т.к. при сохранении регистрационной формы нужно сначала создать запись юзера/заказа, вернуть id новой записи для создания внешнего ключа и только потом делать новую запись в таблице адресов. Без особой необходимости не хотелось бы добавлять лишнюю логику в приложение.

1) Этот бред чаще всего распространяют те, кто плохо знает sql и не умеет проектировать БД.
2) Неудобства да, это ж программировать надо. Про нормализацию данных слышали?

А вообще отдельную таблицу адресов стоит делать, если:
1) Адресов будет все же значительно меньше, чем заказов. С учетом, что один и тот же юзер будет делать несколько заказов и с 80% вероятностью на один и тот же адрес. Тогда вы, как минимум, сэкономите пространство, т.к. адрес будет храниться 1 раз.
2) Если планируете как-то оперировать сущностью "адреса", какие-то аналитические\статистические отчеты делать. Например, кол-во заказов по городам.
Тогда бы еще посоветовал разбить адрес на составляющие: регион, город, улица, дом, квартира.
...
Рейтинг: 0 / 0
Вопрос по проектированию БД
    #40008025
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр1918,

ID пользователя, ID заказа в таблице Адреса?
А если два пользователя проживают по одному и тому же адресу? Или несколько заказов на один и тот же адрес?

Планируете дублировать данные? Думаете это хорошо с точки зрения производительности?
...
Рейтинг: 0 / 0
Вопрос по проектированию БД
    #40008049
Megabyte
2) Если планируете как-то оперировать сущностью "адреса", какие-то аналитические\статистические отчеты делать. Например, кол-во заказов по городам.
Тогда бы еще посоветовал разбить адрес на составляющие: регион, город, улица, дом, квартира.

взрослые люди подключают аж яндексовые базы адресов для правильной доставки
...
Рейтинг: 0 / 0
Вопрос по проектированию БД
    #40008092
Злой Бобр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр1918

1. Хранить адреса как в таблице юзеров, так и в таблице заказов.
2. Вынести адреса в отдельную таблицу и связать их внешним ключом с юзерами и заказами.
...
Какой вариант на ваш взгляд лучше с точки зрения производительности? Буду благодарен за любую помощь.

2-й вариант. Только адрес понятие не простое, там как минимум несколько таблиц (страна, область, улица, ...). Поэтому открываем гугл карту и пробуем вбивать адрес (примерно так с подбором вариантов должно быть и у вас). Следовательно должна быть связь Пользователь:АдресаПользователя, Клиент:АдресаДоставки. Тогда в приложении пользователь сможет быстро и понятно выбирать из существующих адресов, либо создавать новый.
Что касается производительности - думаю что просадка в 2-3% по сравнению с удобством - вполне приемлемый вариант. Если сильно станет напрягать то поднимете кластер и вуаля.
...
Рейтинг: 0 / 0
Вопрос по проектированию БД
    #40008095
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр1918Но я не уверен что это лучшее решение с токи зрения производительности.

Это плохое решение с любой точки зрения. Адрес - не сущность, это чистый атрибут.
Сущностью может быть дом, квартира или город. Но для твоей задачи курьера эти сущности не
нужны.

Ты же не собираешься всерьёз анализировать свои доставки, группируя их по улицам?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вопрос по проектированию БД
    #40008114
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр1918,

IMHO Только 1-й вариант. 2 вариант выглядит заманчиво из-за аспекта нормализации но только на первый взгляд. Ключевой момент тут: если при добавлении заказа вы не будете проверять уникальност адресса, то у вас всегда будет 1:1 соотношение.
Разбивать на две таблицы ни поизводительности не прибавит, ни места не сэкономит.
Или вы собираетесь вести логическую "уникальность" адресса и при повторяюшемся адрессе исползовать уже имейшуйся запись? Тут ешё больше проблем наворотите.
...
Рейтинг: 0 / 0
Вопрос по проектированию БД
    #40008146
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron
Или вы собираетесь вести логическую "уникальность" адресса и при повторяюшемся адрессе исползовать уже имейшуйся запись? Тут ешё больше проблем наворотите.

А если он хочет просто дать пользователю выбор аля Дом, Работа, Дача?
Еду что-ли никогда не заказывали по интернету?
...
Рейтинг: 0 / 0
Вопрос по проектированию БД
    #40008149
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр1918
Юзер при регистрации в приложении указывает свой домашний адрес, а при формировании заказа может указать произвольный адрес либо оставить свой (он скопируется в новую запись заказа).

Типа мне как пользователю предлагается каждый раз когда я хочу, чтобы заказ доставили на работу, а не домой, вводить заного один и тот же адрес?
Удобно
...
Рейтинг: 0 / 0
Вопрос по проектированию БД
    #40008159
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA
mikron
Или вы собираетесь вести логическую "уникальность" адресса и при повторяюшемся адрессе исползовать уже имейшуйся запись? Тут ешё больше проблем наворотите.

А если он хочет просто дать пользователю выбор аля Дом, Работа, Дача?

Какие образом это возможное желание "дать пользователю выбор" влияет или ограничивает выбор дизайна?
...
Рейтинг: 0 / 0
Вопрос по проектированию БД
    #40008160
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA

Типа мне как пользователю предлагается каждый раз когда я хочу, чтобы заказ доставили на работу, а не домой, вводить заного один и тот же адрес?
Удобно

не смешивайте дизайн таблиц и дизайн UI.
...
Рейтинг: 0 / 0
Вопрос по проектированию БД
    #40008189
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron
skyANA

Типа мне как пользователю предлагается каждый раз когда я хочу, чтобы заказ доставили на работу, а не домой, вводить заного один и тот же адрес?
Удобно

не смешивайте дизайн таблиц и дизайн UI.

А я и не смешиваю.

Просто дизайн таблиц какбы завязан на предметную область, где существует некий бизнес процесс.
И плясать надо от этого, а не от сферических логических "уникальностей" адреса.

Я как пользователь регистрируюсь, указываю свой домашний адрес...

Уже вопрос: а на фига вам мой домашний адрес? Предпочтительный адрес доставки? Хорошо.
А сделайте так, чтобы было удобно при заказе указывать другой, рабочий например. В один клик...

И после того как разберёте кейсы, что нужны пользователям вашей системы, после этого и проектируйте.
...
Рейтинг: 0 / 0
Вопрос по проектированию БД
    #40008232
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Александр1918,

В общем случае не нужно разбивать адрес на улицы, дома и т.д, отдельными атрибутами: страна, регион/штат, город, почтовый индекс; все остальное одним атрибутом: ул. Такая то, д. такой то ..., с рекомендацией заполнять так как принято в стране получения посылки.

У пользователя может быть несколько адресов, у этих адресов могут быть атрибуты: адрес доставки - да/нет, по умолчанию (может устанавливаться только для одного из адресов доставки пользователя), возможны другие атрибуты, например платежный адрес - да/нет. Т.е. в таблице адресов пользователя будет ссылка на идентификатор пользователя, ссылки на идентификатор заказа там разумеется быть не должно.

В таблицу заказов либо необходимая информация при задании адреса просто копируется, либо указывается ссылка на таблицу адресов пользователя, если указывается ссылка, то при изменении или удалении адреса использовавшегося в заказах, никакого изменения или удаления на самом деле не допускается, вместо этого строка таблицы адреса закрывается (для этого вводится дополнительный атрибут) и больше пользователю не показывается, но в системе остается, а вместо нее создается новая строка адреса, которая видна пользователю, таким образом адреса на которые были оформлены заказы задним числом не меняются.
...
Рейтинг: 0 / 0
Вопрос по проектированию БД
    #40008249
Megabyte
Александр1918

1) На сколько я понимаю любой джоин между таблицами ест больше ресурсов железа чем обращение к одной таблице, но с бОльшим количеством полей.
2) Плюс вариант №2 добавляет некоторые неудобства при создании нового юзера или заказа, т.к. при сохранении регистрационной формы нужно сначала создать запись юзера/заказа, вернуть id новой записи для создания внешнего ключа и только потом делать новую запись в таблице адресов. Без особой необходимости не хотелось бы добавлять лишнюю логику в приложение.

1) Этот бред чаще всего распространяют те, кто плохо знает sql и не умеет проектировать БД.

Из того что знаю по опыту + то что нагуглил - все же запрос с join - это более ресурсоемкая операция чем простая выборка из таблицы. Поправьте если ошибаюсь. Желательно с ссылкой на ресурс с пояснением. Для общего развития так сказать.

Megabyte

А вообще отдельную таблицу адресов стоит делать, если:
1) Адресов будет все же значительно меньше, чем заказов. С учетом, что один и тот же юзер будет делать несколько заказов и с 80% вероятностью на один и тот же адрес. Тогда вы, как минимум, сэкономите пространство, т.к. адрес будет храниться 1 раз.
2) Если планируете как-то оперировать сущностью "адреса", какие-то аналитические\статистические отчеты делать. Например, кол-во заказов по городам.
Тогда бы еще посоветовал разбить адрес на составляющие: регион, город, улица, дом, квартира.

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

skyANA
Александр1918,

ID пользователя, ID заказа в таблице Адреса?
А если два пользователя проживают по одному и тому же адресу? Или несколько заказов на один и тот же адрес?

Планируете дублировать данные? Думаете это хорошо с точки зрения производительности?

Думаю дублировать данные далеко не идеальный подход, но в данном случае, избегать этого не имеет особого смысла. Исходя из специфики задачи, заказов на один и тот же адрес будет немного, в худшем случае до 10 в год, в среднем 1-2. В целом не критично.

Злой Бобр
... Следовательно должна быть связь Пользователь:АдресаПользователя, Клиент:АдресаДоставки. Тогда в приложении пользователь сможет быстро и понятно выбирать из существующих адресов, либо создавать новый...

Я не совсем понял. То есть Вы предлагаете сформировать уникальный список из уже внесенных адресов (со всеми вытекающими преобразованиями структуры БД) и дать возможность юзеру выбирать из выпадающего списка, а если адреса в списке нет, то дать возможность внести новый адрес? С учетом того, что при внесении адрес детализируется как до квартиры, так и до дома в целом, то список получится огромный и неочевидный (например ул.Сидорова 8, кв.777 и просто ул.Сидорова 8 - будут два разных адреса). Скорее это запутает пользователя. Если идти по сложному пути и попытаться сформировать уникальный список адресов, то думаю что юзер должен всегда вносить адрес в ручную, а последующие проверки на уникальность делать уже после отправки формы и перед сохранением в базу.

Dimitry Sibiryakov

Александр1918Но я не уверен что это лучшее решение с токи зрения производительности.

...
Ты же не собираешься всерьёз анализировать свои доставки, группируя их по улицам?..

Аналитические отчеты планируются. По адресам в том числе, но как я писал выше - всегда в контексте заказа.

mikron
Александр1918,

IMHO Только 1-й вариант. 2 вариант выглядит заманчиво из-за аспекта нормализации но только на первый взгляд. Ключевой момент тут: если при добавлении заказа вы не будете проверять уникальност адресса, то у вас всегда будет 1:1 соотношение.
Разбивать на две таблицы ни поизводительности не прибавит, ни места не сэкономит.
Или вы собираетесь вести логическую "уникальность" адресса и при повторяюшемся адрессе исползовать уже имейшуйся запись? Тут ешё больше проблем наворотите.

Вы правильно поняли мои опасения. Скорее всего я попытаюсь избежать формирования уникального справочника адресов т.к. это заметно усложнит задачу и может создать проблемы при внесении и изменении адресов. И соответственно соотношение адресов к заказам будет 1:1. В итоге при вынесении адреса в отдельную таблицу я получу только условную правильность структуры базы. Но при этом я буду вынужден при любом обращении к заказам каждый раз делать джойны к таблице адресов + все неудобства с этим связанные. Что касается адресов в таблице юзеров, то они аналогично не будут использоваться в отрыве от записи юзеров.
Я все же больше склоняюсь к первому варианту. Хоть он и не совсем "красивый", но больше отвечает моей задаче.

skyANA

Уже вопрос: а на фига вам мой домашний адрес? Предпочтительный адрес доставки? Хорошо.
А сделайте так, чтобы было удобно при заказе указывать другой, рабочий например. В один клик...

И после того как разберёте кейсы, что нужны пользователям вашей системы, после этого и проектируйте.


В программе будет вестись заказ разных услуг. Ремонт например. Чаще всего их будут заказывать на домашний адрес. А при желании пользователь сможет подписаться на рассылку в которой его будут информировать о разных событиях (в рамках предоставляемых услуг) проходящих по его адресу.
...
Рейтинг: 0 / 0
Вопрос по проектированию БД
    #40008258
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр1918
Таблица заказов в последствии будет огромной

Ох эти розовые мечты....
...
Рейтинг: 0 / 0
Вопрос по проектированию БД
    #40008267
Злой Бобр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Александр1918
Таблица заказов в последствии будет огромной

Ох эти розовые мечты....

+100500 Теоретики они такие. Эх, вспомнил свою наивную молодость и прям прослезился.
...
Рейтинг: 0 / 0
Вопрос по проектированию БД
    #40008269
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр1918
Но я не уверен что это лучшее решение с токи зрения производительности.

Вы сейчас не готовы обдумывать производительность. Ваша задача на текущем этапе развития - сделать то, что работает, не содержит лишней информации и не вызывает острого желания выбросить это нафиг. Если Вам это удастся - можете быть уверены, что это будет работать достаточно быстро, и всяко быстрее, чем тот монстр, которого Вы родите, если сейчас будете думать о производительности.
...
Рейтинг: 0 / 0
Вопрос по проектированию БД
    #40008278
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр1918Аналитические отчеты планируются. По адресам в том числе

Чисто из любопытства: зачем? Что-то типа "на третьей строительной заказов на 3% меньше,
чем на второй, надо туда послать пару людей раскидать рекламу по ящикам"?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вопрос по проектированию БД
    #40008319
17-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр1918,

1. таблица user (ид - имя - ...)
2. таблица user_address (ид юзера - тип адреса [работа, дом, ...] - флаг "использовать по умолчанию" - страна - ... - дом) - для каждого юзера своя копия адресов (работа/дом), даже если по одному адресу живут несколько юзеров, иначе если один поменяет - у всех поменяется
3. таблица order (ид - данные заказа - страна - ... - дом) - при выборе адреса пользователем, выбранный адрес копируется в эти поля, иначе если пользователь через год поменяет адрес - то у старых заказов он тоже поменяется

в будущем поля (страна - ... - дом) из таблиц user_address и order можно будет выделить в отдельную таблицу address, если понадобится
...
Рейтинг: 0 / 0
Вопрос по проектированию БД
    #40008378
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
17-77
3. таблица order (ид - данные заказа - страна - ... - дом) - при выборе адреса пользователем, выбранный адрес копируется в эти поля, иначе если пользователь через год поменяет адрес - то у старых заказов он тоже поменяется

И Вы действительно именно так проектировали что-то, находящееся в эксплуатации?
...
Рейтинг: 0 / 0
Вопрос по проектированию БД
    #40008380
17-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer,

к чему именно претензия? к полям адреса внутри таблицы order или к копированию адреса?
...
Рейтинг: 0 / 0
Вопрос по проектированию БД
    #40008384
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
17-77
к чему именно претензия? к полям адреса внутри таблицы order или к копированию адреса?

К тому, что, дойдя до откровенно неудачных последствий, Вы не делаете шаг назад и не задумываетесь - а хорошо ли принятое решение и не стоит ли его поменять.
...
Рейтинг: 0 / 0
Вопрос по проектированию БД
    #40008394
17-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer,

более детально распишите, где тут неудачные последствия
...
Рейтинг: 0 / 0
Вопрос по проектированию БД
    #40008397
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
17-77
более детально распишите, где тут неудачные последствия

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


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