在SQL Server数据库中加强数据的完整性(四)

日期: 2008-11-13 作者:SearchSQLServer.com翻译:April 来源:TechTarget中国 英文

你们可以看出,我们创建了一个约束主要检查所有必须包含非负值的列。这种方法唯一的缺点就是很难找出违反约束的数据。但是想像一下如果约束更加复杂,包含的列更多,这种情况很容易发现负值。你只知道在约束中的某个列违反了约束,你就要检查所有的数据找出问题所在。

使用哪种方法取决于复杂性和个人喜好。   实施参考完整性   现在我们已经讨论完了PK,FK和约束,我们要讨论的最后一个问题就是如何用它们来实施参考完整性。幸运的是,如果你理解了如何创建我们讨论过的每一个对象,那就可以直接用它们实施了。   一对多的关系   一对多的关系是你在数据库中用到的最普遍的关系,用一对多的关系在表中创建外键会节省大量的工作。

……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

你们可以看出,我们创建了一个约束主要检查所有必须包含非负值的列。这种方法唯一的缺点就是很难找出违反约束的数据。但是想像一下如果约束更加复杂,包含的列更多,这种情况很容易发现负值。你只知道在约束中的某个列违反了约束,你就要检查所有的数据找出问题所在。使用哪种方法取决于复杂性和个人喜好。

  实施参考完整性

  现在我们已经讨论完了PK,FK和约束,我们要讨论的最后一个问题就是如何用它们来实施参考完整性。幸运的是,如果你理解了如何创建我们讨论过的每一个对象,那就可以直接用它们实施了。

  一对多的关系

  一对多的关系是你在数据库中用到的最普遍的关系,用一对多的关系在表中创建外键会节省大量的工作。要创建你所需要的关系,你就必须保证包含外键的列被设置成不允许NULL值。不允许NULL需要在列中插入一个值,并且增加外键要求该值包括在相关表的主键中。这种类型的关系贯彻了“一或多对一”的基数。 换句话说,你可以有一个单独的行但是你可以拥有无数个行。(本章后面我们会探讨安装高级基数的方法)。外键列中允许NULL能让你选择关系,也就是说,我们并不要求参考表和数据相关。如果你在表中跟踪计算机,并用其中的一种关系定义谁正在使用这台计算机,那么外键中的NULL就会显示没有被员工使用的计算机。

  一对一的关系

  一对一关系和一对多关系的实施的方法完全一样。你还会创建一个主键和外键,在这一点上的问题就是SQL Server还会允许用户在外键表中插入很多行参考主键表。没有什么方法能通过默认将数据约束到一对一的关系中。要实施一对一的关系,你就必须要有一些创造性。

  第一项选择就是写存储程序(本章下面的内容会讨论更多的存储程序)来进行所有的操作工作,然后增加逻辑阻止表中增加另外的行。这种方法在很多情况下都适用,但是如果没有存储程序你又需要将数据直接下载到表中,这该怎么办呢?实施一对一的关系的另外一种方法就是使用触发器,我们在这里简要讨论了一下。基本上,触发器就是一个能在插入语句之后或代替插入语句的执行代码。用这种方法,你就可以这种一对一的关系进行重新插入。

  此外,也可能是最简单的方法,就是你可以在外键中增加唯一性约束。就是说外键中的数据是主键中的值,每个值都只能在参考表中出现一次。这种方法可以很有效地创建被SQL Server管理和增强的一对一的关系。

  多对多的关系

  多对多的关系可能是最复杂的关系之一。即使你可以让两个实体之间拥有一种多对多的关系,你可不能在两个表之间创建多对多的关系。要创建这种关系,你就必须创建第三个表,即连接表以及两个一对多关系。

  我们通过一个例子看一下它怎么运作。你现在有两个表,一个为Student,另一个为Class,每个表都包括它们的主键identity(即objid)。这种情况下你需要多对多关系,因为一个学生可能在以上的班级中,一个班级也可能有一个以上的学生。创建这种关系,你之需要创建有两个列的表:一个包含student_objid,另一个包含class_objid。这样你就可以将连接表对Student表、另一个连接表对Class表之间创建一对多的关系。图3.3表明了这种关系。

  Student和Class表之间的多对多的关系

  图3.3 Student和Class表之间的多对多的关系

  你会发现这种设置的一些东西。首先,除了是外键,这些列一起能用作Student_Class表的主键。怎样才能创建这种多对多的关系?只要它们不违反主键,这个连接表就能够包含主键。也就是说你能够将每个学生和所有他的班级相对应,你也可以将一个特殊班级中所有的学生和那个班级相对应。也就是多对多的关系。

  可能听起来很复杂,但是如果你创建了一种多对多的关系并在表中增加了数据,那么它就变得很清晰了。真正弄懂它的最佳方法就是实践,当我们在第九章中建立物理模型时,我们就在更进一步了解多对多的关系,包括一些让它们变得很有用的方法。

  在第二章中,我们谈到了基数。基数仅用来介绍一个表和另一个表相关联的行数。基数通常是由客户的事物规则衍生而来的。有了一对一的关系,SQL Server本身没有支持基数的方法。用主键和外键,你很容易就能够增强一或多对多、零或多对多、或者一对一的基数,就像之前我们讨论的一样。

  如果每个父级记录只能包括有限的子级记录,你要创建一种关系该怎么做?例如,用employee或vehicle表,你可能会想限制数据,这样每个员工就至多有能够和五辆车匹配。此外,员工根本就没有必要要一两小汽车。这种关系的基数就是零对五对多。要增强这种需求,你就要进行一些创新。在这种情况下,你可以使用触发器计算出和一个员工匹配的汽车数量。如果与员工匹配的汽车的数量超过5,那你就要重新插入。

  每种情况都是唯一的。在一些情况中你可能会用查询约束或者另一种PK、FK组合来实现基数。你需要检查决定的最佳方法的条件是什么。

翻译

April
April

相关推荐