172 похожих чатов

Всем привет! Сейчас пытаюсь спроектировать бд по трем первым нормальным

формам (занимаюсь этим впервые), и стоит вопрос. Если делать по НФ, таблицы получаются большими, и их выходит много. Но мне при запросах с бэкенда нужно разом доставать значения с большого количества таблиц.

Следовательно, не будет ли это резать скорость, учитывая, что будет много JOIN'ов?

16 ответов

3 просмотра

Тут всегда баланс надо искать. Оптимизатор СУБД в реальности может эффективно работать при джойнах менее 5-6 таблиц. Если нормализация делает их больше, надо денормализовывать

Sardor-Tukhtakhodjaev Автор вопроса
Дмитрий Лукьянов
Тут всегда баланс надо искать. Оптимизатор СУБД в ...

понял, спасибо! Я думал, нормальные формы — как золотое правило, от которого нельзя отходить

Просто любопытство, сколько джоинов будет в одном запросе +- если вы сделаете 3нф?

Sardor-Tukhtakhodjaev Автор вопроса
Serhii
Просто любопытство, сколько джоинов будет в одном ...

я пока не все продумал и создал, но предполагаю, что будет как раз примерно 5

А теперь правильный ответ: на поставленный вопрос сможет ответить только EXPLAIN (ANALYZE, BUFFERS)

Sardor-Tukhtakhodjaev Автор вопроса
Михаил Шурутов
А теперь правильный ответ: на поставленный вопрос ...

спасибо, обязательно выполню его, но пока таблицы не готовы, чтобы делать запросы

Sardor Tukhtakhodjaev
понял, спасибо! Я думал, нормальные формы — как зо...

Ну, смотрите. Есть формула факториала. Это по сути число перестановок чисел. Вот её же можно применить к джойнам. Факториал 6 - это уже 620 вариантов, которые надо перебрать. Так что, в идеале бы вообще три-четыре использовать 3! = 6 4! = 24 Причём к этому надо прибавлять не только джойны, а ещё и индексы в условиях. Там тоже есть варианты использовать индекс или не использовать. Тоже набегает... В PG я не знаю лимит. В Oracle стоит перебор 1000 варинатов планов. Какой лучший из них найдёт, такой и будет использоваться. Если лучший не успели перебрать, то не повезло... Так что, чистая 3НФ нормализация - это на бумаге хорошо. В жизни приходится приходить к компромису, и проводить денормализацию местами...

Sardor-Tukhtakhodjaev Автор вопроса
Дмитрий Лукьянов
Ну, смотрите. Есть формула факториала. Это по сути...

я правильно понимаю, что сложность запроса (если правильно так выражаться) соразмерна факториалу количества джоинов? Хочу в ближайшее время купить книгу по РСУБД и почитать, но пока есть нужда спроектировать БД прямо сейчас, и приходится задавать глупые вопросы)

Sardor Tukhtakhodjaev
я правильно понимаю, что сложность запроса (если п...

Да. Факториал - это как раз число вариантов соединений, которые придётся перлопатить, и сравнить их стоимость..

Дмитрий Лукьянов
Ну, смотрите. Есть формула факториала. Это по сути...

Я хотел бы высказать другое мнение. ;) Отвечаю Вам, т.к. у меня там есть к Вам вопрос, но обращаюсь и к @Sardorkhuja > Тут всегда баланс надо искать. Оптимизатор СУБД в реальности может эффективно работать при джойнах менее 5-6 таблиц. Может быть, это и так в какой-то СУБД, но к PostgreSQL это не относится. > Если нормализация делает их больше, надо денормализовывать Нет, не надо. Потому что это, как минимум, преждевременная оптимизация. ;) > Я думал, нормальные формы — как золотое правило, от которого нельзя отходить Да, это "золотое правило". Понимаете, как говорил Дейт, нормальные формы — это формализованный здравый смысл (не помню точную цитату). Поэтому, отступая от них, Вы идёте против здравого смысла — в "награду" получая аномалии в данных и проблемы с написанием запросов. > А денормализацию лучше делать с помошью вьювов и мат.вьювов. Денормализацию лучше не делать вообще. ;) > Факториал 6 - это уже 620 вариантов, которые Любой современный процессор переберёт менее, чем за микросекунду. Мы же не 1980-х, в самом деле... > В PG я не знаю лимит. По умолчанию — 8 from items / JOINs. И это немного на современном железе, т.е. можно смело поднимать до 10-12. > В Oracle стоит перебор 1000 варинатов планов. Что, серьёзно?! Да это же был бы просто отвратительный оптимизатор! Послушайте, я просто не могу поверить — у Вас есть ссылка? > Так что, чистая 3НФ нормализация - это на бумаге хорошо. Это в принципе хорошо. В жизни — особенно, если данные Вам дороги. > В жизни приходится приходить к компромису, и проводить денормализацию местами... Хмм... зависит от того, что именно тут понимается под "денормализацией".

