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

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

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

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

16 ответов

18 просмотров

Тут всегда баланс надо искать. Оптимизатор СУБД в реальности может эффективно работать при джойнах менее 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"?

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Карта сайта