美文网首页
2019-06-06 SQL关系模型

2019-06-06 SQL关系模型

作者: 章逸佳 | 来源:发表于2019-06-08 09:55 被阅读0次

    我们已经知道,关系数据库是建立在关系模型上的。而关系模型本质上就是若干个存储数据的二维表,可以把它们看作很多Excel表。

    表的每一行称为记录(Record),记录是一个逻辑意义上的数据。表的每一列称为字段(Column),同一个表的每一行记录都拥有相同的若干字段。字段定义了数据类型(整型、浮点型、字符串、日期等),以及是否允许为NULL。注意NULL表示字段数据不存在。

    在关系数据库中,关系是通过主键和外键来维护的。

    一、主键

    在关系数据库中,一张表中的每一行数据被称为一条记录。一条记录就是由多个字段组成的。例如,

    对于关系表,有个很重要的约束,就是任意两条记录不能重复。不能重复不是指两条记录不完全相同,而是指能够通过某个字段唯一区分出不同的记录,这个字段被称为主键。

    对主键的要求,最关键的一点是:记录一旦插入到表中,主键最好不要再修改。因为主键是用来唯一定位记录的,修改了主键,会造成一系列的影响。

    由于主键的作用十分重要,如何选取主键会对业务开发产生重要影响。如果我们以学生的身份证号作为主键,似乎能唯一定位记录。然而,身份证号也是一种业务场景,如果身份证号升位了,或者需要变更,作为主键,不得不修改的时候,就会对业务产生严重影响。所以,选取主键的一个基本原则是:不使用任何业务相关的字段作为主键。

    因此,身份证号、手机号、邮箱地址这些看上去可以唯一的字段,均不可用作主键。

    作为主键最好是完全业务无关的字段,我们一般把这个字段命名为id。常见的可作为id字段的类型有:

    1.自增整数类型:数据库会在插入数据时自动为每一条记录分配一个自增整数,这样我们就完全不用担心主键重复,也不用自己预先生成主键;

    2.全局唯一GUID类型:使用一种全局唯一的字符串作为主键,类似8f55d96b-8acc-4636-8cb8-76bf8abc2f57。GUID算法通过网卡MAC地址、时间戳和随机数保证任意计算机在任意时间生成的字符串都是不同的,大部分编程语言都内置了GUID算法,可以自己预算出主键。

    关系数据库实际上还允许通过多个字段唯一标识记录,即两个或更多的字段都设置为主键,这种主键被称为联合主键。对于联合主键,允许一列有重复,只要不是所有主键列都重复即可

    二、外键

    1.一对多

    通过关系表中的某个字段,可以把数据与另一张表关联起来,这种列称为外键。外键并不是通过列名实现的,而是通过定义外键约束实现的:

    ALTER TABLE students #students是要被加上外键的表

    ADD CONSTRAINT fk_class_id#添加外键约束

    FOREIGN KEY (class_id) #指定class_id作为外键

    REFERENCES classes (id) #指定这个外键将关联到classes表的id列

    其中,外键约束的名称fk_class_id可以任意,FOREIGN KEY (class_id)指定了class_id作为外键,REFERENCES classes (id)指定了这个外键将关联到classes表的id列(即classes表的主键)。

    通过定义外键约束,关系数据库可以保证无法插入无效的数据。即如果classes表不存在id=99的记录,students表就无法插入class_id=99的记录。

    由于外键约束会降低数据库的性能,大部分互联网应用程序为了追求速度,并不设置外键约束,而是仅靠应用程序自身来保证逻辑的正确性。这种情况下,class_id仅仅是一个普通的列,只是它起到了外键的作用而已。

    要删除一个外键约束,也是通过ALTER TABLE实现的:

    ALTER TABLE students

    DROP FOREIGN KEY fk_class_id;

    2.多对多

    通过一个表的外键关联到另一个表,我们可以定义出一对多关系。有些时候,还需要定义“多对多”关系。例如,一个老师可以对应多个班级,一个班级也可以对应多个老师,因此,班级表和老师表存在多对多关系。

    多对多关系实际上是通过两个一对多关系实现的,即通过一个中间表,关联两个一对多关系,就形成了多对多关系:

    teachers表:

    teacher表

    class表:

    class表

    中间表teacher_class关联两个一对多关系:

    中间表

    通过中间表teacher_class可知teachers到classes的关系:

    -id=1的张老师对应id=1,2的一班和二班;

    -id=2的王老师对应id=1,2的一班和二班;

    -id=3的李老师对应id=1的一班;

    -id=4的赵老师对应id=2的二班。

    同理可知classes到teachers的关系:

    -id=1的一班对应id=1,2,3的张老师、王老师和李老师;

    -id=2的二班对应id=1,2,4的张老师、王老师和赵老师;

    因此,通过中间表,我们就定义了一个“多对多”关系。

    3.一对一

    一对一关系是指,一个表的记录对应到另一个表的唯一一个记录。例如,students表的每个学生可以有自己的联系方式,如果把联系方式存入另一个表contacts,我们就可以得到一个“一对一”关系。

    三、索引

    索引是关系数据库中对某一列或多个列的值进行预排序的数据结构。通过使用索引,可以让数据库系统不必扫描整个表,而是直接定位到符合条件的记录,这样就大大加快了查询速度。例如,对于students表:

    如果要经常根据score列进行查询,就可以对score列创建索引:

    ALTER TABLE students

    ADD INDEX idx_score (score);#创建了一个名称为idx_score,使用列score的索引。

    即该列的值如果越互不相同,那么索引效率越高。反过来,如果记录的列存在大量相同的值,例如gender列,大约一半的记录值是M,另一半是F,因此,对该列创建索引就没有意义。索引的优点是提高了查询效率,缺点是在插入、更新和删除记录时,需要同时修改索引,因此,索引越多,插入、更新和删除记录的速度就越慢。对于主键,关系数据库会自动对其创建主键索引。使用主键索引的效率是最高的,因为主键会保证绝对唯一。

    某些列根据业务要求,具有唯一性约束:即不能出现两条记录存储了同一个身份证号。这个时候,就可以给该列添加一个唯一索引。例如,我们假设students表的name不能重复:

    ALTER TABLE students

    ADD UNIQUE INDEX uni_name (name);#通过UNIQUE关键字添加了一个唯一索引。

    相关文章

      网友评论

          本文标题:2019-06-06 SQL关系模型

          本文链接:https://www.haomeiwen.com/subject/xcabxctx.html