powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Несколько таблиц со связью один к одному. Объединять или не объединять вот в чем вопрос !
12 сообщений из 12, страница 1 из 1
Несколько таблиц со связью один к одному. Объединять или не объединять вот в чем вопрос !
    #35152387
J_Developer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сейчас я еще на этапе проектирования базы и возник простой вопрос, незнаю какое решение принять. Вообшем есть база с таблицами:

USER (first_name, last_name, gender, birthday, about, ........)
CONTACT (email, icq, msn, url, ......)
ADDRESS (country_id, state_id, city_id, street, zip, ......)
SETTINGS (design_style, receive_msg, receive_news, receive_ads, ......)

Таблицы CONTACT, ADDRESS, SETTINGS связаны с таблицей USER один к одному.
Все как бы красиво т.е. для каждой сущности отдельная таблица.
Но возможно лучше было бы не делать CONTACT, ADDRESS, SETTINGS отдельными таблицами, а все это хранить в общей таблице юзер. Т.е. сделать денормализацию.

Посоветуйте пожалуйста, что будет лучше, оставить все как есть или объединить все эти таблицы в одну. Этот вопрос крайне важен для меня, без уверенности в своих действиях немогу двигать дальше.

Исходные и ожидаемые данные/условия :

1. База MySQL 5.1
2. Если объединить все таблицы вместе получится около 100 колонок в таблице USER
3. Ожидаемое кол-во записей ~ 5 млн. в таблице USER (если неделать объединение таблиц то каждая таблица USER, CONTACT, ADDRESS, SETTINGS будет иметь по ~5 млн.)
4. Частота выполнения запросов:
- INSERT относительно редко
- DELETE реже чем INSERT т.к. юзера будут удаляться реже чем добавляться новые
- UPDATE часто, т.е. юзер может часто изменять свои данные. Скорее всего в одной транзакции изменяться будет только одна запись в таблице.
- SELECT очень часто, потому-что при логине юзера нужен SELECT, и при поиске юзеров тоже нужен SELECT причем с большим набором условий в WHERE

Вообщем я переживаю, что если я не объединю таблицы в одну, то JOINы по таблицам с таким числом записей не есть хорошо. Если объединю то база неочень красивая получается (т.е. все сущности в одной таблице) и много колонок - 100.

Что посоветуте ? Объединять или нет ? Спасибо.
...
Рейтинг: 0 / 0
Несколько таблиц со связью один к одному. Объединять или не объединять вот в чем вопрос !
    #35152423
RVK61
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вообще то связи один к одному могут быть преобразованы в одну таблицу. Это нормально. Смысыл делить на разные таблица возникает тогда, когда тебе, в твоем приложении, редко нужны все данные сразу, а очень часто нужны данные только из основной таблицы. Таким образом решать тебе, это вопрос производительности. Лично я бы обьеденил бы все в одну таблицу, и уже в реальной системе пытался бы оптимизировать, разделяя данные по разным таблицам.
...
Рейтинг: 0 / 0
Несколько таблиц со связью один к одному. Объединять или не объединять вот в чем вопрос !
    #35152440
J_Developer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В том то и дело, что например для SELECT желательно, чтобы данные были сразу вместе, т.к.
ненадо делать лишние JOINы.

Но вот меня смущает UPDATE т.е. например для случая с раздельными таблицами:
Один юзер правит свои контакты в таблице CONTACT, другой юзер правит свой адресс в таблице ADDRESS, а третий юзер правит поле about в таблице USER. Потом все делают одновременно UPDATE. Т.к. таблицы раздельные то все эти три транзакции немешают друг другу.

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

Или я чтото не так думаю ? Поправьте или посоветуйте если чтото нетак в моем рассуждении.
...
Рейтинг: 0 / 0
Несколько таблиц со связью один к одному. Объединять или не объединять вот в чем вопрос !
    #35152456
RVK61
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Преждевременная оптимизация - корень всех зол (с)
...
Рейтинг: 0 / 0
Несколько таблиц со связью один к одному. Объединять или не объединять вот в чем вопрос !
    #35152550
J_Developer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Т.е. ты советуешь пока незаниматься оптимизацией, а оставить так-как есть,
а уже потом когда будет готов код написать ряд нагрузочных тестов и оптимизить,
т.е. таблички посклеивать, индексы правильно расставить и т.п.
...
Рейтинг: 0 / 0
Несколько таблиц со связью один к одному. Объединять или не объединять вот в чем вопрос !
    #35152558
