我正在创建一个应用程序,其中有主数据库,其他数据存储在辅助数据库中。辅助数据库遵循“插件”方法。我使用 SQL Server。
应用程序的简单安装将只有 mainDB,而作为一个选项,可以激活更多“插件”,并且每个插件都会有一个新数据库。
现在我做出这个选择的原因是因为我必须使用现有的遗留系统,这是我能想到的实现插件系统的最聪明的事情。
MainDB 和 Plugins DB 具有完全相同的架构(基本上,Plugins DB 有一些“特殊内容”,一些可以用作模板的重要数据——例如,在应用程序中考虑一个字母模板)。插件数据库以只读模式使用,它们是“内容存储库”。“聪明”的事情是主应用程序也可以由“插件编写者”使用,他们只需编写一个插入内容的数据库,并通过备份数据库他们创建一个潜在的插件(这就是为什么所有数据库都有相同的架构)。
这些插件数据库是从互联网下载的,因为有可用的内容升级,每次完整的插件数据库被破坏并创建一个具有相同名称的新数据库时。这是为了简单起见,甚至因为这个 DB 的大小通常很小。
现在这行得通,无论如何我更愿意将数据库组织成一种树结构,这样我就可以强制插件数据库成为主应用程序数据库的“子数据库”。
作为一种解决方法,我正在考虑使用命名规则,例如:
ApplicationDB(用于主应用程序 DB)
ApplicationDB_PlugIn_N(用于第 N 个插件 DB)
当我搜索插件 1 时,我尝试连接到 ApplicationDB_PlugIn_1,如果我没有找到数据库,我会引发错误。例如,如果 som DBA 重命名 ApplicationDB_Plugin_1,就会发生这种情况。
因此,由于这些插件数据库实际上仅依赖于 ApplicationDB,因此我试图“做子文件夹技巧”。
谁能建议一种方法来做到这一点?你能评论一下我上面描述的这种自制插件方法吗?
添加信息(开始赏金后):
在 MainDB 中,我计划将连接信息存储到所有插件数据库。基本上它是数据库名称,因为我以一种方式设计系统,即使我使用多个 sql server 登录来访问 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'
所以“技巧”是使用 dbname 来区分插件。现在这项工作,但对我来说似乎有点“脏”。我的问题是“你能想到更好的方法吗?”