Visual Studio 2010引入了数据库项目以及据称可以促进数据库开发的一系列相关功能。我使用SQL Server Management Studio(SSMS)多年来进行数据库开发没有问题。
- 当SSMS为我工作时,为什么还要打扰VS2010?具体来说,它比SSMS做得更好吗?
- 但是也许我的前提不正确,SSMS仍然胜过VS来进行数据库开发。如果是这样,那么以什么具体方式是正确的?
Visual Studio 2010引入了数据库项目以及据称可以促进数据库开发的一系列相关功能。我使用SQL Server Management Studio(SSMS)多年来进行数据库开发没有问题。
Answers:
老实说,实际上我对VS2010有点不了解。我认为老式的用于存储过程的创建表脚本和文件更易于使用。如果您需要模式管理,那么只需几百美元即可获得Redgate SQL Compare Pro。
如果您确实需要数据库建模工具,那么Powerdesigner甚至Erwin可以做得更好,尽管它们并不是特别便宜。
尽管我更喜欢SSMS,但我都使用了两者。一些利弊:
SSMS具有一个用户界面,该界面“很好”地适用于SQL开发。仅仅构建和使用创建脚本比VS2010迫使您跳过去要方便得多。灵活得多(+ SSMS)。
VS2010具有基本的架构管理(即,差异/补丁脚本生成)(+ VS2010)。但是,它并不是那么好,并且存在一些缺陷。例如,它与名称约束匹配。如果您在列上具有检查或默认约束而未命名,则SQL Server在幕后生成一个随机名称。如果将脚本安装在其他计算机上,这将使VS2010感到困惑,因为约束可能具有不同的名称。Redgate更便宜,更好。(+ VS2010,但有缺陷)。
VS2010确实很笨拙-每个表或其他数据库对象都需要一个文件。本质上,您必须以VS2010方式进行操作,这非常麻烦。(-VS2010)
VS2010也有些脆弱,并且源代码控制集成也很不稳定。即使在简单的数据库中,每个表,约束,存储过程,索引和其他数据库对象也是其自己的文件。文件一直被添加到项目中,比使用(例如)C#的典型编程项目快得多。通过乐观并发,当签入不同步时,它趋向于以静默方式从项目中删除文件。即使具有良好的团队纪律,用户界面对状态的反馈也很差。对于复杂的模型,这将是一场灾难。(-VS2010-我几乎认为这是大型项目的一个令人震惊的缺陷)。
SSMS随SQL Server一起提供-无法压倒价格(+ SSMS)。
VS2010仍然没有合适的存储库,例如PowerDesigner或Oracle Designer。如果不将其安装到数据库中,就无法轻松查询数据模型。(-VS2010)。
总体而言,我将VS2010评为B级。在一个相对简单的数据库项目中,它很笨拙,有两个事实表,大约有15个维度。
我曾经做过的最大数据模型是用于法院案件管理系统,该系统具有约560张桌子。对于那种规模的项目,我不建议使用VS2010(我在Oracle Designer上做到了)。从本质上讲,它试图变得聪明,这种范例并不能很好地发挥作用。最好使用PowerDesigner之类的一流建模工具,或者只使用手工创建表脚本。
SSMS简单可靠,但是是手动的。您几乎可以无限地控制如何管理模型。将其与模式管理器(例如Redgate SQL Compare)以及可能不错的建模工具(例如PowerDesigner)结合使用,您将获得比VS2010更好的软件包。
结束语 我不确定除了(可能)与包含其他项目的VS解决方案集成之外,我是否还能引用其他杀手级功能或优势。如果您已经拥有VS2010 Premium或Ultimate,那么您的.Net工具链中会附带一些有缺陷的数据库开发工具。它将数据库项目集成到VS解决方案中,因此您至少可以使用它来制作sproc部署脚本。
但是,VS没有可说的建模工具,因此在这一点上PowerDesigner甚至Erwin更好。Redgate的模式管理要好得多,SQL Compare Pro相当便宜(约400英镑IIRC)。IMHO SSMS对于T-SQL开发的工作要好得多,但是您当然可以在VS2010中做到。
VS2010高级版并不比同类最佳的数据库建模工具便宜很多,而VS2010 Ultimate则至少同等昂贵。以与VS项目的紧密集成为代价,您可能可以使用第三方工具做得更好。
替代
我猜想在不建议至少一种替代方案并概述其优缺点的情况下,不应过多地放弃VS2010。为此,我将假设一个大型项目。尽管这些天我主要从事A / P工作,但我参与了一个100多员工年的项目,在该项目中我进行了数据模型(以及一些开发工作),还有一些在10个员工年的范围内的其他工作,我主要在其中工作作为分析师或开发人员。这些天我通常在数据仓库系统上工作,但较大的项目主要是应用程序。根据我对各种工具的经验,以下是替代工具链的一些建议:
优点:比VS2010更好的数据库建模和模式管理,更好的版本控制系统,更容易自定义构建和项目工作流程,更好地管理规范和文档。
缺点:需要更多的工具来集成工具,将数据库集成限制在构建过程中。
假设:假定对变更/发布过程的控制比对数据库模式的自动或紧密集成的发布管理更为重要。还假设自动化数据库模式管理不是100%可靠的。
不是非常高科技或巧妙地集成在一起,但是对于复杂的项目,您可能更喜欢控制而不是可爱的自动化功能。我认为您最好使用一组最佳的工具,以及集成它们所需的任何家庭酿造工具和测试脚本。只需尝试使构建(a)相对简单易懂,以及(b)完全自动化。
对数据库补丁进行质量检查。在大型架构上,您可能希望对实时系统进行手动修补,尤其是在修补涉及数据迁移的情况下。例如,可能需要具有前滚和回滚脚本来支持在必要时撤消更改。在这种情况下,您将需要一种工具来测试该补丁程序是否实际正常工作。如果您在存储库中管理数据库架构,则可以通过先设置数据库并从存储库生成参考数据库来测试脚本。在before数据库上运行补丁脚本应将其与存储库模型同步。可以使用模式比较工具对此进行测试。
最近,我完成了比定制应用程序开发更多的数据仓库和集成工作,因此在大多数情况下,与开发团队相比,我遇到这种情况的频率更高。但是,项目管理工具和方法在管理外部利益相关者方面做得很差。在诸如数据仓库之类的集成项目中,我真的很想看到一个项目管理工具,该工具可以在面对程序管理时真正推动外部依赖性(即我无法控制的依赖性)。在任何非平凡的集成项目中,外部依赖关系都是造成浪费时间的最大因素。
自从最初发布该问题以来,我一直在设法解决这个问题的答案。这很困难,因为VS2010并不是要描述该工具的功能和优势。这是关于说服读者对其数据库开发方法进行根本性改变。不容易。
经验丰富的数据库专业人员可以回答这个问题,其背景知识涵盖DBA,developer / dba以及OLTP和数据仓库。对我而言,一次开会对数据库开发的各个方面进行处理都是不可行的,因此我将尝试为特定的情况做个案例。
如果您的项目符合这些条件,我认为VS2010很有说服力:
如果你的数据库开发评估VS2010,你的圣经将是Visual Studio的数据库向导从Visual Studio的ALM流浪者。后面没有引用的任何引用均来自本文档。
我们走了...
数据。如果不是那些讨厌的数据,那么数据库开发将是一个轻而易举的事。我们可以删除每个发行版上的所有内容,而不必理会麻烦的变更管理。
数据的存在使数据库更改过程变得复杂,因为当应用程序开发工作引入影响数据库表或其他数据模式形状的更改时,通常会迁移,转换或重新加载数据。在整个变更过程中,必须保护生产质量数据和操作状态,以防可能危害其完整性,价值和对组织的实用性的变更。
由于某种原因,它被称为SQL Server Management Studio。作为独立工具,如果您要遵循公认的最佳实践,那么管理您的开发工作是不切实际的。
仅使用脚本,就必须在开发中有意义地应用已建立的源代码控制实践,您将必须同时维护对象定义(例如CREATE TABLE脚本)和更改脚本(例如ALTER TABLE),并努力确保它们保持同步。
用于更改表的版本链很快就变得很愚蠢。一个非常简单的例子:
-- Version 1
CREATE TABLE dbo.Widget (WidgetId INT, Name VARCHAR(20))
-- Version 2
CREATE TABLE dbo.Widget (WidgetId INT, Name VARCHAR(20), Description VARCHAR(50))
-- Version 3
CREATE TABLE dbo.Widget (WidgetId INT, Name VARCHAR(20), Description VARCHAR(100))
在版本3中,数据库更改脚本包含:
ALTER TABLE dbo.Widget ADD Description VARCHAR(50)
ALTER TABLE dbo.Widget ALTER COLUMN Description VARCHAR(100)
如果此数据库的实时版本为版本1,而我们的下一个发行版为版本3,则只需要以下脚本,但将同时执行两个ALTER语句。
ALTER TABLE dbo.Widget ADD Description VARCHAR(100)
历时4年的5年sprint总共增加了一些有趣的版本脚本,并且需要额外的人工处理以最大程度地减少对部署时间的影响。
那么SSMS有什么问题吗?不,它对管理和管理SQL Server有好处。它甚至不假装要帮助数据库开发人员完成(有时)非常复杂的变更管理任务。
如果无法从源代码构建数据库的每个版本并将其升级到任何将来的版本,则源代码管理已损坏。如果您不这样认为,请询问Eric Sink。
这绝对是朝正确方向迈出的一步,并且省去了维护脚本所需的大量手动工作。但是(而且很大),通常涉及手动步骤。
流行的模式比较工具可以完全自动化,并且可以集成到构建过程中。但是,以我的经验,比较普遍的做法是手动运行比较,将生成的脚本盯起来,检入源代码管理,然后手动执行以进行部署。不好。
每当我们容易犯错的人必须参与构建或部署过程时,我们都会引入风险,并使过程不可重复。
如果您和您的团队是拥有全自动模式比较和部署的少数团队,那么您就万事大吉了!你们最有可能对VS2010提供的好处持开放态度:
如果您不能单步创建构建,也不能单步部署,则开发和部署过程将会中断。如果您不这样认为,请询问Joel Spolsky。
@NickChammas提出的问题是寻找杀手级功能,以证明VS2010为什么会改变数据库开发的游戏规则。我认为我不能以此为依据。
也许可笑的是,在其他人看到此工具存在缺陷的地方,我看到了采用的强烈理由:
如果您是项目中唯一的DBA,负责管理对数据库的所有更改,那么这种推理听起来很荒谬可笑。但是,如果您认为@BrentOzar有一个要点,而新规则之一是每个人都是DBA,那么您将需要以团队中每个开发人员都能使用的方式控制数据库更改。
对于某些开发人员而言,采用数据库项目可能需要一种思维上的转变(旧习惯很难改变),或者至少改变流程或工作流。已经开发了生产数据库代表当前数据库版本的数据库应用程序的开发人员, 将需要采用基于源代码的方法,其中源代码将成为对数据库进行更改的工具。在Visual Studio数据库项目中,项目和源代码是数据库架构的“真相的一个版本”,并使用开发人员或组织可能已在其应用程序堆栈的其他部分使用的SCM工作流程进行管理。对于数据,生产数据库应保持应有的“真实版本”。
我们已经实现了成功采用VS2010方法进行数据库开发所必需的根本转变。
将您的数据库视为代码
无需更改实时数据库。每个数据库更改将遵循与应用程序更改相同的模式。修改源,构建,部署。这不是Microsoft的临时改变,这是SQL Server的未来。数据库作为代码将保留下来。
数据库开发人员为应用程序的版本定义对象的形状,而不是如何将数据库引擎中的现有对象更改为所需的形状。您可能会问自己:如何针对已经包含客户表的数据库进行部署?这是部署引擎发挥作用的地方。如前所述,部署引擎将采用模式的编译版本,并将其与数据库部署目标进行比较。差异引擎将生成必要的脚本,以更新目标架构以匹配您从项目中部署的版本。
是的,还有其他工具也遵循类似的模式,并且对于超出我的回答限制范围的项目,值得同等考虑。但是,如果您使用的是Visual Studio和Team Foundation Server ALM,我认为它们无法竞争。
@AndrewBickerton在评论中提到我没有回答原始问题,因此我将尝试总结“为什么在我的数据库开发中为什么应该使用Visual Studio 2010 over SSMS?” 这里。
如果您不了解SSMS或使用了第三方工具,则VS可能会很棒。如果使用Red Gate工具进行模式比较等,则VS中的差距会突出。免费的SSMS插件也是如此。
源代码控制位具有误导性:生产数据库中的内容是您的参考副本。不是开发人员使用的。看到
老实说,我的投票直接投给了SQL Server Management Studio进行数据库设计,开发和(显然)管理。输入起来更容易:
create table newTable
(
someId int identity(1, 1) not null primary key clustered,
...... you get the idea
)
然后单击所有正确的位置。SSMS是一个不错的布局,绝对可以使用。我天生就是.NET软件开发人员。但是,在数据库设计和编码方面,我将在10中选择11种SSMS。
没有最佳实践,但是使用VS 2010数据库项目和源代码控制器(VSS 2010,Subversion等),可以对数据库进行版本控制。
我建议您首先将数据库直接设计到SSMS中。数据库准备就绪后,将其导入VS 2010数据库项目。导入完成后,您必须始终将新脚本添加到数据库项目中,以跟踪所有修改。您可以使用数据库项目的比较功能来从开发服务器获取所有更改,并将所有这些脚本直接导入到您的项目中。现在,您只需要将更改“提交”到源代码控制器中即可。
使用这种方法,您可以拥有一个版本化的数据库。您可以发现每个修改的版本并回滚您的更改。
这不是唯一的优势。使用这种项目,您可以将任何数据库与项目进行比较以编写更改脚本,并使用SQL PowerShell命令提示符使用相同的脚本更新所有数据库:此脚本是数据库的XML模式。它将仅执行所需的命令来更新数据库。您还可以在数据库中进行单元测试。可以在此处找到有关数据库项目的另一篇好文章。使用部署功能,您可以拥有前脚本和后脚本。使用这些脚本,您可以进行验证或将数据插入到系统表中。
这是数据库项目的良好逐步过程。
我使用SSMS比使用VS2010多,因为在安装SQL Server时就在那里。这可能是为什么SSMS比VS2010,恕我直言更多地使用的原因。
我也确实发现像Red-Gate这样的供应商推出了与SSMS集成的工具,而不一定与VS2010集成。这可能是积极的,因为它使您可以改进Microsoft没有的SSMS。一个例子就是Red-Gate的SQL Source Control,它是SSMS的附加组件,它使您可以将SSMS连接到公司的Source Control系统,无论是Visual Team Foundation还是现有的。VS2010具有此内置功能,但是与Reg-Gate工具的价格相比,我无需购买VS2010就节省了很多钱。
我认为总的来说,这取决于偏好,您可以随心所欲地工作。如果您正在训练一个新人,并且在VS2010上对他们进行培训,那么这将成为他们的偏好,因为他们知道如何解决这个问题。
如果您开始使用SQL Server 2012,您可能已经注意到SSMS正在缓慢而确定地获得VS2010的组成。因此,最终您可能无法分辨它们之间的区别。