这章开始讲的是拓展你的表格。
某些时候,一张表不够用了,该怎么办?
首先复习了一下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_fk
FOREIGN 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。
规则二:没有传递函数依赖性。