为什么在我的数据库开发中应该使用Visual Studio 2010 over SSMS?


42

Visual Studio 2010引入了数据库项目以及据称可以促进数据库开发的一系列相关功能。我使用SQL Server Management Studio(SSMS)多年来进行数据库开发没有问题。

  • 当SSMS为我工作时,为什么还要打扰VS2010?具体来说,它比SSMS做得更好吗?
  • 但是也许我的前提不正确,SSMS仍然胜过VS来进行数据库开发。如果是这样,那么以什么具体方式是正确的?

2
从到目前为止积累的答案来看,我怀疑受访者没有按预期的方式使用任何 VS2010数据库工具。
Mark Storey-Smith

2
@ MarkStorey-Smith-是的,下周我会用我的答案来摇滚大家。根据到目前为止的经验,VS 2010是用于数据库开发工具。
Nick Chammas

实际上,您已经在早期Visual Studio版本中拥有数据库项目,但是它们仅在高级版本IIRC中可用。
gonsalu,2011年

1
以前的版本有很大的不同。
Mark Storey-Smith

我仅使用SSMS。SSMS完全有能力完成需要做的事情。我们的服务器内容不需要知道那里有什么...
Asken 2011年

Answers:


27

老实说,实际上我对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专业或更高。您可能会或可能不想使用高级或旗舰版的项目管理功能。
  • Subversion,AnkhSVN和TortoiseSVN-每天都比TFS更好,并且与VS玩得很好。还可以在本地存储库中进行并行开发工作流。
  • 用于T-SQL开发的SSMS-项目管理和SC集成不是很好,但是可以很好地用于DB开发工作。
  • 用于跟踪sproc文件的VS2010 DB项目-如果您使用的是SSMS,则有点笨拙,但工作正常。它还将生成部署脚本。
  • PowerDesigner-更好地建模数据库和管理数据库架构项目。如果您想深入了解MDA,它也支持UML。如果要从对象模型驱动数据库设计,则可以考虑使用Sparx EA。尽管它的数据库建模尚有待改进,但它在我所见过的所有CASE工具中都能很好地发挥Meta CASE(可扩展元模型)的作用。
  • SQL Compare pro-使用它来生成数据库补丁脚本或测试手动补丁脚本(请参阅下面的1)。
  • Framemaker-如果您有多个分析师共同研究某个规范,则比Word更稳定,更好的群件功能。它还支持有条件的包含,因此您可以隐藏WIP更改的规范版本发布。MIF和MML使将API文档和数据字典集成到规范文档中变得相当容易。这样做非常有用,因为您可以在规范中对其进行交叉引用。文本标签锚使跨引用在重新导入过程中保持稳定。您还可以使用TCS将文档单源化为PDF,HTML和CHM输出。
  • 开源问题跟踪器-很多优秀的开源问题跟踪器(例如TRAC,Bugzilla,仅举几例,我已经使用过)。开源的代码更易于修改或集成到自定义工作流程中,而且您无法承受任何价格。
  • NUnit或其他测试工具-任何最适合您要求的自动化测试工具。
  • MS项目以外的任何项目-视为有害。MS项目非常内向,将项目计划强加到一个模型中,不能有效地表示不确定性,风险或对利益相关者或其他第三方的依赖(请参阅下面的2)。

优点:比VS2010更好的数据库建模和模式管理,更好的版本控制系统,更容易自定义构建和项目工作流程,更好地管理规范和文档。

缺点:需要更多的工具来集成工具,将数据库集成限制在构建过程中。

假设:假定对变更/发布过程的控制比对数据库模式的自动或紧密集成的发布管理更为重要。还假设自动化数据库模式管理不是100%可靠的。

不是非常高科技或巧妙地集成在一起,但是对于复杂的项目,您可能更喜欢控制而不是可爱的自动化功能。我认为您最好使用一组最佳的工具,以及集成它们所需的任何家庭酿造工具和测试脚本。只需尝试使构建(a)相对简单易懂,以及(b)完全自动化。

  1. 对数据库补丁进行质量检查。在大型架构上,您可能希望对实时系统进行手动修补,尤其是在修补涉及数据迁移的情况下。例如,可能需要具有前滚和回滚脚本来支持在必要时撤消更改。在这种情况下,您将需要一种工具来测试该补丁程序是否实际正常工作。如果您在存储库中管理数据库架构,则可以通过先设置数据库并从存储库生成参考数据库来测试脚本。在before数据库上运行补丁脚本应将其与存储库模型同步。可以使用模式比较工具对此进行测试。

  2. 最近,我完成了比定制应用程序开发更多的数据仓库和集成工作,因此在大多数情况下,与开发团队相比,我遇到这种情况的频率更高。但是,项目管理工具和方法在管理外部利益相关者方面做得很差。在诸如数据仓库之类的集成项目中,我真的很想看到一个项目管理工具,该工具可以在面对程序管理时真正推动外部依赖性(即我无法控制的依赖性)。在任何非平凡的集成项目中,外部依赖关系都是造成浪费时间的最大因素。


