翻译:n到T-SQL DML级别3的阶梯:在SQL Server中实现一个关系模型。

该系列

这篇文章是楼梯系列的一部分:通往T-SQL DML的阶梯

通过使用SQL ServerTransact-SQL (T-SQL)方言这个楼梯将为您提供如何使用SQL Server表数据的基本理解。DML是数据处理语言是处理数据的语言的方面它包括语句选择插入更新和删除这个楼梯将提供一些SQL语言的历史和一些关于集合理论的一般概念每个级别都将建立在之前的级别上所以当您完成时您将很好地理解如何从SQL Server中选择和修改数据

 

在这个阶梯的前一级我向您提供了关于基本选择语句和SQL历史的信息这些级别为您提供了理解如何检索数据以及SQL环境如何随着技术和技术解决方案发生变化而变化的基础在这个层次上我将探讨如何实现基于关系模型的简单SQL Server数据库在开始创建数据库之前首先让我介绍一下关系模型的创建者的一些历史

 

关系数据建模之父

关系数据库设计的概念最初是由Edgar F. Codd1970年提出的论文标题为大型共享数据银行的数据关系模型”。CoddIBM工作时开发了这个建模理论。IBMCodd的数据建模概念上的速度不够快因此并不是第一个提供关系数据库引擎的供应商它利用了Codd的新关系数据建模理论。Codd的关系建模概念现在是用于在SQL Server和其他关系数据库引擎中创建关系数据库的框架

 

Codd出生在英国的波特兰岛在加入皇家空军成为二战飞行员之前他学习了数学和化学。1948年他搬到纽约开始在IBM工作在那里他是一名数学程序员他漂流了好几年最终搬到加利福尼亚IBM圣何塞研究实验室工作。Codd继续致力于完善和证明关系数据模型直到上世纪90年代他的健康问题迫使他退休埃德加·f·科德于2003418日去世享年79

SQL Server中实现关系模型

这个楼梯不是用来教你关系数据建模或数据库设计的而是教你如何从一个关系模型创建一个SQL Server数据库但是在我为您提供创建SQL Server数据库的代码块之前我们首先需要探索将要实现的关系数据模型我的简单模型将包含几个实体(数据表),其中有主键定义和不同实体之间的一些关系(外键约束)。

 

我的简单关系模型将是一个简单的酒店预订系统这个预订系统需要跟踪客户预订信息1说明了我将使用T-SQL实现的简单关系模型:

 

1:一个简单的关系数据库模型包含6个表

通过回顾这个模型您可以看到它包含了许多实体(以方框表示)来跟踪预订相关信息每个实体由许多属性()组成其中一个或多个属性被标识为主键(粗体和下划线的名称)。同样表示的是实体之间的一些关系(以箭头表示),以显示不同的实体之间是如何相互关联的我将使用实体属性主键和关系的模型然后开发一个物理SQL Server数据库该数据库表示此关系模型的设计

 

要从这个模型构建一个物理数据库我们需要在这个模型中定义SQL Server中定义的不同对象对于图1中的每个实体或框我将在SQL Server中创建一个表对于每个实体的每个属性我将在关联的表中创建一个列对于每个主键我将创建一个惟一的聚集索引(注意也可以使用唯一的非聚集索引创建主键)。有关索引的更多信息请参见http://www.sqlservercentral.com/楼梯/72399/)。最后对于每个关系我将创建一个外键约束

 

为了开始构建我的数据库我首先需要创建一个SQL Server数据库来保存我计划创建的所有新数据库对象我的数据库将被称为RoomReservation。我将使用以下的T-SQL代码创建我的数据库:

 

要从我的模型中开始构建我的房间预订数据库对象我将创建表对象要在SQL Server中创建表我需要使用create table语句使用CREATE TABLE语句我将能够定义每个表和每个表中的所有列下面是创建SQL Server表的简单语法:

 

地点:

=表名

= column_name data_type,[NULL | NOT NULL]

对于CREATE TABLE语句的完整语法请参阅联机的SQL Server书籍

我创建的第一个表将是Customer它是使用清单1中的代码创建的

 

清单1:创建Customer

在此代码中当我创建Customer表时我创建了所需的所有列但我还指定了在插入或更新记录时该列是否需要一个值我通过在某些列上指定NOT NULL实现了这一点而其他列则指定为NULL。

 

