在T-SQL DML 3级楼梯:在SQL Server实现关系模型
在这个阶梯的前一级,我向您提供了基本SELECT语句和SQL历史的信息。这些级别为理解如何检索数据以及SQL环境是如何演变的提供了基础,因为技术和技术解决方案已经改变了超时工作。在这一层中,我将探讨如何实现基于关系模型的简单SQL Server数据库。在开始创建数据库之前,首先让我介绍一下关系模型创建者的一点历史。
关系数据库设计的概念最早由Edgar F. Codd在1970,有一篇题为“一个关系模型数据的大型共享数据银行”。Codd开发建模理论在IBM工作。IBM没有跳够快在科德的数据建模的概念,因此无法提供关系数据库引擎,开发Codd新关系数据建模理论的第一供应商。Codd的关系模型的概念,现在是用来在SQL Server和其他关系数据库引擎创建关系数据库的框架。
Codd出生在波特兰的英国岛和研究数学和化学在加入英国皇家空军,成为一名二战飞行员。他搬到纽约在1948开始在IBM公司工作,在那里他是一个数学的程序员。他漂浮了数年,然后搬到加利福尼亚,在IBM的San若泽研究实验室工作。科德继续工作细化和证明的关系数据模型,直到上世纪90年代,当他每况愈下的健康状况迫使他退休。2003年4月18日Edgar F. Codd去世享年79岁。
这个楼梯并不打算教您有关关系数据建模或数据库设计,而是只向您展示如何从关系模型中创建SQL Server数据库。但是在我为您提供创建SQL Server数据库的代码块之前,我们首先需要探索一个将要实现的关系数据模型。我的简单模型将包含几个实体(数据表),其中包含主键定义和不同实体之间的一些关系(外键约束)。
我的简单关系模型将是一个简单的酒店预订系统。此预订系统将需要跟踪客户预订信息。图1说明了这个简单的关系模型,我将使用T-SQL实现:
通过查看这个模型,您可以看到它包含许多实体(由方框表示)来跟踪与保留相关的信息。每个实体由若干属性(列)组成,其中一个或多个属性被标识为主键(粗体和下划线)。也代表了实体之间的一些关系(由箭头表示),说明不同实体是如何相互关联的。我将采用这种实体、属性、主键和关系模型,然后开发一个表示该关系模型设计的物理SQL Server数据库。
建立一个物理数据库从这个模型,我们需要确定不同的对象在SQL Server中,我们将定义在这个模型的基础上。每一个实体,或框在图1中,我将创建SQL Server表。为每个实体的每个属性,我将创建相关的表列。每个主键,我将创建唯一的聚集索引(注意主键也可以使用一个独特的非聚集索引的创建。在索引参考在HTTP指标楼梯更多信息:/ / www.sqlservercentral。COM /楼梯/ 72399 /)。最后,每个关系我将创建外键约束。
为了开始构建数据库,我首先需要创建一个SQL Server数据库来保存我计划创建的所有新数据库对象。我的数据库将被称。我将用下面的T-SQL代码创建数据库:
从我的模型构建我roomreservation数据库对象,然后创建表对象。要在sql server中创建一个表,我需要使用创建表语句。通过创建表语句,我将能够定义每个表中的每个表和所有列。下面是创建SQL Server表的简单语法:
哪里:
< table_name > =表名> <column_definition = column_name data_type空不空],[ |
有关创建表语句的完整语法,请参阅联机的SQLServer图书。
我创建的第一个表将客户表,使用清单1中的代码创建。
清单1:创建客户表
在这段代码中,当我的客户表我创建的所有列我需要,但我还指定是否需要一个值列记录时插入或更新到桌子。我实现了,通过指定非空的一些列,而我其他的列指定空值。
如果一个列定义为非空,意味着你不能够创造一个记录,除非你填充此列与实际价值。而定义一个列使用空规范意味着你可以创建一个行没有指定此列的值,或另一种方式来说,列允许空值。我在创建表的语句上面我允许列演说2和EmailAddress支持空值,而所有其他的柱子需要值将提供创建一个行时。
这创建表的语句不完全定义我的客户表,它代表了我的关系数据库模型。我还需要创建一个主键约束的列ID。这个主键约束将确保表中没有两个记录具有相同的ID值。该代码创建主键列表2。
清单2:向客户表添加主键约束
此表语句向客户表添加了主键约束。该主键将在聚集索引命名pk_customer窗体的创建。
在Transact-SQL语言中,通常有不止一种方法来做同样的事情。另外,我可以通过运行清单3中的创建表语句一次性创建我的客户表和主键。
清单3:用主键创建客户表的另一种方法
在这一点上,我已经向您展示了如何创建具有定义主键的表。唯一要展示给您的是如何创建外键约束。但在此之前,让我先向您提供创建上述关系数据库模型中其余表和主键的脚本。您可以在清单4中找到它。
清单4:创建附加表和主键约束
外键约束强制在相互关联的两个表之间执行引用完整性。外键约束定义的表是“引用表”,在表中插入或更新行的任何时刻,都需要在另一个表中有一个相关的记录,称为“引用”表。在图1的关系模型中,这些外键关系用箭头表示。外键约束仅在关系中的一个表上定义。在我的图表中,外键约束将在那些具有箭头尾部(非尖末端)的表上定义。
定义外键约束关系模型在我需要改变每个引用表中添加约束。清单5是T-SQL代码可以用来创建预订表的外键约束。这个约束确保记录不被插入或更新表中保留不匹配的记录在客户表中发现,基于数字。
清单5:在引用客户表的预订表上创建外键约束
为了完成我的设计,我需要实现其他所有外键约束的图1在我的模型识别。清单6包含了在我的数据模型中创建额外外键约束的变更表语句。
清单6:创建额外的外键约束
一旦我完成了从一个数据模型构建一个数据库,我应该验证实现的设计,以确保它是正确的。这个验证过程是为了确保我构建到物理数据库中的所有数据完整性规则正确实现。在我的设计中,这里是我需要验证的规则。
在验证数据完整性规则之前,我首先需要用一些有效的数据填充引用的表。我将使用清单7中的代码用一些有效的数据填充这些表:
清单7:插入初始数据
为了验证我在数据库中构建的数据完整性规则,我将运行清单8中的INSERT语句。
清单8:用INSERT语句测试各种约束
这些插入语句的每一个失败因为他们违反数据完整性规则,是建立在roomreservation数据库。第一个插入语句违反了reservationstatusid列的非空验证检查。
第二插入语句违反主键约束,放在类型表。这是在INSERT语句插入3列的值为roomtypeid。问题是已经有一个记录表的类型3 roomtypeid价值。
最后一个INSERT语句违反了customerpaymenttype表的外键约束。在这个特殊的INSERT语句没有CustomerID和客户表中的值为2。
要正确插入这些记录,需要插入插入的数据值。一旦数据清理完毕,我就可以将这些新数据插入适当的表中。清单9包含清理INSERT语句将所有数据完整性检查和被成功地插入到数据库相应的表中的roomreservation:
清单9:附加约束测试
我的预订示例演示了如何获取关系模型并使用它来实现SQLServer数据库。通过使用非空、主键、外键约束和建立数据完整性规则,我在我的数据库设计。这允许我在底层数据库定义中执行这些规则,而不是在业务处理层中编写代码来验证这些数据规则。通过这样做,我允许SQLServer数据库引擎为我执行这些数据完整性检查。
通过理解和创建关系数据库模型下的数据库设计,您将构建一个健壮高效的数据库实现,在那里您可以将数据完整性检查直接放入数据库中。