2

Скажите, что TABLE-A может иметь одну или несколько строк в TABLE-B, которая может иметь одну или несколько строк в TABLE-C, которая может иметь одну или несколько строк в TABLE-D ... и так далее.Цепь таблиц, когда денормализовать?

Скажите, что я нахожусь в TABLE-Z и вам нужно знать подробности о ТАБЛИЦЕ-A. Я делаю SQL-запрос, который работает от TABLE-Z до TABLE-A? В какой-то момент, может быть, было бы неплохо, если бы, скажем, TABLE-Z имел FK для TABLE-A, так что запрос не будет таким болезненным. Однако, если я положил этот FK, я думаю, что нарушу нормализацию, не так ли?

Общие рекомендации о том, как с этим бороться?

ответ

4

Если вы используете составные первичные ключи (что на самом деле произойдет, если вы правильно смоделировали дизайн перед созданием каких-либо таблиц), то ключ из таблицы A уже содержится в TableZ (как в самом левом столбце).

Однако люди обычно добавляют суррогатный ключ без понимания почему. Таким образом, вам нужно соединить все 26 таблиц, чтобы установить связь между TableA и TableZ.

Дополнительный FK между TableA и вашим TableZ может конфликтовать с некоторым промежуточным внешним ключом: вот почему денормализованные (или ненормализованные) данные имеют присущие риски и его следует использовать разумно.

Однако у вас обычно не было 26 уровней вложенной таблицы. Работа с 2, 3 или даже 6-сторонними первичными ключами означает, что я могу присоединиться к TableA to TableF без каких-либо промежуточных таблиц.

Лично я использовал бы составные клавиши и избегал дополнительных FK, если бы у меня не было известного, воспроизводимого и демонстративного узкого места. Большинство баз данных не заметят никакой разницы .. так что пока не оптимизируйте

0

В случаях, когда использование времени/памяти запроса более важно, чем сохранение нормализации таблиц, допустимо денормализовать таблицы. Предположим, вы выбрали пару тысяч строк, и все, начиная с таблицы Z до A, займет довольно много времени.

В основном я бы сказал, что это зависит от вас. Если важно, чтобы таблицы были нормализованы, не денормализуйте их. Если скорость и использование памяти в запросах важнее, вы должны денормализовать таблицы.

Надеюсь, что это поможет!

+0

Значит, это зависит от этого значения? – StackOverflowNewbie

+0

Обычно. Конечно, есть такие вещи, как мнение клиента и правила компании об этом. Если вы делаете проект для себя, я бы сказал, что вам нравится то, что вам больше всего нравится. – Darvex

Смежные вопросы