第章 组合数据集
回顾第章可知关系型数据库规范化的过程就是分解数据使之具有最大的精确度同时又具有最小重复的过程通过在多个包含数据的表之间建立关系就可以在很大程度上实现规范化的目标关系是通过使用特定的值也称为键来建立的每一条记录的键值在整个表中是唯一的
关系理论中那些正式的术语可能会让人感觉非常难以理解在本书中笔者将使用友好的术语例如表行(记录)和列它们对应的正式术语分别为关系元组和属性
关系模型可以很好地维护数据并尽可能地减少数据的不一致性但是当实际使用数据时关系模型并不是那么友好在着手开始烹饪一桌菜肴之前厨师通常会将所有的配料都摆放齐全然后根据做菜的规则将它们烹饪在一起数据库的用户也必须完成类似的工作考虑好想要访问哪些数据然后从各个表中取回所有必要的数据并将其放在一个临时的结构或数据集中这一工作是由JOIN关键字来完成的前面的章节已经简要地介绍过该关键字
再探JOIN
RDBMS中的数据保存在各个表中这些表通过父子关系链接起来数据模型规范化的程度越高表与表之间的链接数量也就越多
通常情况下为了生成相关的数据从中获取数据的各个表(源表)是链接或联接在一起的对于其中的某个表例如LIBRARY数据库中的BOOKS表每一个数据行必须具有一个唯一的键值(即必须唯一地标识每一个数据行)对于另外一个表例如LOCATION表则具有某个列用于保存BOOKS表中的键值该列的功能是保存BOOKS表的外键
图中BOOKS表与LOCATION表的关系可以进一步用图中的实际数据进行分析其中的各条连线指出了这两个表之间的关系(由于不允许存在孤立记录因此LOCATION表中的每一个数据行在BOOKS表中都具有一个对应的数据行反之则并非如此父表中可以包含在子表中没有对应记录的行根据最佳实践的规则每一个表都分别具有一个主键BK_ID和LOC_ID而LOCATION表还具有一个外键FK_BK_LOC)
图
图
在图展示的例子中BOOKS表与LOCATION表的关系是通过BOOKS表中的BK_ID(主键)和FK_BK_LOC(LOCATION表中对应的外键)来建立的在BOOKS表的数据行与LOCATION表的数据行之间是一个一一对应的关系但情况并非总是如此当我们具有同一本图书的多个副本时LOCATION表中的一个或多个行就可能包含BOOKS表中该本图书多个的相同键值当然在BOOKS表中也可能有一些行在LOCATION表中根本没有与之匹配的记录(例如一本新的图书还没有在书柜中指定固定的位置)因此在LOCATION表的FK_BK_LOC列中并没有这本新图书的外键值(即该列包含NULL值)另外一个值得注意的问题是LOCATION表可能包含了多个不同表的外键
为了简单起见在上面的例子中我们假定这些表的主键仅包含一个列前面曾介绍过主键并非总是只包含一个列主键可以是一个包含多个列的复合主键此时外键也可由多个列共同组成只要列组合的值在表中是唯一的并且没有任何一个列包含NULL值那么这些列的组合就可以作为有效的候选主键
例如LIBRARY数据库中的BOOKS_AUTHORS表既包含了BOOKS表的外键又包含了AUTHORS表的外键表显示了如何通过一个中间表来解决多对多关系的问题
表 分解N:N关系
在一个规范化的数据库中严格地减少数据冗余是有代价的它增加了在规范化数据库中导航的复杂性为了将一个作者关联到一本图书必须通过一个中间表使用主键和外键作为唯一的向导才能从这两个表(或者多个表)中组装出我们所需的数据集
表可以以多种方式联接起来下面的小节将讨论联接的方式
返回目录SQL实战新手入门
编辑推荐
Oracle索引技术
高性能MySQL
数据仓库与数据挖掘培训视频教程