RVK61
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
J_DeveloperТ.е. ты советуешь пока незаниматься оптимизацией, а оставить так-как есть,
а уже потом когда будет готов код написать ряд нагрузочных тестов и оптимизить,
т.е. таблички посклеивать, индексы правильно расставить и т.п.Нет я советую сделать одну таблицу. И если в будующем, когда проект будет запущен, когда база пользователей вырастет до планируемых 5 млн. и если выяснится необходимость оптимизации, и будет ясно, что самое узкое место это как раз таблица пользователей, вот тогда и принимать решение. Могу тебя заверить, что совсем не факт,что этим решением будет разделение таблицы на меньшие. Вполне возможно что в итоге ты сможешь найти более эфективные пути оптимизации (кеширование, индексирование, кластризация...)
...
Рейтинг: 0 / 0
Несколько таблиц со связью один к одному. Объединять или не объединять вот в чем вопрос !
    #35152570
RVK61
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вообще всегда советую в первую очередь задумываться не о скорости, а об удобстве разработчиков. Очевидно что с одной таблицей работать удобнее и проще чем с несколькими. Код будет понятнее, запросы проще. А решение об оптимизации принимать только тогда, когда будет очевидно, что это место самое узкое, и производительность кода неудовлетворительна. Но если изначально код прост и понятен, хорошо структурирован и читебелен, то и профилировать а потом и оптимизировать такой код одно удовольствие.
...
Рейтинг: 0 / 0
Несколько таблиц со связью один к одному. Объединять или не объединять вот в чем вопрос !
    #35153107
Kirill Razuvaev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!

>> USER (first_name, last_name, gender, birthday, about, ........)
>> CONTACT (email, icq, msn, url, ......)
>> ADDRESS (country_id, state_id, city_id, street, zip, ......)
>> SETTINGS (design_style, receive_msg, receive_news, receive_ads, ......)

Честно говоря, есть сомнения, как долго объекту USER будет достаточно одного
e-mail, адреса... То бишь, хватит ли связи "1:1".
По этому, я бы на несколько таблиц разложил в расчете на возможное
расширение.

С уважением,
Кирилл Разуваев

P.S. Да и просто работать с одной таблицей из сотни полей - едва ли удобно.


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Несколько таблиц со связью один к одному. Объединять или не объединять вот в чем вопрос !
    #35153359
J_Developer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторЧестно говоря, есть сомнения, как долго объекту USER будет достаточно одного
e-mail, адреса... То бишь, хватит ли связи "1:1".

Хватит одного точно. Email здесь высупает не только как контакт юзера, но и возможно как уникальный идентификатор. Я понимаю, что у юзера может быть кучу адресов, контактов и т.п. Но в данном случае это сильно усложняет систему.

Насчет вдруг заказчик захочет, чтобы было много email'ов - я и заказчик и исполнитель в одном лице :)
...
Рейтинг: 0 / 0
Несколько таблиц со связью один к одному. Объединять или не объединять вот в чем вопрос !
    #35154757
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
J_DeveloperХватит одного точно. Email здесь высупает не только как контакт юзера, но и возможно как уникальный идентификатор. Я понимаю, что у юзера может быть кучу адресов, контактов и т.п. Но в данном случае это сильно усложняет систему.
Насчет вдруг заказчик захочет, чтобы было много email'ов - я и заказчик и исполнитель в одном лице :)
Плохо, что в одном лице. Делать "1:1" неверно в корне. Kirill Razuvaev абсолютно прав, это вовсе не "1:1". Насчет уникальной идентификации - вообще нонсенс, вполне может быть ситуация, когда на одном телефоне или адресе несколько человек "сидят" (впрочем, делать справочник e-mail адресов я бы все же не стал в такой "не узкоспециальной" ситуации), как и ситуация, что у человека нет телефона или почты (или нет временно), или что-то типа "если не отвечает, позвонить тому-то, спросить/передать то-то". Про адреса вообще промолчу. Информация о контакте должна быть по возможности вся, чтобы контакт был доступен. Если человек уехал в другой регион и там у него другой номер мобильного телефона - должны быть сохранены оба номера. Если вдруг на mail.ru наедут ФСБшники, контакт должен быть доступен через gmail, или yandex, или еще как.
PS Все совпадения с реальностью считать случайными.
PPS Пока что Ваше творчество не тянет даже на курсовую, если честно.
...
Рейтинг: 0 / 0
Несколько таблиц со связью один к одному. Объединять или не объединять вот в чем вопрос !
    #35154940
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
J_Developer я и заказчик и исполнитель в одном лице :)Но "я" сегдня и "я" завтра -иногда сильно разные лица.
...
Рейтинг: 0 / 0
Несколько таблиц со связью один к одному. Объединять или не объединять вот в чем вопрос !
    #35155172
RVK61
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ModelR J_Developer я и заказчик и исполнитель в одном лице :)Но "я" сегдня и "я" завтра -иногда сильно разные лица.философское замечание :)
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Несколько таблиц со связью один к одному. Объединять или не объединять вот в чем вопрос !
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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