|
|
|
|
移动端

2.1 基本概念(2)

《程序员面试笔试真题与解析》本书针对当前各大 IT企业面试笔试中特性与侧重点,精心挑选了 3年以来近百家典型 IT企业的面试笔试真题,这些企业涉及业务包括系统软件、搜索引擎、电子商务、手机 APP、安全关键软件等,面试笔试真题非常具有代表性与参考性。本节为基本概念。

作者:猿媛之家来源:机械工业出版社|2017-12-07 11:08

有奖调研 | 1TB硬盘等你拿 AI+区块链的发展趋势及应用调研


2.1 基本概念(2)

【真题 289】一个关系模式为 Y(X1,X2,X3,X4),假定该关系存在着如下函数依赖:( X1,

X2)→X3,X2→X4,则该关系属于()。

A.第一范式 B.第二范式 C.第三范式 D.第四范式答案:A。范化是在识别数据库中的数据元素、关系,以及定义所需的表和各表中的项目这些初始工作之后的一个

细化的过程。常见的范式有 1NF、2NF、3NF、BCNF以及 4NF。以下将分别对这几种范式进行介绍。所谓第一范式( 1NF)是指在关系模型中,对域添加的一个规范要求,所有的域都应该是原子性的,即数据库表的每一列都是不可分割的原子数据项,而不能是集合、数组、记录等非原子数据项。即当实

体中的某个属性有多个值时,必须将其拆分为不同的属性。在符合第一范式( 1NF)表中的每个域值只能是实体的一个属性或一个属性的一部分。简而言之,第一范式就是无重复的域。例如,由“职工号”“姓名”“电话号码”组成的表(一个人可能有一个办公电话和一个移动电话),这时将其规范化为 1NF可以将电话号码分为“办公电话”和“移动电话”两个属性,即职工表(职工号,姓名,办公电话,移动电话)。

需要注意的是,在任何一个关系型数据库中,第一范式( 1NF)是对关系模式的设计基本要求,一般设计时都必须满足第一范式( 1NF)。不过有些关系模型中突破了 1NF的限制,这种称为非 1NF的关系模型。换句话说,是否必须满足 1NF的最低要求,主要依赖于所使用的关系模型。

2NF,即第二范式,是在第一范式( 1NF)的基础上建立起来的,即满足第二范式( 2NF)必须先满足第一范式( 1NF)。第二范式( 2NF)要求数据库表中的每个实例或行必须可以被唯一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。如果关系模式 R为第一范式,并且 R中一个非主属性完全函数依赖于 R的某个候选键,则称 R为第二范式模式。(如果 A是关系模式 R的候选键的一个属性,则称 A是 R的主属性,否则称 A是 R的非主属性。)例如,在选课关系表(学号,课程号,成绩,学分),关键字为组合关键字(学号,课程号),但由于非主属性学分仅依赖于课程号,对关键字(学号,课程号)只是部分依赖,而不是完全依赖,所以,此种方式会导致数据冗余以及更新异常等问题,解决办法是将其分为两个关系模式:学生表(学号,课程号,分数)和课程表(课程号,学分),新关系通过学生表中的外键字课程号联系,在需要时通过两个表的连接来取出数据。

3NF,即第三范式,如果关系模式 R是第二范式,且每个非主属性都不传递依赖于 R的候选键,则称 R是第三范式的模式。例如学生表(学号,姓名,课程号,成绩),其中学生姓名无重名,所以,该表有两个候选码(学号,课程号)和(姓名,课程号),则存在函数依赖:学号→姓名,(学号,课程号)→成绩,(姓名,课程号)→成绩,唯一的非主属性成绩对码不存在部分依赖,也不存在传递依赖,所以,属于第三范式。

BCNF构建在第三范式的基础上,如果关系模式 R是第一范式,且每个属性都不传递依赖于 R的候选键,那么称 R为 BCNF的模式。假设仓库管理关系表(仓库号,存储物品号,管理员号,数量),满足一个管理员只在一个仓库工作;一个仓库可以存储多种物品。则存在如下关系:

(仓库号,存储物品号)→(管理员号,数量)

(管理员号,存储物品号)→(仓库号,数量)

所以,(仓库号,存储物品号)和(管理员号,存储物品号)都是仓库管理关系表的候选码,表中的唯一非关键字段为数量,它是符合第三范式的。但是,由于存在如下决定关系:

(仓库号)→(管理员号)

(管理员号)→(仓库号)

即存在关键字段决定关键字段的情况,所以,其不符合 BCNF范式。把仓库管理关系表分解为二个关系表:仓库管理表(仓库号,管理员号)和仓库表(仓库号,存储物品号,数量),这样的数据库表是符合 BCNF范式的,消除了删除异常、插入异常和更新异常。

4NF,即第四范式,设 R是一个关系模式, D是 R上的多值依赖集合。如果 D中成立非平凡多值依赖 X→Y时,X必是 R的超键,那么称 R是第四范式的模式。例如,职工表(职工编号,职工孩子姓名,职工选修课程),在这个表中同一个职工也可能会有多个职工孩子姓名,同样,同一个职工也可能会有多个职工选修课程,即这里存在着多值事实,不符合第四范式。如果要符合第四范式,只需要将上表分为两个表,使它们只有一个多值事实,例如职工表一(职工编号,职工孩子姓名),职工表二(职工编号,职工选修课程),两个表都只有一个多值事实,所以,符合第四范式。

