8.5 用主键和外键在表间建立关系
为了在表间建立关系,就必须加入能够反映表与表之间关系的字段,为此所添加的新字段就称为键(key)。首先要在各个表中添加一个名为主键(primary key)的字段,该字段的值能够唯一地标识表中的一条记录(如图8.9所示)。
图8.9 把字段设置为主键
在顾客表中添加的“顾客ID“字段、销售记录表中添加的“销售记录ID”字段以及在商品表中添加的“商品ID”字段都是主键
正如“顾客ID“一样,通常将主键命名为“某某ID”这是因为主键存储的是能够唯一标识一条记录的ID(Identification,识别码)。如图8.8所示,如果顾客表中顾客ID是1的话,就能确定是日经次郎这条记录;顾客ID是话,就能确定是矢泽三郎这条记录。正因为这种特性,在主键上绝不能存储相同的值。如果试图录入 在主键上含有相同值的记录,DBMS就会产生一条错误通知,这就是DBMS所具备的一种一致并且安全地存储数据的机制
在销售记录表上,还要添加顾客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“字段并不是其他表的外键,但考虑到以后有可能会与其他表发生关联,并且习惯上必定要在表中设置一个主键,所以予以保留。主键既可以由一个字段充当,也可以将多个字段组合在一起形成复合主键
表之间的关系使记录和记录关联了起来。记录之间虽然在逻辑上有一对一、多对多以及一对多(等同于多对一)三种关系,但在关系型数据库中无法直接表示多对多关系。这是因为在多个字段中以顺藤摸瓜的方式查找数据并不那么容易。如果将酒铺的数据库只分为顾客表和商品表,那么这两张表就形成了多对多关系。也就是说一位顾客可以购买多个商品,反过来一种商品可以被多个顾客所购买
当出现多对多关系时,可以在这两张表之间再加入一张表,把多对多关系分解成两个一对多关系(如图8.10所示)。
图8.10 可以把多对多关系分解成两个一对多关系
加入的这张表被称为连接表(Link Table)。在酒铺数据库中,销售记录表就是连接表,如图8.7所示,在表示一对多关系的连线的两端,写有“1”的一侧表示“一”,写有“∞”符号的一侧表示“多”
DBMS中还具有检查参照完整性的功能,这种机制也是为了一致并且安全地存储数据。例如,在目前的洒铺数据库中,如果从商品表中删除了“日本酒”这条记录,那么在销售记录表中,曾经记录着买的是日本酒的那两条记录就不再能说明买的是什么商品了。但一旦勾选了实施参照完整性的选项(如图8.11所示),在应用程序中再执行这类操作时,DBMS就会拒绝执行
图8.11 设置参照完整性
如果是直接从编写的应用程序中读写数据文件,那么就会导致用户可以录入在主键上含有相同值的记录,或者由于没有进行参照完整性等方面的检查,使用户可以任意地执行删除数据之类的操作。而DBMS却能在这种问题上直到防患于未然的作用,确实是一种很方便的工具
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论