在关系数据库中,关系能防止冗余的数据。例如,如果正在设计一个数据库来跟踪有关书的信息,而每本书的信息(如书名、出版日期和出版商)都保存在一个名为 titles 的表中。同时还有一些想保存的有关出版商的信息,例如出版商的电话号码、地址和邮政编码。如果将所有这些信息都保存在 titles 表中,则对于某个出版商出版的每本书,出版商的电话号码将是重复的。
一个更好的解决方案是,单独在一个名为 publishers 的表中只保存一次出版商信息。然后在 titles 表中设置指针,以引用 publishers 表中的项。
若要确保数据同步,可以在 titles 表和 publishers 表之间强制引用完整性。引用完整性关系能确保某个表中的信息与另一个表中的信息相匹配。例如,titles 表中的每个书名必须和 publishers 表的特定出版商相关联。不能在数据库中添加数据库中不存在的出版商的书名。
为更好地理解表关系,请参见:
表关系类型
引用完整性概述
表关系类型
关系是通过匹配键列中的数据而工作的,而键列通常是两个表中具有相同名称的列。在大多数情况下,关系将一个表中为每个行提供唯一标识符的主键与另一个表中外键内的项相匹配。例如,通过在 titles 表的 title_id 列(主键)和 sales 表的 title_id 列(外键)之间创建一个关系,可以使销售额与特定的销售书名相关联。
表与表之间存在三种类型的关系。所创建的关系类型取决于相关联的列是如何定义的。
一对多关系
多对多关系
一对一关系
一对多关系
一对多关系是最常见的关系类型。在这种关系类型中,表 A 中的行可以在表 B 中有许多匹配行,但是表 B 中的行只能在表 A 中有一个匹配行。例如,publishers 表和 titles 表是一对多的关系:每一个出版商可出版许多书,但每一本书只能有一个出版商。
如果在相关列中只有一列是主键或具有唯一约束,则创建的是一对多关系。
一对多关系中的主键方由一个键 符号表示。关系中的外键方由一个无穷大 符号表示。
多对多关系
在多对多关系中,表 A 中的一行可与表 B 中的多行相匹配,反之亦然。通过定义称为连接表的第三方表创建这样的关系,该连接表的主键包括表 A 和表 B 中的外键。例如,authors 表和 titles 表是多对多关系,该关系通过从这些表中的每个表与 titleauthors 表的一对多关系定义。titleauthors 表的主键由 au_id 列(authors 表的主键)和 title_id 列(titles 表的主键)组成。
一对一关系
在一对一关系中,表 A 中的一行最多只能与表 B 中的一行相匹配,反之亦然。如果两个相关列都是主键或具有唯一约束,则创建的是一对一关系。
这种关系不常见,因为这种方式的大部分相关信息都在一个表中。使用一对一关系可以是为了:
分割一个含有许多列的表。
出于安全考虑而隔离表的某一部分。
存储可以很容易删除的临时数据,只需删除表即可删除这些数据。
存储只应用于主表子集的信息。
一对一关系的主键方由键 符号表示。外键方也由键 符号表示。
引用完整性概述
引用完整性是一种规则系统,这些规则可确保相关表中各行间关系的有效性,并确保不会意外删除或更改相关的数据。
在强制引用完整性时必须遵循以下规则:
如果在相关表的主键中不存在某个值,则不能在相关表的外键列中输入该值。但是,可以在外键列中输入空值。例如,在 employee 表中没有包括某职员,则不能指明分配给该职员的工作,但是可在 employee 表的 job_id 列输入空值来指明没有给该职员分配工作。
如果在相关表中存在与某行匹配的行,则不能从主表中删除该行。例如,如果在 employee 表中给多个职员分配了由 jobs 表中某行所代表的工作时,则不能删除该行。
当主表的某行有相关行时,则不能更改主键值。例如,如果将 jobs 表中的一项工作分配给某职员,则不能从 employee 表中删除该职员。
当满足下述所有条件时,可以设置引用完整性:
主表中相匹配的列是主键或具有唯一约束 。
相关列具有相同的数据类型和长度。
两个表属于同一个数据库。
数据库关系图中的已强制关系和未强制关系
在数据库关系图中创建关系线将在相关表上创建外键约束,从而自动强制引用完整性。在数据库关系图中,已强制关系用实线表示。例如:
在关系图中,未强制关系用虚线表示,这种关系的外键约束被禁用。例如:
根据数据库的功能,对于某些情况(例如在 INSERT 和 UPDATE 事务处理过程中)可设置选项以禁用外键约束。
有的人认为,这样能保证数据的一致性和完整性,不过我不喜欢搞些关联,我们的程序不能因为数据库有限制就在 *** 作时候放弃相关的检测,那样程序老是会出现一些莫名其妙的报错。既然程序要进行完整的逻辑检测,那么数据库的这些限制就完全是多余的、有害无益的。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)