Цепочка таблиц, когда денормализовать? - PullRequest
3 голосов
/ 14 декабря 2011

Скажем, TABLE-A может иметь одну или несколько строк в TABLE-B, которая может иметь одну или несколько строк в TABLE-C, которая может иметь одну или несколько строк в TABLE-D ... и т. Д.

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

Общий совет, как с этим бороться?

Ответы [ 2 ]

5 голосов
/ 14 декабря 2011

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

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

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

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

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

0 голосов
/ 14 декабря 2011

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

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

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

...