问答题
[说明] 某宾馆需要建立一个住房管理系统,部分的需求分析结果如下。
(1) 一个房间有多个床位,同一房间内的床位具有相同的收费标准。不同房间的床位收费标准可能不同。
(2) 每个房间有房间号(如201、202等)、收费标准和床位数目等信息。
(3) 每位客人有身份证号码、姓名、性别、出生日期和地址等信息。
(4) 对每位客人的每次住宿,应该记录其入住日期、退房日期和预付款额信息。
(5) 管理系统可以查询出客人所住的房间号。
根据以上的需求分析结果,设计出了一种关系模型,如图8-6所示。
【正确答案】房间号,身份证号
【答案解析】[解析]
主键也称为主码,是关系中的一个或一组属性,其值能唯一标识一个元组。结合常识可知,“房间”关系模式的主键是“房间号”,“客人”关系模式的主键是“身份证号”。
根据E-R模型到关系模式的转换规则,若实体间联系是多对多(m:n),则将联系类型也转换成关系模式,其属性为两端实体类型的主键(作为外键)加上联系类型自身的属性,而该关系模式的主键为两端实体主键的组合。在如图8-6所示的实体联系图中,“房间”实体与“客人”实体之间存在的联系类型是多对多(m:n)。因此,“住宿”关系模式的属性需要包含“房间”关系模式的主键“房间号”、“客人”关系模式的主键“身份证号”和自身的属性“入住日期”、“退房日期”,以及“预付款额”等。
【正确答案】主键:房间号,身份证号,入住日期
外键:房间号,身份证号
【答案解析】[解析]
由于一位客人有可能多次在同一房间里住宿,只使用“房间号”和“身份证号”的组合作为“住宿”关系模式的主键并不能唯一标识出一条记录,因此“入住日期”也是“住宿”关系模式的主键之一。而“住宿”关系模式的外键是“房间号”和“身份证号”。
【正确答案】(2)身份证号
(3) HAVING
(4) ORDER BY 2 DSC 或 ORDER BY 2 DESC
【答案解析】[解析]
依题意,在SQL语言中,GROUP BY之后必须出现SELECT语句查询项中不包含聚集函数的部分,因此(2)空缺处应填写“住宿.身份证号”。
GROUP BY之后紧跟的条件应该使用HAVING子句表示,因此(3)空缺处应填写“HAVING”。
根据题干中的关键信息“……按照入住次数进行降序排列”可得,(4)空缺处应填写“ORDERBY 2 DSC(或ORDER BY 2 DESC)”。
【正确答案】表:住宿
属性:入住日期
类型:聚簇索引
原因:表中记录的物理顺序与索引项的顺序一致,根据索引访问数据时,一次读取操作可以获取多条记录数据,因而可减少查询时间
【答案解析】[解析]
数据库的目的在于管理大量的数据,而索引则可以加快检索数据表中数据的速度。索引分为聚簇索引(Cluster)和非聚簇索引两种类型。在聚簇索引中,索引树的叶级页包含实际的数据,记录的索引顺序与物理顺序相同。在非聚簇索引中,叶级页指向表中的记录,记录的物理顺序与逻辑顺序没有必然的联系。
通常,每个表只能有一个聚簇索引,因为一个表中的记录只能以一种物理顺序存放。通常,要对一个表按照标识字段建立聚簇索引。但是也可以对其他类型的字段建立聚簇索引,如字符型、数值型和日期时间型字段。从建立了聚簇索引的表中取出数据要比建立了非聚簇索引的表快。当需要取出一定范围内的数据时,使用聚簇索引也比采用非聚簇索引好。对聚簇索引的主要限制是每个表只能建立一个聚簇索引。但是,一个表可以有不止一个非聚簇索引。当然,也可以对一个表同时建立聚簇索引和非聚簇索引。
依题意,在[问题3]查询语句中涉及的属性有“身份证号”和“入住日期”,但它们均为主键属性,因此不需要再为其他属性创建索引。若要加快SQL语句的执行效率,对“入住日期”属性建立聚簇索引,使得表中索引项顺序和物理记录顺序一致。根据索引访问数据时,一次读取操作可以获取多条记录数据,因而可减少查询时间,从而提高查询性能。