前言:
MySQL关系型数据库是建立在关系模型上的,而关系模型本质上就是若干个存储数据的二维表。
表的每一行称为记录(Record),记录的是一个逻辑意义上的数据。
表的每一列称为字段(Column),同一个表的每一行记录都拥有相同的若干字段。
字段定义了数据类型(整形、浮点型、字符串、日期等),以及是够能够为NULL。这里的NULL表示字段数据并不存在,并不是指数字0或者空字符串""。
正文:
1、表和表之间的关系
关系型数据库的表和表之间需要建立“一对一”、“一对多”、“多对多”的关系,详细介绍请参考本人另一篇博客:https://blog.csdn.net/qq_32166627/article/details/53957109
2、主键
表的每一条记录都包含若干定义好的字段,同一张表的所有记录都有相同的字段定义。
对应关系表,有个很重要的约束,就是任意2条记录不能重复。不能重复是指不同的记录能够通过某个字段来进行唯一区分,那么这个字段被称为主键。
对于主键的要求,最重要的一点是:记录一旦插入到表中,主键最好不要再修改,因为主键是用来唯一定位记录的,修改了主键,会造成一系列的影响。
由于主键的作用十分重要,怎么选择主键会对业务开发产生重要的影响。如果我们以身份证号码作为主键,似乎能唯一定位一条记录,但是身份证号码属于一种业务场景,如果身份证号升位了,或者需要变更,作为主键,不得不进行修改的时候,就会对业务产生严重的影响。
所以,选择主键的一个基本原则是:不要使用任务跟业务相关的字段作为主键。那么,身份证号、手机号、邮箱地址等这些看上去可以唯一标识的字段,都不能作为主键。
用作主键的字段一定是要跟业务完全无关的,我们一般把这个字段命名为id。常见的可以用作id的字段类型有:
1、自增整数类型:数据库会在插入数据时自动为每一条记录分配一个自增证书,这样我们就完全不用担心主键重复,也不用自己预先生成主键。
2、全局唯一GUID类型:使用一种全局唯一的字符串作为主键,类似于:f6dd9694-44bc-44c5-9f45-17e45724bedd。GUID算法是通过网卡MAC地址、时间戳、随机数保证任意计算机在任意时间生成的字符串都是不相同的,大部分编程语言都内置了GUID算法,程序员可以预先计算出主键。
2.1 联合主键
关系型数据库还允许通过多个字段来唯一标识记录,这种主键被称为联合主键。对于联合主键,允许有一列有重复,只要联合主键没有重复即可。
3、外键
外键常用在“一对多”、“多对多”关系上,作为表关联的纽带。一般外键定义在“多”的那张表中,对应的是“一”的那张表的主键,这样就把两张表关联起来了。定义外键并不是通过列名实现的,而是通过定义外键约束实现的:
FOREIGN KEY (stuId) REFERENCES stu(stuId)
这句话表示将当前表的stuId字段关联到stu表的stuId字段。FOREIGN KEY (stuId)指定了本表的stuId字段作为外键,REFERENCES stu(stuId)指定了这个外键将关联到stu表的stuId列(即stu表的主键)。
通过定义外键约束,关系型数据库可以保证无法插入无效的数据。即如果stu表中不存在id=999的记录,那么score表就无法插入stuId=999的记录。
由于外键约束会降低数据库的性能,大部分实时性要求高的应用为了追求速度,并不设置外键约束,而是靠应用程序本身来保证逻辑的正确性。