|
|
|
Несколько таблиц со связью один к одному. Объединять или не объединять вот в чем вопрос !
|
|||
|---|---|---|---|
|
#18+
Сейчас я еще на этапе проектирования базы и возник простой вопрос, незнаю какое решение принять. Вообшем есть база с таблицами: 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. Что посоветуте ? Объединять или нет ? Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2008, 13:18 |
|
||
|
Несколько таблиц со связью один к одному. Объединять или не объединять вот в чем вопрос !
|
|||
|---|---|---|---|
|
#18+
Вообще то связи один к одному могут быть преобразованы в одну таблицу. Это нормально. Смысыл делить на разные таблица возникает тогда, когда тебе, в твоем приложении, редко нужны все данные сразу, а очень часто нужны данные только из основной таблицы. Таким образом решать тебе, это вопрос производительности. Лично я бы обьеденил бы все в одну таблицу, и уже в реальной системе пытался бы оптимизировать, разделяя данные по разным таблицам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2008, 13:59 |
|
||
|
Несколько таблиц со связью один к одному. Объединять или не объединять вот в чем вопрос !
|
|||
|---|---|---|---|
|
#18+
В том то и дело, что например для SELECT желательно, чтобы данные были сразу вместе, т.к. ненадо делать лишние JOINы. Но вот меня смущает UPDATE т.е. например для случая с раздельными таблицами: Один юзер правит свои контакты в таблице CONTACT, другой юзер правит свой адресс в таблице ADDRESS, а третий юзер правит поле about в таблице USER. Потом все делают одновременно UPDATE. Т.к. таблицы раздельные то все эти три транзакции немешают друг другу. А если все таблицы совмещены в одну, то получается, что одна таблица вовлечена сразу в три транзакции одноврменно, что может привести к некоторой потере производительности. Или я чтото не так думаю ? Поправьте или посоветуйте если чтото нетак в моем рассуждении. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2008, 14:18 |
|
||
|
Несколько таблиц со связью один к одному. Объединять или не объединять вот в чем вопрос !
|
|||
|---|---|---|---|
|
#18+
Преждевременная оптимизация - корень всех зол (с) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2008, 14:38 |
|
||
|
Несколько таблиц со связью один к одному. Объединять или не объединять вот в чем вопрос !
|
|||
|---|---|---|---|
|
#18+
Т.е. ты советуешь пока незаниматься оптимизацией, а оставить так-как есть, а уже потом когда будет готов код написать ряд нагрузочных тестов и оптимизить, т.е. таблички посклеивать, индексы правильно расставить и т.п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2008, 16:54 |
|
||
|
Несколько таблиц со связью один к одному. Объединять или не объединять вот в чем вопрос !
|
|||
|---|---|---|---|
|
#18+
J_DeveloperТ.е. ты советуешь пока незаниматься оптимизацией, а оставить так-как есть, а уже потом когда будет готов код написать ряд нагрузочных тестов и оптимизить, т.е. таблички посклеивать, индексы правильно расставить и т.п.Нет я советую сделать одну таблицу. И если в будующем, когда проект будет запущен, когда база пользователей вырастет до планируемых 5 млн. и если выяснится необходимость оптимизации, и будет ясно, что самое узкое место это как раз таблица пользователей, вот тогда и принимать решение. Могу тебя заверить, что совсем не факт,что этим решением будет разделение таблицы на меньшие. Вполне возможно что в итоге ты сможешь найти более эфективные пути оптимизации (кеширование, индексирование, кластризация...) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2008, 17:05 |
|
||
|
Несколько таблиц со связью один к одному. Объединять или не объединять вот в чем вопрос !
|
|||
|---|---|---|---|
|
#18+
Вообще всегда советую в первую очередь задумываться не о скорости, а об удобстве разработчиков. Очевидно что с одной таблицей работать удобнее и проще чем с несколькими. Код будет понятнее, запросы проще. А решение об оптимизации принимать только тогда, когда будет очевидно, что это место самое узкое, и производительность кода неудовлетворительна. Но если изначально код прост и понятен, хорошо структурирован и читебелен, то и профилировать а потом и оптимизировать такой код одно удовольствие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2008, 17:13 |
|
||
|
Несколько таблиц со связью один к одному. Объединять или не объединять вот в чем вопрос !
|
|||
|---|---|---|---|
|
#18+
Добрый день! >> 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2008, 11:05 |
|
||
|
Несколько таблиц со связью один к одному. Объединять или не объединять вот в чем вопрос !
|
|||
|---|---|---|---|
|
#18+
авторЧестно говоря, есть сомнения, как долго объекту USER будет достаточно одного e-mail, адреса... То бишь, хватит ли связи "1:1". Хватит одного точно. Email здесь высупает не только как контакт юзера, но и возможно как уникальный идентификатор. Я понимаю, что у юзера может быть кучу адресов, контактов и т.п. Но в данном случае это сильно усложняет систему. Насчет вдруг заказчик захочет, чтобы было много email'ов - я и заказчик и исполнитель в одном лице :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2008, 14:13 |
|
||
|
Несколько таблиц со связью один к одному. Объединять или не объединять вот в чем вопрос !
|
|||
|---|---|---|---|
|
#18+
J_DeveloperХватит одного точно. Email здесь высупает не только как контакт юзера, но и возможно как уникальный идентификатор. Я понимаю, что у юзера может быть кучу адресов, контактов и т.п. Но в данном случае это сильно усложняет систему. Насчет вдруг заказчик захочет, чтобы было много email'ов - я и заказчик и исполнитель в одном лице :) Плохо, что в одном лице. Делать "1:1" неверно в корне. Kirill Razuvaev абсолютно прав, это вовсе не "1:1". Насчет уникальной идентификации - вообще нонсенс, вполне может быть ситуация, когда на одном телефоне или адресе несколько человек "сидят" (впрочем, делать справочник e-mail адресов я бы все же не стал в такой "не узкоспециальной" ситуации), как и ситуация, что у человека нет телефона или почты (или нет временно), или что-то типа "если не отвечает, позвонить тому-то, спросить/передать то-то". Про адреса вообще промолчу. Информация о контакте должна быть по возможности вся, чтобы контакт был доступен. Если человек уехал в другой регион и там у него другой номер мобильного телефона - должны быть сохранены оба номера. Если вдруг на mail.ru наедут ФСБшники, контакт должен быть доступен через gmail, или yandex, или еще как. PS Все совпадения с реальностью считать случайными. PPS Пока что Ваше творчество не тянет даже на курсовую, если честно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2008, 11:35 |
|
||
|
Несколько таблиц со связью один к одному. Объединять или не объединять вот в чем вопрос !
|
|||
|---|---|---|---|
|
#18+
J_Developer я и заказчик и исполнитель в одном лице :)Но "я" сегдня и "я" завтра -иногда сильно разные лица. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2008, 12:21 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=35152387&tid=1544006]: |
0ms |
get settings: |
6ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
179ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
| others: | 225ms |
| total: | 501ms |

| 0 / 0 |
