你们可以看出,我们创建了一个约束主要检查所有必须包含非负值的列。这种方法唯一的缺点就是很难找出违反约束的数据。但是想像一下如果约束更加复杂,包含的列更多,这种情况很容易发现负值。你只知道在约束中的某个列违反了约束,你就要检查所有的数据找出问题所在。
使用哪种方法取决于复杂性和个人喜好。 实施参考完整性 现在我们已经讨论完了PK,FK和约束,我们要讨论的最后一个问题就是如何用它们来实施参考完整性。幸运的是,如果你理解了如何创建我们讨论过的每一个对象,那就可以直接用它们实施了。 一对多的关系 一对多的关系是你在数据库中用到的最普遍的关系,用一对多的关系在表中创建外键会节省大量的工作。
……
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
![TechTarget微信公众号二维码](/wp-content/uploads/res/images/spriteimg/ttweixin.jpg)
TechTarget
官方微博
![TechTarget中国官方微博二维码](/wp-content/uploads/res/images/spriteimg/ttweibo.jpg)
TechTarget中国
你们可以看出,我们创建了一个约束主要检查所有必须包含非负值的列。这种方法唯一的缺点就是很难找出违反约束的数据。但是想像一下如果约束更加复杂,包含的列更多,这种情况很容易发现负值。你只知道在约束中的某个列违反了约束,你就要检查所有的数据找出问题所在。使用哪种方法取决于复杂性和个人喜好。
实施参考完整性
现在我们已经讨论完了PK,FK和约束,我们要讨论的最后一个问题就是如何用它们来实施参考完整性。幸运的是,如果你理解了如何创建我们讨论过的每一个对象,那就可以直接用它们实施了。
一对多的关系
一对多的关系是你在数据库中用到的最普遍的关系,用一对多的关系在表中创建外键会节省大量的工作。要创建你所需要的关系,你就必须保证包含外键的列被设置成不允许NULL值。不允许NULL需要在列中插入一个值,并且增加外键要求该值包括在相关表的主键中。这种类型的关系贯彻了“一或多对一”的基数。 换句话说,你可以有一个单独的行但是你可以拥有无数个行。(本章后面我们会探讨安装高级基数的方法)。外键列中允许NULL能让你选择关系,也就是说,我们并不要求参考表和数据相关。如果你在表中跟踪计算机,并用其中的一种关系定义谁正在使用这台计算机,那么外键中的NULL就会显示没有被员工使用的计算机。
一对一的关系
一对一关系和一对多关系的实施的方法完全一样。你还会创建一个主键和外键,在这一点上的问题就是SQL Server还会允许用户在外键表中插入很多行参考主键表。没有什么方法能通过默认将数据约束到一对一的关系中。要实施一对一的关系,你就必须要有一些创造性。
第一项选择就是写存储程序(本章下面的内容会讨论更多的存储程序)来进行所有的操作工作,然后增加逻辑阻止表中增加另外的行。这种方法在很多情况下都适用,但是如果没有存储程序你又需要将数据直接下载到表中,这该怎么办呢?实施一对一的关系的另外一种方法就是使用触发器,我们在这里简要讨论了一下。基本上,触发器就是一个能在插入语句之后或代替插入语句的执行代码。用这种方法,你就可以这种一对一的关系进行重新插入。
此外,也可能是最简单的方法,就是你可以在外键中增加唯一性约束。就是说外键中的数据是主键中的值,每个值都只能在参考表中出现一次。这种方法可以很有效地创建被SQL Server管理和增强的一对一的关系。
多对多的关系
多对多的关系可能是最复杂的关系之一。即使你可以让两个实体之间拥有一种多对多的关系,你可不能在两个表之间创建多对多的关系。要创建这种关系,你就必须创建第三个表,即连接表以及两个一对多关系。
我们通过一个例子看一下它怎么运作。你现在有两个表,一个为Student,另一个为Class,每个表都包括它们的主键identity(即objid)。这种情况下你需要多对多关系,因为一个学生可能在以上的班级中,一个班级也可能有一个以上的学生。创建这种关系,你之需要创建有两个列的表:一个包含student_objid,另一个包含class_objid。这样你就可以将连接表对Student表、另一个连接表对Class表之间创建一对多的关系。图3.3表明了这种关系。
图3.3 Student和Class表之间的多对多的关系
你会发现这种设置的一些东西。首先,除了是外键,这些列一起能用作Student_Class表的主键。怎样才能创建这种多对多的关系?只要它们不违反主键,这个连接表就能够包含主键。也就是说你能够将每个学生和所有他的班级相对应,你也可以将一个特殊班级中所有的学生和那个班级相对应。也就是多对多的关系。
可能听起来很复杂,但是如果你创建了一种多对多的关系并在表中增加了数据,那么它就变得很清晰了。真正弄懂它的最佳方法就是实践,当我们在第九章中建立物理模型时,我们就在更进一步了解多对多的关系,包括一些让它们变得很有用的方法。
在第二章中,我们谈到了基数。基数仅用来介绍一个表和另一个表相关联的行数。基数通常是由客户的事物规则衍生而来的。有了一对一的关系,SQL Server本身没有支持基数的方法。用主键和外键,你很容易就能够增强一或多对多、零或多对多、或者一对一的基数,就像之前我们讨论的一样。
如果每个父级记录只能包括有限的子级记录,你要创建一种关系该怎么做?例如,用employee或vehicle表,你可能会想限制数据,这样每个员工就至多有能够和五辆车匹配。此外,员工根本就没有必要要一两小汽车。这种关系的基数就是零对五对多。要增强这种需求,你就要进行一些创新。在这种情况下,你可以使用触发器计算出和一个员工匹配的汽车数量。如果与员工匹配的汽车的数量超过5,那你就要重新插入。
每种情况都是唯一的。在一些情况中你可能会用查询约束或者另一种PK、FK组合来实现基数。你需要检查决定的最佳方法的条件是什么。
翻译
相关推荐
-
云端SQL Server高可用性最佳做法
与内部部署相比,在云端运行SQL Server可为数据库软件用户提供更多的灵活性和可扩展性,也可能更省钱。但云 […]
-
绘制数据关系图的利器:SQL Server 图像数据库工具
SQL Server 2017新增了图形数据库功能,你可以使用图结构来表示不同数据元素之间的关系。
-
如何在Azure部署时选择合适的SQL Server?
想要在Azure上运行SQL Server,企业一般会面临两种选择:在Azure虚拟机上安装SQL Server或使用Azure SQL Database。
-
Linux支持的引入 推动了SQL Server 2016集成服务的发展
随着SQL Server的不断发展,集成服务也在发生相应的变化。在最新的SSIS更新中,增加Linux支持和SQL Server 2016升级向导。