Sardor-Tukhtakhodjaev Автор вопроса
Yaroslav Schekin
Я хотел бы высказать другое мнение. ;) Отвечаю Вам...

сложно сделать выбор (особенно, когда не читал книг), но пока вроде не так много джоинов выходит с 3нф, везет))

Sardor Tukhtakhodjaev
сложно сделать выбор (особенно, когда не читал кни...

так основная цель не оптимизация джойнов, а грамотное управление данными

Sardor Tukhtakhodjaev
сложно сделать выбор (особенно, когда не читал кни...

А тут выбор-то простой — можно быстро "портить" данные (если игнорировать нормализацию), или ещё быстрее их нормально обрабатывать (если нет). ;) Шутки шутками, но не так уж редко "денормализация" и т.п. заканчивается тем, что в плане производительности (по результатам измерений), что всё становится ещё хуже... а иногда и данные начинают искажаться. Т.е. к этому нужно очень аккуратно подходить, а не в стиле — "увидел 5 JOIN-ов, в [рефлекторном] ужасе побежал денормализовывать". ;)

Yaroslav Schekin
Я хотел бы высказать другое мнение. ;) Отвечаю Вам...

>>Тут всегда баланс надо искать. Оптимизатор СУБД в реальности может эффективно работать при джойнах менее 5-6 таблиц. >Может быть, это и так в какой-то СУБД, но к PostgreSQL это не относится. А данные из скольки таблиц pgsql может эффективно join-нить? Не подскажите как поискать best practices для join-ов более 3 таблиц в pgsql?

Alexander E
>>Тут всегда баланс надо искать. Оптимизатор СУБД ...

> А данные из скольки таблиц pgsql может эффективно join-нить? Потенциально — из сколько угодно. Речь-то о времени планирования была. > Не подскажите как поискать best practices для join-ов более 3 таблиц в pgsql? Я не понимаю вопроса. Просто пишете запросы, зачем тут "best practices"?

Похожие вопросы

Обсуждают сегодня

я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
49
читать файл максимально быстро? странный вопрос))
zamtmn
53
Всем доброго вечера! Хочу поделиться своим злоключением с человеком, который, как оказалось сюда тоже скидывал свое резюме. Жаль, что я вашу группу не нашел раньше… человек ки...
Роман Ахмедзянов
4
How to create an OS in C? what to study?
Linus
18
Компания Elif ищет менеджера проектов, который будет заниматься поиском и ведением новых проектов. Прежде чем приступить к работе, вам нужно пройти наш недельный курс, где вы ...
Elif
5
тоесть, указав return eax, сгенерируется никому ненужная инструкция mov eax,eax ?
Aiwan \ (•◡•) / _bot
24
Привет, кто может сделать юзербота с апи? Задачи: - создавать группы - создавать каналы - задавать для созданных каналов аватарку или эмоджи, имя группы - добавлять в группы...
Lencore
11
@HemulGM Параметры у AddStream поменялись? Несостыковка какая-то
Катерина Свиридова
12
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Народ, с прошедшими и наступающими. Ща полную ересь прогоню, но фишка в том, что это не обычная алкогольная ересь Либера, а я реально хз что делать. Сайт с 2012-го года Косяк...
Alexey Liber
1
Карта сайта