65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Visio 2003 为企业架构师设计 SQL Server 数据库

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.41/5 (6投票s)

2007 年 1 月 3 日

9分钟阅读

viewsIcon

84892

downloadIcon

385

使用 Visio 数据库模型图在 SQL Server 中设计复杂数据库(或者为什么值得为 MSDN Premium 付费)。

Sample Image - visioDatabase.gif

引言

尽管 Visio 2003 for Enterprise Architects(MSDN Premium 及以上版本可用)存在许多怪癖,但在布局数据库设计、整理思路、标注表和视图、存储存储过程以及与 SQL Server 数据库保持同步方面,它是一个非常出色的工具。

其中最好的部分是,尽管听起来显而易见,你可以在 Visio 图中使用多个页面。

背景

在规划最近的数据库项目(预计有 30-40 个表)时,我决定先使用 Visio 来布局我的想法,而不是使用 Access 或直接在 SQL Server 中创建表。

在此示例中,我将使用一个基于会员数据库的非常简单的数据库设计。

我想记录以下实体:

  • 成员
  • 会员笔记
  • 会员订阅记录

这些实体大致可以转化为我将使用的表。另外,设计是故意简化的。

入门

在 Visio 中创建一个数据库模型图。检查菜单上是否有数据库 > 生成选项。如果没有,你可能拥有的是 Visio Standard 而不是 Enterprise Architect 版本。

首先要做的是让 Visio 知道你计划使用 SQL Server。在菜单上,转到数据库 > 选项 > 驱动程序,然后选择Microsoft SQL Server驱动程序。

窗口分为 3 个窗格:形状、图表页面和数据库属性(在底部)。

创建表

将“实体”形状拖到图表页面上。在数据库属性窗口中,将物理名称更改为“Member”。

现在单击数据库属性窗格中的“列”选项。

我们需要添加以下列,所以只需在提供的框中键入(从物理名称开始):

Physical Name   | Data Type     | Req'd |  PK  | Notes
memberID        | int identity  | tick  | tick |
emailAddress    | varchar(200)  | tick  |      |
surname         | varchar(100)  | tick  |      |
forename        | varchar(100)  | tick  |      |

你会注意到“int identity”和“varchar(200)”不在数据类型下拉列表中。没关系,你只需键入它,而不是从列表中选择。你还可以键入任何注释来提醒自己列的作用。这在设计的早期阶段可能非常有用。另一个技巧是使用空格键来勾选或取消勾选可勾选的字段,并使用 Tab 键在框之间移动。这样创建列会非常快。

现在我们已经创建了客户表。在菜单上,选择数据库 > 视图 > 表和视图。一个新的窗格将出现,显示模型中表的列表。

现在创建以下表,并包含以下列:

Table Name: Subscription
Physical Name   | Data Type     | Req'd |  PK  | Notes
subscriptionID  | int identity  | tick  |      |
amountDue       | smallmoney    | tick  |      |
datePaid        | smalldatetime |       |      | null if not paid.

Table Name: Note
Physical Name   | Data Type     | Req'd |  PK  | Notes
noteID          | int identity  | tick  | tick |
noteTimestamp   | smalldatetime | tick  |      | (see below).
noteText        | varchar(max)  | tick  |      |

对于 Note 表的 noteTimestamp 列,单击“编辑”按钮,在默认值字段中输入 get_date(),然后更改单选按钮,使其显示“是表达式或函数调用”。

现在我们有 3 个要链接的表。

链接表

将关系连接器形状拖到图表上。

将尖头端拖到 Member 表(当表变为红色时松开),将钝头端拖到 Note 表。这将在 Note 表中创建一个新的外键列。
对 Subscription 表也执行相同的操作。Member 表现在应该链接到 Note 表和 Subscription 表。
当然,你也可以将新创建的 memberID 列重命名为你选择的任何名称,或者先创建 memberID 列,然后再将其与链接关联。

想象一下,如果我们有 30 个表,它们在一个页面上会变得相当混乱,即使你更改了纸张大小,所以我们要更好地组织它们。

使用页面来组织表

在图表底部,它会有一个名为“Page-1”的页面名称(类似于 Excel 中的工作表名称)。通过双击它将其重命名为Notes

右键单击该页面名称,然后单击“插入页面”。将其命名为Subscriptions

返回 Notes 页面,选择 Subscription 表,然后按 Delete 键。当询问你是否要从底层模型中删除选定的项目?时,选择。我们只从该工作表中删除了表,它仍然应该在左侧的“表和视图”窗格中。

切换回 Subscriptions 页面,然后将 Member 表和 Subscription 表(都在“表和视图”窗格中)拖到空白工作表上。
在我看来,这是 Visio 最棒的功能之一——你可以在任意数量的工作表上可见地复制一个表。