对于本题而言:这个关系模式的候选键为 {X1,X2},因为 X2→X4,说明有非主属性 X4部分依赖于候选键{X1,X2},因此,这个关系模式不为第二范式。

所以,本题的答案为 A。

【真题 290】查询性能()。

程序员面试笔试真题与解析

A.在 Name字段上添加主键C.在 Age字段上添加主键答案:B。  B.在 Name字段上添加索引 D.在 Age字段上添加索引

主关键字(主键, Primary Key)是表中的一个或多个字段,它的值用于唯一地标识表中的某一条记录。在两个表的关系中,外键用来在一个表中引用来自于另一个表中的特定记录。主关键字是一种唯一关键字,表定义的一部分。一个表不能有多个主关键字,并且主关键字的列不能包含空值。

索引是一种提高数据库查询速度的机制,它是一个在数据库的表或视图上按照某个关键字段的值,升序或降序排序创建的对象,当用户查询索引字段时,它可以快速地执行检索操作,借助索引,在执行查询的时候不需要扫描整个表就可以快速地找到所需要的数据。一条索引记录包含键值和逻辑指针。创建索引时,系统分配一个索引页。在表中插入一行数据,同时也向该索引页中插入一行索引记录。由此可以看出,索引在提高查询效率的同时也增加了插入操作的时间,由此适合在以查询为主的场景使用。

索引的类型有聚簇索引和非聚簇索引。聚簇索引是表中的行的物理顺序与键值的逻辑顺序一样,一个表只能有一个聚簇索引。非聚簇索引是数据存储与索引存储不在同一个地方。与非聚簇索引相比,聚簇索引一般情况下可以获得更快的数据访问速度。

创建索引可以大大提高系统的性能,主要表现为以下几个方面的内容:首先,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。其次,通过索引,可以大大加快数据的检索速度。再次,通过索引可以加速表和表之间的连接,从而有效实现数据的完整性。然后,在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。最后,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

索引可以有效地提高查询效率,那么为什么不因此而将所有的列都建立索引呢?其实索引尽管可以带来方便,但并非越多越好,过多的索引也会带来许多不利的问题。首先,创建索引和维护索引要耗费时间、空间,当数据量比较小时,这种问题还不够突出,而当数据量比较大时,这种缺陷会比较明显,效率会非常低下。其次,除了数据表占数据空间之外,每一个索引还需要占用一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大,从而造成不必要的空间浪费。最后,当对表中的数据进行增加、删除和修改的时候,索引也要动态地维护,从而降低了数据的维护速度。

通过以上分析发现,如果需要提高查询速度,可以在经常被查询的字段上创建索引来提高查询效率。对于 Name(姓名)和 Age(年龄),通常而言,姓名是经常被查询的字段,因此,通过增加索引可以提高查询效率。所以,选项 B正确。

【真题 291】设有一个关系: DEPT(DNO,DNAME),如果要找出倒数第三个字母为 W,并且至少包含 4个字母的 DNAME,则查询条件子句应写成 WHERE DNAME LIKE()。

A.'_ _W_%' B.'_%W_ _' C.'_W__' D.'_W_%'答案:B。在 SQL语言中, %和_表示的是通配符(通配符指的是一种特殊语句,用来进行模糊查询的,在匹

配字符串时,可以使用它来代替一个或多个真正字符,当不知道真正字符或者懒得输入完整名字时,常常使用通配符代替一个或多个真正的字符),其中“ %”表示的是 0个或多个字符,而“ _”表示的是一个字符。

在本题的查找条件中,要求倒数第三个字母为 ‘W’,所以,字符 ‘W’后面有两个其他字符,可以表示成“W_ _”,并且还要求至少包含 4个字母,而当以“ %”开头时,它表示的字符可以不存在,所以,开头应加一个“ _”,那么查询条件子句应写成 WHERE DNAME LIKE '_ % W _ _'。

所以,本题的答案为 B。

需要注意的是,除了以上介绍的两种通配符以外, SQL语言中还有两个通配符, [charlist]表示字符

列中的任何单一字符, [^charlist]或者[!charlist]表示不在字符列中的任何一个字符。例如,要求从名为 “Persons”的表中选取居住的城市以“ A”或“L”或“N”开头的人,可以使用下面的 SELECT 语句: SELECT * FROM Persons WHERE City LIKE '[ALN]%'。要求从名为 “Persons”的表中选取居住的城市不

以“A”或“L”或“N”开头的人,可以使用下面的 SELECT 语句: SELECT * FROM Persons WHERE City LIKE '[!ALN]%'。


喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

C++编程你也行

本书是一本优秀的C++教材,内容包括:基础类型、操作符和简单变量,循环和决策,命名空间和C++标准库,用C++编写函数,行为、序列点和求值...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