如果一个列被定义为NOT NULL,那意味着您不能创建一个记录除非您用一个实际值填充这个列然而使用NULL规范定义一个列意味着您可以创建一个行而无需为这个列指定一个值或者另一种方法是该列允许空值在上面的CREATE TABLE语句中我允许列Address2EmailAddress支持null,而所有其他列都需要在创建行时提供一个值

 

这个CREATE TABLE语句并没有完全定义我的Customer因为它在上面的关系数据库模型中表示我仍然需要在列CustomerID上创建一个主键约束这个主键约束将确保该表中没有两个记录具有相同的CustomerID创建主键的代码如清单2所示

 

清单2:Customer表中添加主键约束

这个ALTER TABLE语句为我的Customer表添加了一个主键约束主键将以一个名为PK_Customer的聚集索引的形式创建

 

Transact-SQL语言中通常有不止一种方法来做相同的事情或者我可以通过运行清单3中的CREATE table语句一次性创建客户表和主键

 

清单3:用主键创建Customer表的另一种方法

至此我已经向您展示了如何创建具有定义主键的表剩下要展示的是如何创建外键约束但在此之前先让我先为您提供在我的关系数据库模型中创建其余表和主键的脚本您可以在清单4中找到它

 

清单4:创建额外的表和主键约束

外键约束在两个相互关联的表之间执行引用完整性外键约束定义的表是引用表”,需要在另一个表中有一个相关的记录称为引用任何时候在表中插入或更新一行在图1的关系模型中这些外键关系由箭头表示外键约束仅在关系中的一个表上定义在我的图表中外键约束将定义在具有箭头(非指向端)尾部的表上

 

要在我的关系模型中定义这些外键约束我需要修改每个引用表来添加约束清单5是我可以用来在预订表上创建外键约束的T-SQL代码此约束确保记录不会在预订表中插入或更新除非在Customer表中基于CustomerId找到匹配的记录

 

清单5:在引用Customer表的预订表上创建一个外键约束

为了完成我的设计我需要实现图1中模型中标识的所有其他外键const。清单6包含ALTER TABLE语句以在我的数据模型中创建额外的外键约束

 

清单6:创建额外的外键限制

 

验证数据库设计

一旦我完成了从数据模型构建数据库的工作我应该验证实现的设计以确保它是正确的这个验证过程是为了确保我在物理数据库中构建的所有数据完整性规则都得到了正确的实现在我的设计中这是我需要验证的规则

 

所有插入或更新的行必须具有定义为NOT NULL的任何列的特定值

 

主键的列不允许重复的值

 

具有外键const的列不允许在引用表中没有匹配记录的数据

 

在验证数据完整性规则之前首先需要使用一些有效数据填充引用的表我将使用清单7中的代码来填充那些具有一些有效数据的表:

 

清单7:插入初始数据

为了验证我在数据库中构建的数据完整性规则我将运行清单8中的INSERT语句

 

清单8:INSERT语句测试各种约束

这些INSERT语句中的每一个都应该失败因为它们违反了在RoomReservation数据库中构建的数据完整性规则第一个INSERT语句违背了保留区雕像栏的非空验证检查

 

第二个INSERT语句违背了放在RoomType表上的主键约束这个INSERT语句试图为RoomTypeID列插入3的值问题是房间类型表中已经有了一个记录它的RoomTypeID值为3。

 

最后一个INSERT语句违反了CustomerPaymentType表的外键约束在这个特定的INSERT语句中Customer表中没有CustomerID,值为2。

 

要正确插入这些记录需要清理插入的数据值一旦数据被清理干净我就可以将这些新数据插入到适当的表中清单9包含清理的INSERT语句它将传递所有数据完整性检查并成功地插入到RoomReservation数据库中的适当表中:

 

清单9:附加的约束测试

 

关系数据库设计

 

我的预订示例演示了如何使用关系模型并使用它来实现一个SQL Server数据库通过使用NOT NULL、主键和外键const,我将数据完整性规则构建到数据库设计中这允许我在底层数据库定义中执行这些规则而不是在业务处理层中编写代码来验证这些数据规则通过这样做我允许SQL Server数据库引擎为我执行这些数据完整性检查

 

通过了解和创建围绕关系数据库模型的数据库设计您将构建一个健壮的高效的数据库实现您可以在数据库中构建数据完整性检查

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值