如果以后你想添加另一个部分,例如Meetings来记录会员参加过的会议,你可以创建一两个新页面,将 Member 表拖到上面,然后对其进行建模,而不会被 Notes 和 Subscription 相关表的混乱干扰。

注释等...

你现在可以通过选择不同的形状(例如,从文件 > 形状 > Visio 附加功能 > 呼出框)并将呼出框附加到表来添加更多可见的注释。这在 3 个月后提醒自己该表的作用时非常有用。

添加完各种文档后,就可以创建数据库了。

在服务器上创建数据库

Visio 使用 ODBC 驱动程序连接到你的数据库。我发现最好先在 Enterprise Manager(或 Management Studio)中创建数据库,并在 ODBC 设置(可在控制面板中找到)中设置 DSN。一旦你拥有一个带有 ODBC 连接的空数据库,请执行以下操作:

在菜单上,单击数据库 > 生成。勾选生成新数据库,取消勾选生成文本文件…。单击下一步

单击数据库已存在,然后单击下一步。从列表中选择你的数据库,然后单击下一步——根据你的身份验证方法,你可能需要向数据库进行身份验证。

现在将显示将要执行的任务的摘要——在本例中,应该是创建 3 个表。单击下一步完成

保持同步

你可以根据实时数据库更新你的模型。切换到 Enterprise Manager(或 Management Studio),并将 dateJoined: smallDateTime 列添加到 member 表。

切换回 Visio,并将 Subscription 表的 amountDue 列更改为 amountPaid

在菜单上,选择数据库 > 更新。勾选更新数据库,然后单击下一步。选择你的数据库并根据需要进行身份验证。接下来,你将看到实时数据库中检测到的更改摘要。对于列表中的每个项目(或选择根节点),选择你想要选择的解决方案——在本例中,我们希望将更改引入模型,所以选择刷新模型单选按钮。

再单击几次“下一步”,它将显示对模型所做的更改摘要——这些更改将发送回数据库。单击完成

现在模型中的Member表应该有一个名为dateJoined的列,并且在实时数据库中,Subscription表中的amountDue列现在应该称为amountPaid(你可能需要刷新)。

技巧和窍门(以及怪癖)

Visio 有一些奇怪的地方。

存储过程

单击数据库 > 视图 > 代码将在“表和视图”窗格中打开一个名为代码的新选项卡。这会显示从数据库导入的任何存储过程和触发器。不幸的是,Update 命令(如上所述)不会提取数据库中创建的存储过程,因此你需要使用数据库 > 反向工程菜单选项。但是,Update 命令可以更新先前已进行反向工程或在模型中创建的存储过程。

反向工程命令 meget Update 选项,只是它不会将模型更改发送到数据库。取消选择“表和视图”,然后选择所有存储过程(它将更新或添加新的或已更新的,并忽略未更改的)。任何存储过程现在都将出现在代码窗格中。哦,恼人的是,你不能将它们拖到图表上,但你可以通过双击它们来编辑它们。

创建顺序

默认情况下,表和视图按字母顺序排序。你有时会收到关于由于另一个表尚不存在而无法创建外键表的错误。右键单击“表和视图”中的表,取消勾选“排序”。然后根据依赖关系将表拖到正确的顺序(通常只需将错误中提到的表拖到它正在创建的表上方)。

Update 命令 - 多个根节点

Update 命令询问你是要刷新模型还是更新数据库,还是什么都不做。刷新模型会将数据库更改复制到模型。更新数据库会将模型中的更改发送到数据库。询问你想要做什么的屏幕可能会显示一个长长的更改列表,而树状视图实际上有 3 个根节点。我犯的一个明显错误是选择第一行(树状视图的根节点)并将所有子项设置为更新数据库。当我查看数据库时,只有表发生了变化,视图和存储过程没有更新。这是因为我应该向下滚动一点,设置视图来更新数据库,然后对存储过程做同样的事情。

实际使用

要获取完整的数据库创建脚本,你需要从一个空数据库开始,否则 Visio 生成的数据库脚本只会显示更新期间发现的更改。为此,我会偶尔删除并重新创建数据库,以便获得更新的创建脚本。然后,我将该脚本附加到 Visual Studio 解决方案中的数据库项目中,以及其他脚本。

其中一个脚本会删除数据库并创建一个空数据库。然后,我将 Visio 生成的 DDL 脚本作为该数据库项目的一部分,这样我就可以删除数据库,并根据模型重建它。然后我会有其他脚本来填充测试数据等...

通过这种方式进行的好处是,我可以运行一个 msbuild 脚本,该脚本可以创建数据库和表、视图、存储过程,用我的测试数据填充它,然后运行我的 nunit 测试,所有这些都从 Visual Studio 命令行进行。我可以去喝杯咖啡,同时让它运行。:)

如果有兴趣,我将撰写一篇关于 msbuild 部分的文章。

历史

创建于 - 2007 年 1 月 3 日。

© . All rights reserved.