感谢您使用所有这些详细信息来更新您的答案。现在,它的价值更大。
Nick Chammas

2
反对每个对象一个繁琐的文件。这不是VS2010方式,而是源代码控制101。您没有在单个文件中定义多个C#类,对吗?
Mark Storey-Smith

2
老实说,我不关注。首先,这些工具可以为您管理这些文件,这不会增加我的工作效率。其次,表,键,索引和约束是分开的,因为a)在逻辑上和物理上它们是分离的对象b)您经常孤立地操作它们,例如,作为涉及数据移动的重构的一部分,删除和重新创建索引。
Mark Storey-Smith

1
诸如“工具为您管理文件”之类的详尽语句并不是很有帮助,因为我的观察是,它们显然没有作用-至少不可靠。VS2010对于单个用户可能工作正常;对于团队来说效果不是很好。我的经验是,一位MS金牌合作伙伴在管理简单的会计数据集市时遇到了麻烦。不是人民。
ConcernedOfTunbridgeWells,

2
@ConcernedOfTunbridgeWells请不要以任何方式将我的评论视为对立或有争议的,这不是我的意图。我很想知道为什么VS2010未被广泛采用,因为我经常为团队探索它提供理由。如果您可以抽出时间来详细讨论,我很想听听您的想法。
Mark Storey-Smith

19

自从最初发布该问题以来,我一直在设法解决这个问题的答案。这很困难,因为VS2010并不是要描述该工具的功能和优势。这是关于说服读者对其数据库开发方法进行根本性改变。不容易。

经验丰富的数据库专业人员可以回答这个问题,其背景知识涵盖DBA,developer / dba以及OLTP和数据仓库。对我而言,一次开会对数据库开发的各个方面进行处理都是不可行的,因此我将尝试为特定的情况做个案例。

如果您的项目符合这些条件,我认为VS2010很有说服力:

  • 您的团队正在使用VS2010进行应用程序开发。
  • 您的团队正在使用TFS进行源代码控制和构建管理。
  • 您的数据库是SQL Server。
  • 您的团队已经对VS自动化测试感兴趣,或者对此感兴趣。

如果你的数据库开发评估VS2010,你的圣经将是Visual Studio的数据库向导Visual Studio的ALM流浪者。后面没有引用的任何引用均来自本文档。

我们走了...

为什么数据库开发过程与应用程序开发不同?

数据。如果不是那些讨厌的数据,那么数据库开发将是一个轻而易举的事。我们可以删除每个发行版上的所有内容,而不必理会麻烦的变更管理。

数据的存在使数据库更改过程变得复杂,因为当应用程序开发工作引入影响数据库表或其他数据模式形状的更改时,通常会迁移,转换或重新加载数据。在整个变更过程中,必须保护生产质量数据和操作状态,以防可能危害其完整性,价值和对组织的实用性的变更。

SSMS怎么了?

由于某种原因,它被称为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


SSMS + <-插入模式比较工具->呢?

这绝对是朝正确方向迈出的一步,并且省去了维护脚本所需的大量手动工作。但是(而且很大),通常涉及手动步骤。

流行的模式比较工具可以完全自动化,并且可以集成到构建过程中。但是,以我的经验,比较普遍的做法是手动运行比较,将生成的脚本盯起来,检入源代码管理,然后手动执行以进行部署。不好。

每当我们容易犯错的人必须参与构建或部署过程时,我们都会引入风险,并使过程不可重复。

如果您和您的团队是拥有全自动模式比较和部署的少数团队,那么您就万事大吉了!你们最有可能对VS2010提供的好处持开放态度:

  • 您已经接受手动操作很危险。
  • 您会看到自动化的价值。
  • 您愿意花费必要的时间使它正常工作。

