Пожалуйста, прости мой длинный вопрос. У меня есть идея дизайна, который я мог бы использовать некоторые комментарии Это хорошая идея сделать это? И о каких ямах я должен знать? Есть ли другие подобные реализации, которые лучше?
Моя ситуация выглядит следующим образом:
Я работаю над переписыванием приложения Windows Forms, которое подключается к серверу SQL 2008 (ранее это был SQL 2005). Приложение представляет собой «экспертную систему» для инжиниринговой компании, где мы храним структурированные данные о конструкциях. Мы контролируем все установки клиентского программного обеспечения, у нас нет внешних клиентов или пользователей, все они являются внутренними для компании, и им всем доверяют, чтобы они не сделали ничего вредоносного для программного обеспечения или базы данных.
В текущем проекте не слишком много таблиц (около 10–20), но некоторые из них содержат миллионы записей, принадлежащих нескольким сотням конструкций. До сих пор производительность системы была хорошей, но она начинает ухудшаться, поскольку мы расширяем границы дизайна.
В рамках переписывания я рассматриваю возможность разделения базы данных на одну основную базу данных и несколько «дочерних» баз данных, каждая из которых описывает одну конструкцию. Каждая дочерняя база данных должна иметь идентичный дизайн. Это должно устранить проблемы с производительностью, которые мы наблюдаем сегодня, поскольку данные, хранящиеся в каждой базе данных, будут составлять менее одного процента от общего объема данных.
Меня беспокоит то, что вместо поддержки одной базы данных мы теперь получим сотни баз данных, которые необходимо поддерживать в актуальном состоянии. Система постоянно развивается по мере того, как меняются требования компании (вы знаете, как она есть), и пока мы пытаемся уменьшить количество изменений, изменения произойдут. Поэтому нам понадобится система, в которой мы будем отслеживать все изменения базы данных, сделанные в системе, чтобы их можно было применить к дочерним базам данных. Обновление клиентского приложения не будет проблемой, у нас есть хороший контроль над этим аспектом.
Я имею в виду систему отслеживания изменений, в которой мы храним сценарии базы данных для всех изменений в таблице в основной базе данных. Затем мы можем дать каждому изменению номер версии и сохранить текущий номер версии в каждой дочерней базе данных. Когда клиентская программа подключается к дочерней базе данных, мы можем тогда сравнить номер версии базы данных с текущим номером версии основной базы данных, и если есть патчи с номерами версий, превышающими номер версии дочерней базы данных, мы запускаем их и обновляем дочерняя база данных до последней версии.
На мой взгляд, это должно работать хорошо. Любые изменения в системе сначала будут проверены и проверены, прежде чем зафиксированы в качестве новой версии базы данных. Затем изменение будет применено к базе данных при первом ее открытии пользователем. Я предполагаю, что мы будем открывать базу данных в монопольном режиме при применении изменений, но если изменения не слишком частые, это не должно быть проблемой.
Так что вы думаете? Будет ли это работать? Кто-нибудь из вас делал что-то подобное? Должны ли мы отказаться от решения и вместо этого перейти на монолитную систему?