2009-12-28 51 views
1

对于我工作过的大多数数据库支持的项目,都需要在部署之前将“启动”或测试数据放入数据库该项目。启动数据的示例:列出世界上所有国家的表格或列出将用于填充调色板的一堆颜色的表格。 (1)创建数据库,(2)创建一个实用程序脚本(1)创建数据库,(2)创建模式,(3)创建表(包括主键和外键),(4)作为链接服务器连接到电子表格,以及(5)将所有数据插入到表格中。在部署时向SQL Server(Express)数据库中获取大量数据

我大多喜欢这个系统。我发现在Excel中布局列,使用简单的查找函数验证外键关系,执行连接操作,从Web表格或其他电子表格复制数据等都非常简单。此系统的一个主要缺点是需要同步每次更改表格定义时,都会在我的工作表中显示列。

我一直在通过一些教程来学习新的.NET技术或设计模式,我注意到这些通常涉及使用Visual Studio创建数据库并添加表(而不是脚本)和数据通常使用内置设计器输入。这让我想知道,如果我做这件事的方式不是最有效或可维护的。

问题

  1. 一般情况下,你觉得它最好通过脚本或GUI设计师,如SSMSE或Visual Studio来构建整个数据库?

  2. 你推荐用什么方法来为启动或测试数据填充数据库,为什么?


澄清

的答案来看,到目前为止,我想我应该澄清一些东西。假设我有大量的数据(数百或数千行)需要找到数据库。这些数据可以来自不同的地方,如文本文件,电子表格,网络表格等。我收到了几条建议,使用INSERT声明编写了这个流程的脚本,但是当您谈论lot时,这真的可行数据的?

这使我...

新问题

  1. 你怎么会写SQL脚本采取this page全国数据,并将其插入到数据库中?

    使用Excel,我可以将表格复制/粘贴到工作表中,然后运行我的实用程序脚本,基本上就可以完成了。

  2. 如果您后来意识到需要一个新的专栏CapitalCity,该怎么办?

    使用Excel,我可以从this page获取这些信息,将其粘贴到Excel中,并且通过快速的文本到列操作,我可以获得所需格式的数据。

老实说,我没有写这个问题捍卫Excel作为最好的方式,甚至是很好的方式来获得的数据到数据库中,但答案似乎到目前为止还没有被解决我的主要concern- - 如何将所有这些数据存入您的数据库。用手写数百个INSERT声明的脚本将是非常耗时且容易出错的。不知何故,这个脚本需要机器生成,但是怎么样?

回答

1

我认为你的当前进程是适用于初始数据的种子数据库。它很简单,易于维护,适合您。如果你有一个好的数据库设计并有足够的约束,那么你如何为初始数据创建并不重要。您可以使用中间工具来生成脚本,但为什么要麻烦?

SSIS有一个陡峭的学习曲线,不能很好地处理源代码管理(不可能知道版本之间有什么变化),并且对Excel的类型转换非常挑剔。还有一个问题,它会提前读取多少行来确定数据类型 - 如果第一个x行包含以文本形式存储的数字,则会遇到很大麻烦。

1

1)我更喜欢使用脚本的原因有几个。

•脚本很容易修改,而且当我准备将应用程序部署到生产环境时,我已经编写了脚本以便我全部设置。

•如果我需要将数据库部署到其他平台(如Oracle或MySQL),那么很容易对脚本进行较小的修改以在目标数据库上工作。

•通过脚本,我不依赖像Visual Studio这样的工具来构建和维护数据库。

2)我喜欢使用脚本的老式插入语句。同样,在部署时脚本是你最好的朋友。在我们的商店中,当我们部署我们的应用程序时,我们必须准备好供DBA运行的脚本,因为这正是他们所期望的。

我刚刚发现脚本很简单,容易维护,而且在创建数据库和加载数据时,脚本是“最不常见的分母”。通过最小公分母,我的意思是大多数人(即DBA的,店里其他人可能没有视觉工作室)将能够毫无困难地使用它们。

对脚本来说很重要的另一件事是它强制你学习SQL和更具体的DDL(数据定义语言)。虽然手持GUI的工具很好,但是没有任何东西可以替代花时间学习SQL和DDL。我发现这些技能几乎可以在任何商店中获得。

+0

我完全乐于编写用于创建数据库,表格等的脚本,我很高兴迄今为止的答案似乎证明了这种方法的合理性,但我仍不清楚如何有效地编写必要的插入语句可能包含数百或数千行数据,可能来自网络,文本文件,电子表格等的数据。如果仅仅输入一些内容,插入语句对我来说是有意义的,但是我如果想要创建这些插入语句,首先需要一些指导。 – devuxer 2009-12-28 03:28:56

+0

假设您要加载的数据位于CSV文件中。生成插入语句的一种方法是编写一个简单的C#程序来读取CSV文件并以编程方式生成SQL语句,然后将这些SQL语句写入文件。过去我曾多次使用过这种技术,即使对于数十万行数据,它也可以很好地工作。另一个选择,因为你使用SQL Server,将使用他们的ETL工具来加载数据(http://www.developer.com/db/article.php/3497511/SQL-Server-Integration-Services-SQL -Server-2005s-NEW-ETL-Platform.htm)。 – dcp 2009-12-28 09:54:37

