翻译(7w)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了翻译(7w)相关的知识,希望对你有一定的参考价值。
T-SQL DML级别3的阶梯:在SQL Server中实现关系模型
该系列
本文是楼梯系列的一部分:T-SQL DML的阶梯
这个楼梯将为您提供一个基本的理解,如何使用SQL Server的SQL Server-SQL(t-SQL)方言使用SQL Server表中的数据。DML是数据处理语言,是处理数据的语言方面。它包括语句选择、插入、更新和删除。这段楼梯还将提供一些SQL语言的历史和一些关于集合论的一般概念。每个级别都将建立在以前的级别上,所以在您完成之后,您将对如何从SQL Server中选择和修改数据有一个很好的理解。
在这个阶梯的前一层,我向您提供了关于基本SELECT语句和SQL历史的信息。这些级别为您提供了了解如何检索数据以及SQL环境如何随着技术和技术解决方案的变化而变化的基础。在这个层次上,我将探索如何实现一个基于关系模型的简单SQL Server数据库。在开始创建数据库之前,首先让我介绍一下有关关系模型的创建者的一些历史。
他是关系数据建模之父
关系数据库设计的概念是由Edgar F.Codd于1970年首次引入的,他的一篇论文标题为“大型共享数据银行的数据关系模型”。Codd在IBM工作时开发了这种建模理论。IBM在Codd的数据建模概念上没有足够的跳跃,因此并不是第一个提供关系数据库引擎的供应商,它利用了Codd的新关系数据建模理论。Codd的关系建模概念现在是用于在SQL Server和其他关系数据库引擎中创建关系数据库的框架。
Codd出生在英国的波特兰岛,在加入皇家空军之前,他学习了数学和化学,后来成为了第二次世界大战的飞行员。1948年,他搬到了纽约,开始为IBM工作,在那里他是一名数学程序员。他四处漂流了好几年,最终搬到了加州,在IBM圣何塞研究实验室工作。Codd继续努力改善和证明关系数据模型,直到上世纪90年代,他的健康状况不健康迫使他退休。Edgar F.Codd于2003年4月18日去世,享年79岁。
在SQL Server中实现关系模型
这段楼梯并不是要向您介绍关系数据建模或数据库设计,而是向您展示如何从关系模型创建SQL Server数据库。但是在我为您提供创建SQL Server数据库的代码块之前,我们首先需要探索一个将要实现的关系数据模型。我的简单模型将包含一些实体(数据表),其中包含主键定义和不同实体之间的一些关系(外键约束)。
我的简单的关系模型将用于一个简单的酒店预订系统。该预订系统将需要跟踪客户预订信息。图1演示了我将使用t-sql实现的这个简单的关系模型:
图1:一个由6个表组成的简单关系数据库模型
通过查看这个模型,您可以看到它包含许多实体(由表格表示)来跟踪与预订相关的信息。每个实体由许多属性(列)组成,其中一个或多个属性被标识为主键(粗体和下划线的名称)。同样表示的是实体之间的一些关系(由箭头表示),它们显示了不同实体之间是如何相互关联的。我将采用实体、属性、主键和关系的模型,然后开发一个表示关系模型设计的物理SQL Server数据库。
要从这个模型构建一个物理数据库,我们需要识别SQL Server中不同的对象,我们将根据这个模型来定义它。对于每个实体或图1中的表格,我将在SQL Server中创建一个表。对于每个实体的每个属性,我将在相关联的表中创建一个列。对于每个主键,我将创建一个惟一的集群索引(注意,一个主键也可以使用唯一的非集群索引创建。更多信息索引参考索引在http://www.sqlservercentral.com/stairway/72399)。最后,对于每一段关系,我将创建一个外键约束。
为了开始构建我的数据库,我首先需要创建一个SQL Server数据库来保存我计划创建的所有新数据库对象。我的数据库将被称为预订房间。我将使用下面的T-SQL 代码来创建我的数据库:
为了从我的模型开始构建我的房间预订数据库对象,我将创建表对象。要在SQL Server中创建一个表,我需要使用create table语句。使用CREATE TABLE语句,我将能够定义每个表和每个表中的所有列。下面是创建SQL Server表的简单语法:
地点:
表名
列定义,[NULL | NOT NULL]
CREATE TABLE语句的完整语法是指在线上的SQL Server Books。
我创建的第一个表将是Customer表,使用清单1中的代码创建。
清单1:创建Customer表
在这段代码中,当我创建了Customer表时,我创建了所需的所有列,但是我还指定了当记录插入或更新到该表时,列是否需要一个值。在某些列上指定NOT NULL,而其他列指定NULL时,我实现了这一点。
如果一个列被定义为非空,那意味着您不能创建一个记录,除非您用一个实际的值填充这个列。然而,使用NULL规范定义列意味着可以创建一个行,而不需要为该列指定值,或者另一种方法是,列允许NULL值。在上面的CREATE TABLE语句中,我允许列Address2和EmailAddress支持null,而所有列的其余列都需要在创建行时提供一个值。
这个CREATE TABLE语句并没有完全定义我的Customer表,因为它是在我的关系数据库模型中表示的。我仍然需要在列CustomerID上创建一个主键约束。这个主键约束将确保这个表中没有两个记录具有相同的CustomerID值。创建主键的代码如清单2所示。
清单2:向Customer表添加主键约束
这个ALTER TABLE语句向我的客户表添加了一个主键约束。主键将以一个名为pkcustomer的集群索引的形式创建。
在transact-sql语言中,通常有不止一种方法来做相同的事情。或者,我可以通过运行清单3中的CREATE table语句,一次性创建我的Customer表和主键。
清单3:用主键创建Customer表的另一种方法
在这一点上,我已经向您展示了如何创建带有定义的主键的表。剩下的唯一要展示的就是如何创建一个外键约束。但在此之前,让我先向您提供在我的关系数据库模型中创建其余表和主键的脚本。您可以在清单4中找到它。
清单4:创建额外的表和主键约束
一个外键约束在两个相互关联的表之间强制引用完整性。外键约束定义的表是“引用表”,并且需要在另一个表中有相关记录,即所谓的“引用”表,任何时候在表中插入或更新一行。在图1中的关系模型中,这些外键关系由箭头表示。外键约束只在关系表中的一个表中定义。在我的图表中,外键约束将定义在那些具有箭头尾(非尖尾)的表上。
为了在关系模型中定义这些外键限制,我需要修改每个引用表来添加约束。清单5是我可以使用的t-sql代码,用于在预订表上创建一个外键约束。这个约束确保在预订表中没有插入或更新记录,除非在Customer表中找到匹配的记录,这是基于CustomerId的。
清单5:在引用Customer表的预订表上创建一个外键约束
为了完成我的设计,我需要在图1中实现我的模型中标识的所有其他外键。清单6包含在我的数据模型中创建额外的外键约束的ALTER TABLE语句。
清单6:创建额外的外键限制
验证数据库设计
一旦我完成了从数据模型构建数据库的工作,我就应该验证已实现的设计,以确保它是正确的。这个验证过程是为了确保我在物理数据库中构建的所有数据完整性规则都得到了正确的实现。在我的设计中,我需要验证的规则是
插入或更新的所有行必须为定义为NOT NULL的任何列定义一个特定值。
主键的列不允许重复的值
具有外键的列的列不允许在引用表中没有匹配记录的数据
在验证数据完整性规则之前,我首先需要使用一些有效数据填充引用的表。我将使用清单7中的代码填充这些表,其中有一些有效的数据:
清单7:插入初始数据
为了验证我在数据库中构建的数据完整性规则,我将运行清单8中的INSERT语句。
清单8:用INSERT语句测试各种约束
这些INSERT语句中的每一个都应该失败,因为它们违反了在room预订数据库中构建的数据完整性规则。第一个INSERT语句违反了预订小块的NOT NULL验证检查。
第二个INSERT语句违反了放在RoomType表上的主键约束。这个INSERT语句试图为RoomTypeID列插入3的值。问题是在RoomType表中已经有了一个记录,房间类型为3。
最后一个INSERT语句违反了CustomerPaymentType表的外键约束。在这个特定的INSERT语句中,Customer表中没有一个值为2的CustomerID。
为了正确地插入这些记录,需要将插入的数据值进行清理。一旦数据被清理干净,我就可以将这些新数据插入到适当的表中。清单9包含清理的INSERT语句,它将通过所有的数据完整性检查,并成功地插入到room预订数据库中的适当表中:
清单9:附加的约束测试
关系数据库设计
我的预订示例演示了如何使用关系模型并使用它来实现一个SQL Server数据库。通过使用NOT NULL、主键和外键,我在数据库设计中构建了数据完整性规则。这使我能够在底层的数据库定义中执行这些规则,而不必在业务处理层中编写代码来验证这些数据规则。通过这样做,我允许SQL Server数据库引擎为我执行这些数据完整性检查。
通过在关系数据库模型中理解和创建数据库设计,您将构建一个健壮且高效的数据库实现,您可以将数据完整性检查构建到数据库中。
本文是 Stairway to T-SQL DML楼梯阶梯的一部分
当我们发布一个新级别的时候,就会得到通知并注册到我们的RSS订阅源,!
------------------------------------------------------------------------------------------文章作者:Gregory Larsen
以上是关于翻译(7w)的主要内容,如果未能解决你的问题,请参考以下文章