Head First SQL 第七章

来源:互联网 发布:对万方数据库的评价 编辑:程序博客网 时间:2024/05/02 00:15

这章开始讲的是拓展你的表格。

某些时候,一张表不够用了,该怎么办?

首先复习了一下SELECT 和 AND 的用法,不难啊。但是这样还是太麻烦了。

===============================================================

SUBSTRING_INDEX还记得吗?

 SUBSTRING_INDEX 寻找单引号里面的字符串,取出它前面的所有内容

  location是列名称

SELECT SUBSTRING_INDEX(location, ‘,’, 1) FROM my_contacts;这里单引号里面是逗号。

这里可以用

...AND SUBSTRING_INDEX(interests, ',' ,1) = 'animals';

找到第一项兴趣爱好都是动物的。

=================================================================

还是不满意?那么添加更多兴趣列表吧。

使用ALTER

然后使用SUBSTRING_INDEX拆开字符串

写出四列兴趣

interest1.

interest2.

interest3.

interest4.


。。。但是好像还是不太好,这里就引出了自然而然建立专门的兴趣表的方法。

==============================================

我们需要更多的表来记录。

回到第三章的小丑追踪,我们把小丑表改为多张表格。




当一个列没有原子性的时候,就可以考虑新建表了,比如这里的兴趣爱好,有的人兴趣爱好一样,则这列的原子性就不存在了。

那么单独建立一个兴趣爱好的表,链接到人那里,这样就有原子性了。


但是如何链接呢?就是说,如何知道每项兴趣爱好属于谁?P300


我们需要独一无二的列来链接一切,比如在联系人表里面有个  主键:contact_id


把这个主键作为兴趣列表中的一列,就可以通过主键列知道某个兴趣属于联系人表里面的某个人,这种方式叫做:

“外键”P303

==========================================================================================

外键使用的主键叫父键 parent key,主键所在的表叫父表 parent table

外键能用于确认一张表中的行与另一张表中的行相对应。

外键可以是NULL,当然主键不能是NULL。外键为NULL表示父表中没有相符的主键。避免这种情况,可以添加  约束constrant   来实现



我们可以在创建新表的时候加入外键:ALTER TABLE...P306


CREATE TABLE interests(Int_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,Interest VARCHAR(50) NOT NULL,Contact_id INT NOT NULL,CONSTRAINT my_contacts_contact_id_fkFOREIGN KEY (contact_id)REFERENCES my_contacts (contact_id));

在这里

FOREIGN KEY (contact_id)

括号里面的列名称就是外键,可以随意命名。

REFERENCES my_contacts (contact_id)

其中my_contancts指定外键的来源表,括号里面是外键在来源表里面的名称。这里明显本表和来源表里面的外键列名都是一样的。

CONSTRAINT 是约束,格式为CONSTRAINT constraint_name,填写的约束名称。


创建完以后记得 DESC interests,看看哪里显示的是约束的位置。

添加外键约束很重要,可以确保安全,引用的完整性。


接下来数据所属模式有一对一,一对多,多对多。这是数据库模式(schema)

=====================================================

首先看一对一模式:

Table A中的某条记录在Table B中最多只能有一条相对应的记录。

父表中只有一行与子表的某行相关。


其实真正用到一对一关系的机会非常少。

=====================================================

一对多模式:

“擅长no1.画画的人可能有很多个。”这就是一个“画画”对应多个人。


=====================================================

多对多模式:

许多女士有许多鞋子。

如果一张表记录姓名,一张表记录鞋子名,就要多对多链接。

毕竟一种鞋子不可能只有一位女士买,一位女士也不可能只有一双鞋子。


============================================================================

两个表之间多对多必然会导致表里面出现重复数据.。所以我们需要设计一个 “连接表”junction table

用来储存两个相关表的主键。

就是把

多对多

分解成为

两个一对多


如此。

所以,中间连接表很重要。

=========================================================================

现在复习一下第一范式1NF:

规则一:数据列只包含具有原子性的值

规则二:没用重复的数据组



一起使用 toy_id 和 color 的值,就能形成唯一的主键。这种两列以上组合成的键叫做 组合键

===============================================================================

当某一列数据(比如姓名缩写)必须跟随另一列数据(比如姓名)的改变而改变的时候,表示第一列函数依赖于第二列。

现在学习速记符号:


T.x  -> T.y

表示在关系表T中,y列函数依赖于x列。


接下来套用:


super_heroes.name -> super_heroes.initials

在关系表 super_heroes 中,initials列函数依赖于name列。


===========================================================================

部分函数依赖

是指非主键的列依赖于组合主键的某个部分,但不是完全依赖于组合主键。


如果改变任何非键列可能造成其他列的改变,即为传递依赖


第二范式的重点:表的主键与表中其他数据之间的关系。


符合 1NF的表只要其所有列都是主键的一部分,则它也就符合2NF。


第二范式(2NF):

规则一:先符合1NF。

规则二:没有部分函数依赖性。


===========================================================================================

第三范式(3NF):

规则一:符合2NF。

规则二:没有传递函数依赖性。



0 0
原创粉丝点击