2008-11-18 95 views
0

我有一个内部的企业应用程序,我为我公司建立在净3.5/SQL 2008部署SQL 2008数据库与C#应用程序

发展我有两种类型的数据库。主系统数据库包含我们所有的全球数据,例如用户名和客户等。还有项目数据库,其中包含有关我们客户项目的实际数据。

当系统为客户创建新项目时,需要使用提供表,视图,sps等的自定义模式来配置新的SQL数据库。项目数据库的名称对应于项目的项目ID项目存储在系统数据库中。因此,新项目将创建一个名为Project_XXX的新项目数据库,其中XXX是项目ID。

我的问题是以编程方式配置自定义数据库的最佳方式是什么?现在我唯一能想到的方法是有一个类从文件系统中读取一个SQL脚本,并执行解析来替换数据库名称的项目ID。这很容易,但看起来相当不雅。

任何接近一些退伍军人喜欢这个?

回答

1

通常,如果只有一个(或少数)的数据库,并且您可以直接控制它们(典型的企业环境),那么我建议不要自动升级数据库,因为它比它的价值更麻烦。只需将脚本传递给正在进行安装的人员即可。

对于更广泛的发布版本,我已经使用了一个脚本,与SQL Server SMO库(Server.CurrentContext.ExecuteNonQuery())一起使用。我不觉得它不雅,它很简单,它的工作原理。

对于第一个版本,我们将包含完整的数据库构建脚本,然后为每个后续版本添加升级脚本。所以如果有人在V1.1上安装v1.2,我们只能运行v1.2脚本。但是,如果他们全新安装,我们将运行v1.0,v1.1和v1.2。

1

我认为最好的方法是在源代码控制服务器上维护此脚本;毕竟,它是大部分系统基础架构的源代码,并且可以像其他任何程序一样受益于正确的代码维护,测试等。然后从那里安装。

如果你对这个架构有任何唠叨的疑问,我会假设你会加强你对每个项目单独数据库的不确定性。我称之为大规模;我在很多情况下都看过很多次,而且我还没有看到它很好。我甚至会提名它作为Antipattern考虑。

+0

Big Denorm很有趣。我们的问题是我们是一个ASP和项目数据库是巨大的。这是我们分割这么多数据的唯一途径。它也允许我们存档整个数据库。但是,如果你有更好的模式,我全都是耳朵。 – Jiyosub 2008-11-18 02:58:28

+0

没什么特别的,只需为“ProjectID”设置一组表格和一列额外的列。 这是一个额外的工作来节省大量的工作,保持架构的许多副本(包括表格定义,索引,sps,视图等等)的一致性。 – dkretz 2008-11-19 00:26:34

0

由于您使用.NET 3.5,您可能需要考虑使用LINQ。 LINQ能够使用映射文件或您创建的强类型DBML文件动态创建数据库(link to howto)。我相信它可以在多个地方创建适当的表格。这可能适用于简单的数据库。

但是,如果您有非主键上的函数或存储过程和/或索引,我看不出它是如何工作的。映射文件可能能够跟踪这些,但我从来没有使用过,所以我很怀疑。可能@ doofledorfer的想法是使用SQL脚本在新数据库中重新创建数据库结构。无论如何,我通常会将这些脚本保存在我的源代码控制中。

如果您还没有这样做,您可能需要查看管理更新的工具。据推测,当你的代码/数据库发生变化时,你需要在现有项目中滚动任何数据库变更。我们用Red Gate SQL工具获得了很好的结果。

相关问题