Здравствуйте, уважаемые форумчане!
Вот такой вопрос возник у меня: есть таблица, в которой 10 полей являются, ну как бы сказать, справочными. То есть в поле, например, город, указывается ID. А расшифровка хранится в другой таблице. Обычное отношение один-ко-многим. Обычные справочники, ничего нового.
Но у меня их аж 10 штук! И когда нужно собрать полную информацию, приходится делать 10 джоинов. Вот меня данный момент как раз и смущает. Нормально ли это? Как грамотные люди решают подобные задачи? Может быть отдельными запросами, но тоже звучит не слишком изящно.
Подскажите, плиз. Заранее благодарен!
бытует мнение, что болше четырех джоинов уже не рентабильно.
_____________
Стимулятор ~yoomoney - 41001303250491
paul85 у меня на работе бывает по 10 джойнов, а иногда и больше, но это в основном отчеты. Если у вас все таки другие задачи и вы замечаете существенный оверхэд при выполнении, то рекомендую задуматься о денормализации БД или пересмотреть запрос. Можно также поиграться с кэшем как на стороне БД, так и на стороне серверного языка.
_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
chee, меня вот это смущает
Цитата |
в поле, например, город, указывается ID. А расшифровка хранится в другой таблице |
хотя и денормализация вещь нужная, но её тоже не надо лепить на ровном месте
ну а уж "играть кешем на стороне БД" необходимо вне зависимости от количества джоинов
paul85, общий вопрос не может претендовать на конкретный ответ
_____________
Стимулятор ~yoomoney - 41001303250491
Цитата (Valick @ 3.01.2014 - 17:02) |
бытует мнение, что болше четырех джоинов уже не рентабильно. |
Смотря какой в итоге запрос, если все вписывается в индексы, то будет работать очень быстро. В моей CMS есть запрос и 6 джойнов, все работает, если не молниеносно, то почти молниеносно.
Нужно смотреть по ситуации.
_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
Если запрос отрабатывает быстро, то не вижу смысла беспокоиться, иначе, explain и смотреть, сколько, чего и почему.
_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
sergeiss
3.01.2014 - 23:02
Согласен с
T1grOK, не вижу повода для беспокойства при правильной организации БД (в частности, при правильных индексах).
_____________
*
Хэлп по PHP*
Описалово по JavaScript *
Хэлп и СУБД для PostgreSQL*
Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги. *
"накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)
Всё зависит от задач и уровня посещаемости. Если эти 10 джойнов не напрягают, то думаю стоит забить, но если появляются просадки, то от джойнов стоит избавляться, а также стоит избавляться от нормализации, естественно при условии, что индексы исчерпали свою эффективность.
_____________
Gear FrameworkGear Framework на Github
sergeiss
4.01.2014 - 04:23
Цитата (linker @ 4.01.2014 - 00:04) |
а также стоит избавляться от нормализации |
Это зачем???
_____________
*
Хэлп по PHP*
Описалово по JavaScript *
Хэлп и СУБД для PostgreSQL*
Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги. *
"накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)
AllesKlar
4.01.2014 - 05:11
Цитата (sergeiss @ 4.01.2014 - 04:23) |
Цитата (linker @ 4.01.2014 - 00:04) | а также стоит избавляться от нормализации |
Это зачем???
|
Для более быстрого чтения данных.
Запись будет медленнее, т.к. придется писать/обновлять больше количество данных, а чтение будет быстрее, т.к. будет обращение к меньшему количеству таблиц.
_____________
[продано копирайтерам]
sergeissНу как бы за меня объяснили.
_____________
Gear FrameworkGear Framework на Github
sergeiss
4.01.2014 - 12:24
AllesKlar, спасибо за объяснение
Это очевидно, что ради этого предлагалось. Только проблема в том, что я подразумевал, вобщем-то, что при де-нормализации будет потеряно многое. Ради чего нормализация и делается.
Выиграв в одном, можно потерять в другом. И не факт, что в среднем будет в плюс.
_____________
*
Хэлп по PHP*
Описалово по JavaScript *
Хэлп и СУБД для PostgreSQL*
Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги. *
"накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)
sergeissДенормализация должна происходить с умом. Но прежде кэш и индексы, денормализация дело последнее.
_____________
Gear FrameworkGear Framework на Github
Подытожу за ТС результат ответов, результат 0, как и следовало ожидать. Без конкретных данных и тестов ответить на такой вопрос невозможно, но все, все же задают такие вопросы надеясь не прогадать и я тоже задаю, а что делать остается.
p.s. Надеюсь всем понятно, что это я с юмором написал.
_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
Вот и я сижу соображаю над выводами. =)
Накопал, что INNER JOIN быстрее чем LEFT JOIN. Поэтому какие-то поля сделаю одним, а некоторые другим. Начнет притормаживать расставлю ключи. Пока их нет - в основной таблице обычные поля INT.
Учитывая общий ожидаемый объем данных для основной таблицы максимум в 10к строк и не более 100 записей в каждом из справочников полагаю проблем не должен испытать никаких.
Для меня важнее было понять, нормально ли городить 10 джоинов в одном запросе или это, скажем так, глупость. Говнокод, типа... Он же тоже работает!
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.