1700416100
1700416101
在销售记录表上,还要添加顾客ID和商品ID,这两个字段分别是另外两张表的主键,对于销售记录表来说,它们就是“外键”(Foreign Key)。通过主键和外键上相同的值,多个表之间就产生了关联,就可以顺藤摸瓜取出数据。例如,销售记录中最上面的一条记录是(1,1,1,3),分别表示该销售记录ID为1,顾客ID为1的顾客习了3个商品ID为1的商品。通过顾客表,可以知道顾客ID为1的顾客信息是(1,日经次郎,东京都千代田区,03-2222-2222)。通过商品表,可以知道商品ID为1的商品信息是(1,日本酒,2000)。虽然作为销售记录表主键的“销售记录ID“字段并不是其他表的外键,但考虑到以后有可能会与其他表发生关联,并且习惯上必定要在表中设置一个主键,所以予以保留。主键既可以由一个字段充当,也可以将多个字段组合在一起形成复合主键
1700416102
1700416103
表之间的关系使记录和记录关联了起来。记录之间虽然在逻辑上有一对一、多对多以及一对多(等同于多对一)三种关系,但在关系型数据库中无法直接表示多对多关系。这是因为在多个字段中以顺藤摸瓜的方式查找数据并不那么容易。如果将酒铺的数据库只分为顾客表和商品表,那么这两张表就形成了多对多关系。也就是说一位顾客可以购买多个商品,反过来一种商品可以被多个顾客所购买
1700416104
1700416105
当出现多对多关系时,可以在这两张表之间再加入一张表,把多对多关系分解成两个一对多关系(如图8.10所示)。
1700416106
1700416107
图8.10 可以把多对多关系分解成两个一对多关系
1700416108
1700416109
1700416110
1700416111
1700416112
加入的这张表被称为连接表(Link Table)。在酒铺数据库中,销售记录表就是连接表,如图8.7所示,在表示一对多关系的连线的两端,写有“1”的一侧表示“一”,写有“∞”符号的一侧表示“多”
1700416113
1700416114
DBMS中还具有检查参照完整性的功能,这种机制也是为了一致并且安全地存储数据。例如,在目前的洒铺数据库中,如果从商品表中删除了“日本酒”这条记录,那么在销售记录表中,曾经记录着买的是日本酒的那两条记录就不再能说明买的是什么商品了。但一旦勾选了实施参照完整性的选项(如图8.11所示),在应用程序中再执行这类操作时,DBMS就会拒绝执行
1700416115
1700416116
图8.11 设置参照完整性
1700416117
1700416118
1700416119
1700416120
1700416121
如果是直接从编写的应用程序中读写数据文件,那么就会导致用户可以录入在主键上含有相同值的记录,或者由于没有进行参照完整性等方面的检查,使用户可以任意地执行删除数据之类的操作。而DBMS却能在这种问题上直到防患于未然的作用,确实是一种很方便的工具
1700416122
1700416123
1700416124
1700416125
1700416127
计算机是怎样跑起来的 8.6 索引能够提升数据的检索速度
1700416128
1700416129
可以在表的各个字段上设置索引(Index),这也是DBMS所具备的功能之一。虽然索引和键这两个概念容易让人混淆,但其实两者是完全不同的。索引仅仅是提升数据检索和排序速度的内部机制。一旦在字段上设置了索引,DBMS就会自动为这个字段创建索引表(如图8.12所示)
1700416130
1700416131
图8.12 设置索引
1700416132
1700416133
1700416134
1700416135
1700416136
索引表是一种数据结构,存储着字段的值以及字段所对应记录的位置。例如,如果在顾客表姓名字段上设置了索引,DBMS就会创建一张索引表(如图8.13所示)
1700416137
1700416138
图8.13 如果字段上有索引就可以缩短检索时间
1700416139
1700416140
1700416141
1700416142
1700416143
表中有两个字段,分别存储着顾客姓名和位置(所对应的记录在数据文件中的位置)。与原来的顾客表相比,索引表中的字段数更少,所以可以更快地进行数据的检索和排序。当查询数据时,DBMS先在索引表中进行数据的检索和排序,然后再根据位置信息从原来的数据表中把完整的记录取出来。索引所引起的就是“目录”的作用。与图书的目录一样,数据库的索引也是一种能够高效地查找目标数据的机制
1700416144
1700416145
既然索引能够提升检索和排序的速度,那么在所有表的所有字段上都加上索引不就好了吗?实际上不能这样做,因为一旦设置了索引,每次向表中插入数据时,DBMS都必须更新索引表。提升数据检索和排序速度的代价就是插入或更新数据速度的降低。因此,只有对那些要频繁地进行检索和排序的字段,才需要设置索引。在酒铺数据库这个例子中,只需要在顾客表的顾客姓名字段和商品表的商品名称字段上设置索引就足够了。如果表中充其量也就只有几千条记录,那么即使完全不使用索引,也不会感到检索或排序速度有多慢
1700416146
1700416147
1700416148
1700416149
[
上一页 ]
[ :1.7004161e+09 ]
[
下一页 ]