如果您不能单步创建构建,也不能单步部署,则开发和部署过程将会中断。如果您不这样认为,请询问Joel Spolsky


为什么选择VS2010?

@NickChammas提出的问题是寻找杀手级功能,以证明VS2010为什么会改变数据库开发的游戏规则。我认为我不能以此为依据。

也许可笑的是,在其他人看到此工具存在缺陷的地方,我看到了采用的强烈理由:

  • 您将不得不改变自己的方法。
  • 您和您的团队将被迫以不同的方式工作。
  • 您将必须详细评估每个更改的影响。
  • 您将被引导着使每一个改变都是幂等的

如果您是项目中唯一的DBA,负责管理对数据库的所有更改,那么这种推理听起来很荒谬可笑。但是,如果您认为@BrentOzar有一个要点,而新规则之一是每个人都是DBA,那么您将需要以团队中每个开发人员都能使用的方式控制数据库更改。

对于某些开发人员而言,采用数据库项目可能需要一种思维上的转变(旧习惯很难改变),或者至少改变流程或工作流。已经开发了生产数据库代表当前数据库版本的数据库应用程序的开发人员, 将需要采用基于源代码的方法,其中源代码将成为对数据库进行更改的工具。在Visual Studio数据库项目中,项目和源代码是数据库架构的“真相的一个版本”,并使用开发人员或组织可能已在其应用程序堆栈的其他部分使用的SCM工作流程进行管理。对于数据,生产数据库应保持应有的“真实版本”。

我们已经实现了成功采用VS2010方法进行数据库开发所必需的根本转变。

将您的数据库视为代码

无需更改实时数据库。每个数据库更改将遵循与应用程序更改相同的模式。修改源,构建,部署。这不是Microsoft的临时改变,这是SQL Server的未来数据库作为代码将保留下来。

数据库开发人员为应用程序的版本定义对象的形状,而不是如何将数据库引擎中的现有对象更改为所需的形状。您可能会问自己:如何针对已经包含客户表的数据库进行部署?这是部署引擎发挥作用的地方。如前所述,部署引擎将采用模式的编译版本,并将其与数据库部署目标进行比较。差异引擎将生成必要的脚本,以更新目标架构以匹配您从项目中部署的版本。

是的,还有其他工具也遵循类似的模式,并且对于超出我的回答限制范围的项目,值得同等考虑。但是,如果您使用的是Visual Studio和Team Foundation Server ALM,我认为它们无法竞争。

VS2010数据库项目有什么问题?

  • 他们并不完美。但是,如果您知道局限性和问题区域,则可以解决它们。
  • 复杂的数据移动仍需要注意和注意,但可以通过部署前/部署后的脚本来解决。

编辑:那你的意思是什么?

@AndrewBickerton在评论中提到我没有回答原始问题,因此我将尝试总结“为什么在我的数据库开发中为什么应该使用Visual Studio 2010 over SSMS?” 这里。

  • SSMS不是数据库开发工具。是的,您可以使用SSMS开发TSQL,但是它不提供VS2010的丰富IDE功能。
  • VS2010提供了一个将数据库视为代码的框架。
  • VS2010为您的数据库代码带来了静态代码分析
  • VS2010为您提供了完全自动化构建部署测试周期的工具。
  • SQL2012和Visual Studio vNext扩展了数据库项目的功能。现在就熟悉VS2010,您就可以在下一代数据库开发工具上抢先一步。

Kinda有用的答案,但有一些警告:1)您错过了一个标准:“您正在开发发送到客户端站点的独立应用程序(即:同一数据库有多个副本,正在狂野中创建新的[空]副本) /一直出售)”。2)您已经回答了为什么我们应该将数据库视为代码并管理开发,构建,部署周期(我已经同意)。对于为什么我们应该使用VS2010作为实现这一目标的机制,我的回答没有令人信服的理由。+2(周到的答案)和-1(未回答实际问题)
Andrew Bickerton

2
SQL脚本需要什么“丰富的IDE”?
gbn

1
在下游可以看到自动构建-部署-测试周期的好处。我将实时部署的自动化部分限制为“放手”,即不需要任何手动步骤。
Mark Storey-Smith

1
除此之外,您的集成论点确实有一些优点。在一般情况下效果如何?我遇到了问题,但我敢说它可以正常工作。
ConcernedOfTunbridgeWells,

2
@尼克,我会为你做的:-)
杰克·道格拉斯

7

