Я создаю приложение, в котором есть основная БД и где другие данные хранятся во вторичных базах данных. Вторичные базы данных следуют «плагиновому» подходу. Я использую SQL Server.
В простой установке приложения будет только mainDB, а в качестве опции можно активировать больше «плагинов», и для каждого плагина будет новая база данных.
Теперь, почему я сделал этот выбор, потому что мне приходится работать с существующей унаследованной системой, и это самая умная вещь, которую я могу себе представить, для реализации системы плагинов.
MainDB и плагины БД имеют абсолютно одинаковую схему (в основном, плагины БД имеют некоторое «специальное содержимое», некоторые важные данные, которые можно использовать в качестве шаблона - например, шаблон письма - в приложении). Базы данных плагинов используются в режиме «только чтение», они являются «хранилищем контента». «Умная» вещь заключается в том, что основное приложение может также использоваться «создателями плагинов», они просто пишут БД, вставляя содержимое, и, делая резервную копию базы данных, они создают потенциальный плагин (поэтому все БД имеют одинаковые схемы).
Эти плагины DB загружаются из Интернета, так как доступно обновление контента, каждый раз, когда полная база данных плагина уничтожается, и создается новая с тем же именем creaetd. Это для простоты и даже потому, что размер этих БД, как правило, невелик.
Теперь это работает, в любом случае, я бы предпочел организовать БД в виде древовидной структуры, чтобы можно было заставить БД подключаемых модулей быть «суб-БД» основной БД приложения.
В качестве обходного пути я думаю об использовании правил именования, таких как:
ApplicationDB (для основной базы данных приложений)
ApplicationDB_PlugIn_N (для N-го плагина БД)
Когда я ищу плагин 1, я пытаюсь подключиться к ApplicationDB_PlugIn_1, если я не нахожу БД, я выдаю ошибку. Такая ситуация может возникнуть, например, если сом DBA переименован в ApplicationDB_Plugin_1.
Так как эти подключаемые БД действительно зависят только от ApplicationDB, я пытался «сделать трюк с подпапками».
Может кто-нибудь предложить способ сделать это? Можете ли вы прокомментировать этот самодельный подход к плагину, который я описал выше?
ДОБАВЛЕННАЯ ИНФОРМАЦИЯ (ПОСЛЕ НАЧАЛА РАБОТЫ):
В MainDB я планирую хранить информацию о подключении ко всем базам данных плагинов. По сути, это имя базы данных, так как я разработал систему таким образом, что даже если я использую несколько учетных записей сервера sql для доступа к MainDB, за кулисами один пользователь (обычно «sa» или другой пользователь с правами администратора).
Таким образом, в основном, если мне нужно запросить несколько баз данных, я буду использовать имя базы данных, чтобы различать плагины, мне не нужно явно создавать файлы с именем PluginID в таблицах базы данных.
Так что как-то так работает, в основной БД я храню названия БД плагинов. Итак, я знаю название плагинов, поэтому, если я хочу запросить все GUNS из всех плагинов, я сделаю что-то вроде этого:
select * from ApplicationDB_Plugin_1.dbo.weapons where weapon_type = 'gun'
union
select * from ApplicationDB_Plugin_2.dbo.weapons where weapon_type = 'gun'
union
select * from ApplicationDB_Plugin_3.dbo.weapons where weapon_type = 'gun'
так что «трюк» использует имя db для различения плагинов. Сейчас эта работа, но она кажется мне немного «грязной». Мой вопрос: "ЛУЧШЕ ЛИ ПОДХОД, КОТОРЫЙ ВЫ МОЖЕТЕ ПОСЕТИТЬ?"