[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Много JOINов
Страницы: 1, 2
paul85
Здравствуйте, уважаемые форумчане!

Вот такой вопрос возник у меня: есть таблица, в которой 10 полей являются, ну как бы сказать, справочными. То есть в поле, например, город, указывается ID. А расшифровка хранится в другой таблице. Обычное отношение один-ко-многим. Обычные справочники, ничего нового.

Но у меня их аж 10 штук! И когда нужно собрать полную информацию, приходится делать 10 джоинов. Вот меня данный момент как раз и смущает. Нормально ли это? Как грамотные люди решают подобные задачи? Может быть отдельными запросами, но тоже звучит не слишком изящно.

Подскажите, плиз. Заранее благодарен!
Valick
бытует мнение, что болше четырех джоинов уже не рентабильно.

_____________
Стимулятор ~yoomoney - 41001303250491
chee
paul85 у меня на работе бывает по 10 джойнов, а иногда и больше, но это в основном отчеты. Если у вас все таки другие задачи и вы замечаете существенный оверхэд при выполнении, то рекомендую задуматься о денормализации БД или пересмотреть запрос. Можно также поиграться с кэшем как на стороне БД, так и на стороне серверного языка.

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
Valick
chee, меня вот это смущает
Цитата
в поле, например, город, указывается ID. А расшифровка хранится в другой таблице

хотя и денормализация вещь нужная, но её тоже не надо лепить на ровном месте
ну а уж "играть кешем на стороне БД" необходимо вне зависимости от количества джоинов
paul85, общий вопрос не может претендовать на конкретный ответ

_____________
Стимулятор ~yoomoney - 41001303250491
T1grOK
Цитата (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
T1grOK
Если запрос отрабатывает быстро, то не вижу смысла беспокоиться, иначе, explain и смотреть, сколько, чего и почему.

_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
sergeiss
Согласен с T1grOK, не вижу повода для беспокойства при правильной организации БД (в частности, при правильных индексах).


_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
linker
Всё зависит от задач и уровня посещаемости. Если эти 10 джойнов не напрягают, то думаю стоит забить, но если появляются просадки, то от джойнов стоит избавляться, а также стоит избавляться от нормализации, естественно при условии, что индексы исчерпали свою эффективность.

_____________
Gear Framework
Gear Framework на Github
sergeiss
Цитата (linker @ 4.01.2014 - 00:04)
а также стоит избавляться от нормализации

Это зачем???

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
AllesKlar
Цитата (sergeiss @ 4.01.2014 - 04:23)
Цитата (linker @ 4.01.2014 - 00:04)
а также стоит избавляться от нормализации

Это зачем???

Для более быстрого чтения данных.

Запись будет медленнее, т.к. придется писать/обновлять больше количество данных, а чтение будет быстрее, т.к. будет обращение к меньшему количеству таблиц.



_____________
[продано копирайтерам]
linker
sergeiss
Ну как бы за меня объяснили.

_____________
Gear Framework
Gear Framework на Github
sergeiss
AllesKlar, спасибо за объяснение wink.gif Это очевидно, что ради этого предлагалось. Только проблема в том, что я подразумевал, вобщем-то, что при де-нормализации будет потеряно многое. Ради чего нормализация и делается.
Выиграв в одном, можно потерять в другом. И не факт, что в среднем будет в плюс.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
linker
sergeiss
Денормализация должна происходить с умом. Но прежде кэш и индексы, денормализация дело последнее.

_____________
Gear Framework
Gear Framework на Github
GET
Подытожу за ТС результат ответов, результат 0, как и следовало ожидать. Без конкретных данных и тестов ответить на такой вопрос невозможно, но все, все же задают такие вопросы надеясь не прогадать и я тоже задаю, а что делать остается.

smile.gif

p.s. Надеюсь всем понятно, что это я с юмором написал.

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
paul85
Вот и я сижу соображаю над выводами. =)

Накопал, что INNER JOIN быстрее чем LEFT JOIN. Поэтому какие-то поля сделаю одним, а некоторые другим. Начнет притормаживать расставлю ключи. Пока их нет - в основной таблице обычные поля INT.

Учитывая общий ожидаемый объем данных для основной таблицы максимум в 10к строк и не более 100 записей в каждом из справочников полагаю проблем не должен испытать никаких.

Для меня важнее было понять, нормально ли городить 10 джоинов в одном запросе или это, скажем так, глупость. Говнокод, типа... Он же тоже работает!
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.