0

由于我使用了一个对象关系映射器(Hibernate,也有一个.NET版本),所以我更喜欢用我的编程语言生成这样的数据。然后ORM负责将事情写入数据库。我不必担心在数据中更改列名,因为我需要修改映射。如果涉及重构,它通常也会处理启动/测试数据。

+0

这是一个有趣的方法,但首先如何将这些数据转化为编程语言?如果您有来自各种来源(例如,网页,电子表格,文本文件等)的数百或数千行数据,该怎么办? – devuxer 2009-12-28 03:23:14

0

Excel是这个过程中不必要的组成部分。

脚本当前版本您想要重用的数据库组件,并将脚本添加到您的源代码管理系统。当您需要在将来进行更改时,请修改数据库中的实体并重新生成脚本,或修改脚本并重新生成数据库。

避免混合使用Visual Studio的数据库设计器和Excel,因为它们只会增加复杂性。脚本和SQL Management Studio是你的朋友。

+0

正如我所说,我完全乐于编写用于创建数据库,表格等的脚本,但是如何首先将数据存入数据库?如果我在电子表格中有很多数据,该怎么办?如何有效地为可能数百甚至数千行数据编写插入语句脚本? – devuxer 2009-12-28 03:21:35

+0

在SQL Management Studio中,右键单击数据库并单击任务|导入数据。选择Excel提供程序,选择您的文件名,然后完成向导。您可能需要多次对任何不同的电子表格,csv文件等进行分析。 – 2009-12-28 15:58:28

1

坦率地说,我发现在这里使用Excel的概念有点可怕。很明显,工程,但它创建了一个ad-hoc数据源的依赖关系,直到很晚才解决。你最不希望发生的事情是疯狂地部署一个数据库,并发现Excel文件被损坏,或者更糟,完全缺失。我想这种严重程度会随着风险承受能力而变化,但我会积极寻求从等式中删除Excel,或者至少将其作为永久性夹具移除。

我总是使用脚本来创建数据库,因为脚本是可移植且可重复的 - 您可以使用(几乎)相同的脚本来创建开发数据库,​​QA数据库,UAT数据库和生产数据库。出于这个原因,使用脚本修改现有数据库同样重要。

我也一直使用脚本来创建引导数据(AKA启动数据),这里有一个非常重要的原因:后面通常会有更多的脚本。或者至少应该是。 Bootstrap数据几乎总是只读的,因此,您应该将它放在只读文件组上以提高性能并防止意外更改。所以您通常需要先编写数据脚本,然后使文件组为只读。

然而,在更哲学的层面上,如果这个启动数据是数据库正常工作所必需的 - 而且大多数情况下它是 - 那么你真的应该把它看作数据定义本身的一部分,元数据。出于这个原因,我认为不应该将数据定义在,而是在您用于创建数据库本身的同一个脚本或一组脚本中。

测试数据有点不同,但根据我的经验,您通常会尝试以某种方式自动生成该数据,这使得使用脚本更为重要。您不希望为了测试目的而手动维护一个包含数百万行的特定数据库。

如果您的问题是测试或启动数据来自外部来源 - 网页,CSV文件等 - 那么我会用一个实际的“配置数据库”来处理这个问题。这样,您就不必像使用Excel一样验证VLOOKUPS的引用,您可以实际执行它们。

  • 使用SQL Server集成服务(前身DTS)拉从CSV,Excel或任何地方,您的外部数据导入配置数据库 - 如果你需要定期刷新数据,你可以保存SSIS包,以便它结果只是几次点击而已。
  • 如果您需要使用Excel作为中介,即格式化或重构网页中的某些数据,那很好,但重要的事情是IMO将尽快从Excel中取出,并将SSIS与一个配置数据库是一个很好的可重复的方法。
  • 当您准备将数据从配置数据库迁移到应用程序数据库时,可以使用SQL Server Management Studio为数据生成脚本(如果您还不知道的话 - 右键单击数据库,转到“任务”,“生成脚本”,然后在“脚本选项”中打开“脚本数据”)。如果你真的是硬核,你实际上可以脚本编写脚本过程,但是我发现这通常不到一分钟。

这可能听起来像很多开销,但在实践中的努力是最小的。您设置的配置数据库一次,创建一个SSIS包一次,并刷新配置数据也许每隔几个月或可能从来没有(这是你已经做了一部分,而这部分将成为工作)。一旦这个“设置”完成后,实际上只需几分钟即可生成脚本,然后您可以在主数据库的所有副本上使用该脚本。

+0

嗨亚伦,谢谢你的回答。使用Excel的理由写入我的问题。我会重复一遍:“我发现在Excel中布置列,使用简单的查找函数验证外键关系,执行拼接操作,从Web表格或其他电子表格复制数据等都非常简单。”如何有效地为具有多列和数百行的Excel工作表编写insert语句? – devuxer 2009-12-28 03:18:27

+0

我删除了评论并更新了主帖以专门解决这一问题。希望修订解释一切。 – Aaronaught 2009-12-28 15:54:28

+0

+1帮助很多。 – devuxer 2009-12-28 19:36:07

相关问题