Я думаю, что мы все знакомы с нормализацией базы данных .
Мой вопрос: какие рекомендации вы используете, когда хотите денормализовать таблицы?
database-design
Ричард
источник
источник
Ответы:
Денормализация, когда это операции OLAP, нормализация, когда OLTP (из связанной статьи в разделе Денормализация)
источник
Нормализуй, пока не болит, денормализуй, пока не заработает (т.е. производительность станет приемлемой)
источник
Одна потенциально разумная причина применить контролируемую денормализацию состоит в том, что она позволяет вам применить некоторые ограничения целостности к данным, которые иначе были бы невозможны. Большинство СУБД SQL имеют крайне ограниченную поддержку ограничений для нескольких таблиц. Иногда в SQL единственным эффективным способом реализации определенных ограничений является обеспечение того, чтобы все атрибуты, включенные в ограничение, присутствовали в одной и той же таблице - даже если нормализация диктует, что они принадлежат отдельным таблицам.
Контролируемая денормализация означает, что реализованы механизмы, обеспечивающие невозможность возникновения несоответствий из-за избыточных данных. Стоимость этих дополнительных мер контроля и риск противоречивых данных необходимо учитывать при принятии решения о целесообразности денормализации.
Другой распространенной причиной денормализации является разрешение некоторых изменений в структурах хранения или другая физическая оптимизация, которую СУБД иначе не допустила бы. В соответствии с принципом независимости физических данных СУБД должна иметь возможность конфигурировать внутренние структуры хранения без ненужного изменения логического представления данных в базе данных. К сожалению, многие СУБД очень ограничивают физические варианты реализации, доступные для любой данной схемы базы данных. Они имеют тенденцию ставить под угрозу физическую независимость базы данных, поддерживая только неоптимальную реализацию желаемой логической модели.
Это должно быть очевидно, но все же необходимо сказать: во всех случаях только изменения в физических функциях реализации могут определять производительность - такие функции, как внутренние структуры данных, файлы, индексирование, оборудование и так далее. Нормализация и денормализация не имеют ничего общего с производительностью или оптимизацией хранения.
источник
Денормализуйте, если вы часто обращаетесь к вычисленным данным, как это предлагается в ответах на этот вопрос . Затраты на хранение и обслуживание вычисленных данных часто будут меньше, чем затраты на их повторное вычисление снова и снова, если ваш профиль нагрузки слишком тяжел для чтения.
источник
Я обычно денормализую, чтобы обеспечить целостность данных с помощью ограничений. Одним из примеров является недавний вопрос на этом сайте - я реплицирую столбец в другой таблице, чтобы я мог использовать ограничение CHECK для сравнения его с другим столбцом. Другим примером этой техники является мой пост в блоге .
Вы не можете использовать ограничения CHECK для сравнения столбцов в разных строках или в разных таблицах, если только вы не заключаете такие функции в скалярные пользовательские функции, вызываемые из ограничения CHECK. Что, если вам действительно нужно сравнивать столбцы в разных строках или в разных таблицах, чтобы применить бизнес-правило? Например, предположим, что вы знаете рабочее время врача и хотите убедиться, что все встречи соответствуют рабочим часам? Конечно, вы можете использовать триггер или хранимую процедуру для реализации этого бизнес-правила, но ни триггер, ни хранимая процедура не могут дать вам 100% гарантии того, что все ваши данные чисты - кто-то может отключить или сбросить ваш триггер, введите некоторые грязные данные, и повторно включить или воссоздать ваш триггер. Также кто-то может напрямую изменить вашу таблицу, минуя хранимые процедуры.
Позвольте мне продемонстрировать, как реализовать это бизнес-правило, используя только ограничения FK и CHECK - это гарантирует, что все данные удовлетворяют бизнес-правилу, пока все ограничения являются доверенными.
Еще один пример - способ обеспечить, чтобы периоды времени не имели пропусков и не перекрывались .
источник
Fulfillable
таблица со всеми подробностями о каждом выполняемом элементе, а затемFulfillableQueue
таблица, которая реализует очередь в SQL Server . Только Fulfillables с определеннымStateID
может быть в очереди.StateID
находится вFulfillable
таблице, но я копирую егоFulfillableQueue
и затем применяю это ограничение с помощьюFOREIGN KEY
иCHECK
ограничений.