如果您不了解SSMS或使用了第三方工具,则VS可能会很棒。如果使用Red Gate工具进行模式比较等,则VS中的差距会突出。免费的SSMS插件也是如此。

源代码控制位具有误导性:生产数据库中的内容是您的参考副本。不是开发人员使用的。看到


1
我必须同意这一点-您可以使用VS2010进行数据库设计/开发和模式管理,但是有第三方工具链可以更好地做到这一点。
ConcernedOfTunbridgeWells,

1
为什么要以生产作为参考副本?我认为这是一种不良做法,并且可能还表明您的源代码管理已损坏。为什么您的数据库代码不应该像其他所有事物一样属于开发生命周期?
Nick Chammas

@NickChammas:我的意思是生产的还原副本。在我目前的商店中,源代码管理中的内容与实时数据库不匹配。在我的最后一次,其他团队也是如此。通过变更脚本部署的不是开发人员正在从事的工作……
gbn

6

我在SSRS报告设计和SSIS包中广泛使用了Visual Studio(好吧,BIDS)。即使在Management Studio中,我也做得不好。Visual Studio是一个更加完整和集成的开发环境,它也可以更好地连接到Source Control系统中。这全都反映在价格中!


6

老实说,我的投票直接投给了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。


在Visual Studio中,您以完全相同的方式键入表DDL。您在想其他吗?
Nick Chammas

1
@尼克我可能说错了。我知道您可以在VS中做到这一点,但我的想法是,拥有专门的工具来处理特定的(大型)任务真是太好了。我绝对是一个习惯的野兽,我已经习惯了SSMS。:)
Thomas Stringer

2
真?SSMS解决方案/项目功能感觉像是在发布前2周由实习生添加的。
Mark Storey-Smith

1
@ MarkStorey-Smith是一个问题,那就是SSMS真正没有项目/解决方案支持的问题,这对于让团队在IDE的整体工作中发挥重要作用很重要吗?
jcolebrand

3
一种说法是SSMS是数据库管理工具,VS2010是数据库开发工具。
Mark Storey-Smith,

5

没有最佳实践,但是使用VS 2010数据库项目和源代码控制器(VSS 2010,Subversion等),可以对数据库进行版本控制。

我建议您首先将数据库直接设计到SSMS中。数据库准备就绪后,将其导入VS 2010数据库项目。导入完成后,您必须始终将新脚本添加到数据库项目中,以跟踪所有修改。您可以使用数据库项目的比较功能来从开发服务器获取所有更改,并将所有这些脚本直接导入到您的项目中。现在,您只需要将更改“提交”到源代码控制器中即可。

使用这种方法,您可以拥有一个版本化的数据库。您可以发现每个修改的版本并回滚您的更改。

这不是唯一的优势。使用这种项目,您可以将任何数据库与项目进行比较以编写更改脚本,并使用SQL PowerShell命令提示符使用相同的脚本更新所有数据库:此脚本是数据库的XML模式。它将仅执行所需的命令来更新数据库。您还可以在数据库中进行单元测试。可以在此处找到有关数据库项目的另一篇好文章。使用部署功能,您可以拥有前脚本和后脚本。使用这些脚本,您可以进行验证或将数据插入到系统表中。

是数据库项目的良好逐步过程。


4
这不是应该如何在VS2010中进行数据库开发的方法,您似乎有点漏了点。1)为什么要在SSMS中设计一个未开发的数据库然后导入VS?2)您不必“总是向数据库项目中添加新脚本”来跟踪更改。3)脚本不是数据库的“ xml模式”。
Mark Storey-Smith,

您是否尝试过数据库项目?1-因为您只能导入一次数据库,所以如果您不想全部编写脚本,则可以在SSMS中为数据库的第一稿做最大的工作。2-您说得对,您可以使用VS2010的比较器工具跟踪更改,而VS2010会为您生成更改。3-尝试数据库项目,在部署数据库项目时,您将获得数据库的XML模式,以使生产数据库处于最新状态。
Nico

2
是的,因为早期和更痛苦的版本。您确实确实会导入一次,但是却同步了许多(不是必须这样做,除非您继续在环境之外工作)。关于您所指的“ XML Schema”脚本的更准确描述是该工具维护了数据库的基于xml的元模型,命令行部署工具使用该模型来创建更新目标数据库所需的命令。 。
Mark Storey-Smith

2

我使用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的组成。因此,最终您可能无法分辨它们之间的区别。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.