Пользователи просят денормализованную базу данных - PullRequest
15 голосов
/ 13 ноября 2009

Я нахожусь на ранних стадиях разработки системы, управляемой базой данных, и большая часть системы вращается вокруг наследственного типа отношений. Существует родительская сущность с около 10 столбцами, и будет около 10 дочерних сущностей, унаследованных от родительской. Каждый дочерний объект будет иметь около 10 столбцов. Я подумал, что имеет смысл дать родительской сущности свою собственную таблицу и дать каждому дочернему элементу свои собственные таблицы - структуру таблицы на подкласс.

Сегодня мои пользователи попросили просмотреть структуру системы, которую я создал. Они отказались от идеи структуры таблицы на подкласс. Они предпочли бы одну большую таблицу столбцов ~ 100, потому что им было бы проще выполнять свои собственные пользовательские запросы.

Должен ли я рассмотреть вопрос о денормализации базы данных ради пользователей?

Ответы [ 13 ]

1 голос
/ 13 ноября 2009

Я бы выбрал представление (как предлагали другие) или встроенную табличную функцию (преимущества этого в том, что вам нужны параметры - например, диапазон дат или учетная запись клиента), которые могут помочь пользователям не запрашивать запросы без любые ограничения на проблемное пространство) в первую очередь. Встроенный TVF на самом деле является параметризованным представлением и гораздо ближе к представлению с точки зрения того, как механизм обрабатывает их, чем к табличной функции с несколькими утверждениями или скалярной функции, которая может выполнять невероятно плохо.

Однако в некоторых случаях это может повлиять на производительность производства, если представление является сложным или интенсивным. С плохо написанными специальными пользовательскими запросами, это также может привести к тому, что блокировки будут сохраняться дольше или увеличиваться дальше, чем они были бы в лучше построенном запросе. Пользователи также могут неверно истолковать модель данных E-R и получить умноженные числа в случаях, когда существуют отношения «многие к одному» или «многие ко многим». Следующим вариантом может быть материализация этих представлений с помощью индексов или создание таблиц и их обновление, что приближает нас к моему следующему варианту ...

Итак, учитывая эти недостатки опции просмотра и уже подумывая о том, чтобы смягчить ее, начав создавать копии данных, я бы рассмотрел следующий вариант - иметь отдельную версию данных, предназначенную только для чтения (для этих пользователей), которая структурирован по-разному. Обычно я сначала смотрю на звездную схему в стиле Кимбалла. Вам не нужно иметь полноценное, согласованное по времени хранилище данных. Конечно, это вариант, но вы можете просто поддерживать модель отчетности в актуальном состоянии с данными. Звездные схемы являются особой формой денормализации и особенно хороши для числовых отчетов, и пользователи не должны злоупотреблять данной звездой. Вы можете поддерживать звезду в актуальном состоянии несколькими способами, в том числе триггерами, запланированными заданиями и т. Д. Они могут быть очень быстрыми для составления отчетов и запускаться в одной и той же производственной установке - возможно, в отдельном экземпляре, а не просто в отдельной базе данных.

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

Некоторые архитекторы часто удваивают свои серверы и используют ту же модель с той же репликацией для предоставления сервера отчетов, который индексируется более интенсивно или по-разному. Такой второй сервер не влияет на производственные транзакции с требованиями к отчетности и может быть достаточно легко обновлен. Будет только одна модель, но, конечно, у нее есть те же проблемы с юзабилити, когда пользователям предоставляется специальный доступ только к базовой модели без ущерба для производительности, поскольку они получают собственную игровую площадку.

Есть много способов снять шкуру с этих кошек. Удачи.

1 голос
/ 13 ноября 2009

Я бы настоятельно рекомендовал придумать ответ, который не предполагает, что кто-то запускает прямые отчеты по вашей базе данных. В тот момент, когда это происходит, ваша структура БД становится каменной, и вы можете считать ее в основном устаревшей.

Представление - хорошее начало, но позже вы, вероятно, захотите структурировать его как экспорт, чтобы отделить его дальше. Конечно, тогда вы встретите кого-то, кто хочет данные в режиме реального времени. Правильный бизнес-анализ обычно показывает, что это не нужно. Фактические требования в реальном времени не лучше всего обрабатываются с помощью систем отчетности.

Просто чтобы прояснить: я лично предпочел бы подход «таблица на подкласс», но я не думаю, что на самом деле это такая большая проблема, как прямой отчет о транзакциях.

0 голосов
/ 12 июля 2011

Вы реализовали Наследование таблиц классов , и они запрашивают Наследование для одной таблицы . Оба дизайна действительны в определенных ситуациях.

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

...