一个因素是,在不允许将VS项目的视图限制为与包含另一个模式的数据库进行比较时,维护单独的模式在单独的VS 2010数据库项目中很困难。
如果假设这两个模式始终在同一个SQL Server实例中,有什么理由避免将它们拆分为单独的数据库吗?
备份由操作所有实例中的所有数据库的脚本处理,因此这不是一个问题。我们希望将产品将来提供为托管(SaaS)基础上,因此对多租户的影响是一个因素。我们可能会在一个实例中托管多个客户。
如果它们在两个不同的数据库中,您将无法获得事务一致性。根据您的HA / DR机制,数据库可能会失去同步。例如,使用数据库镜像,一个数据库可以比另一个数据库在应用事务日志方面领先很多。镜像上的一个数据库可能最新到10AM,而另一个数据库只有到9:55AM。在故障转移的情况下,您的两个数据库将不再同步。
请记住,您可以在同一数据库中强制执行外键约束,而在不编写触发器的情况下,无法在单独的数据库中执行该操作。
我认为将数据拆分到数据库而不是方案中的决定高度取决于这些产品是否总是一起使用,没有其他方式,我的意思是,如果考虑将这些产品视为一个整体是否有意义,或者它们是两个完全不同的产品一起使用。
由于您说未来计划将附加组件用于其他产品,因此我认为最好的解决方案是在不同的数据库中拆分数据,因为以后您将面临以下至少一种情况:
每个都很难维护...因此,我建议针对您提到的场景拆分数据库。
你应该(严格!)测试应用程序性能,针对两种模型(独立架构和独立数据库)。如果其中一种被证明不可接受,则选择另一种。显而易见的是,使用一种形式而不是另一种形式的唯一真正引人注目的原因与您描述的“附加”功能有关。如果这可以成为多个不同系统的“附加组件”,如果您希望单个“附加组件”实例被所有已安装和支持的“基本”应用程序使用,则几乎肯定需要将该功能封装在其自己的数据库实例中,以便它可以被任何/所有这样的实例共享/访问。
仅作为思考练习,如果您想要(或必须)仅将附加功能存储在“第一个”应用程序实例中,并使所有随后安装的实例引用该代码,则支持它的解决方案可以基于同义词(在SQL 2005中引入)。在安装“基本”应用程序时,必须进行检查,确定是否找到了“附加”代码以及其所在位置,如果找到,则需要构建必要的同义词引用其托管数据库。当安装附加组件时,也需要类似的安装程序,以识别和更新所有支持的数据库。(这是一个有趣的想法,但独立数据库将是长期维护和管理的更好解决方案。)