问答题 [说明]
某超市的销售业务由一个销售业务管理系统进行管理,该系统每完成一次交易都需要提供顾客发票,其格式如表8-2所示。
【正确答案】(1) 设计一的关系模式“发票”最高满足第一范式(1NF)
因为由题意可得出以下函数依赖。
发票号码→(顾客代码,收银员代码,交易日期)
而关系“发票”的主键是(发票号码,商品代码)。非主属性“顾客代码”、“收银员代码”和“交易日期”并非完全依赖于主码,因此该关系模式不能满足第二范式(2NF),最高满足第一范式
(2) 设计二更加合理。因为设计二解决了设计一中由于非主属性不完全依赖于主码而造成的数据冗余等问题
【答案解析】[解析]
(1) 设计一的关系模式“发票”最高满足第一范式(1NF)。因为依题意可得出以下函数依赖:
发票号码→(顾客代码,收银员代码,交易日期)
而关系“发票”的主键是(发票号码,商品代码)。非主属性“顾客代码”、“收银员代码”和“交易日期”并非完全依赖于主码,因此该关系模式不能满足第二范式(2NF),最高满足第一范式。
(2) 在设计一中,关系“发票”设计的不合理在于将发票的单值属性(发票号码,交易日期,顾客代码,收银员代码)和多值属性(商品代码,单价,数量)混合在一个关系中,由于非主属性不完全依赖于主码而造成数据冗余异常、修改异常和删除异常等一系列问题。而设计二则将设计一中的关系“发票”进行分解,使得发票的单值属性和多值属性分开,避免了相关异常问题。因此,设计二明显比设计一更加合理。
【正确答案】(1) AS
(2) SUM(数量)
(3) SUM(单价*数量)
(4) 发票.发票号码=发票明细.发票号码
(5) 发票.发票号码,交易日期 或 发票明细.发票号码,交易日期
【答案解析】[解析]
本问题是要建立2010年11月期间每张发票的发票号、交易日期、交易商品件数和交易总金额的视图。由于建立视图的格式为CREATE VIEW<视图名>AS<视图定义>,因此(1)空缺处应填入AS。
本查询是从关系“发票”和“发票明细”中进行查询,两关系的连接条件是两关系的“发票号码”相等,因此(4)空缺处应填入“发票.发票号码=发票明细.发票号码”。
统计每张发票的信息需要按发票号将数据分组,但由于查询关系“发票”和“发票明细”中都有属性“发票号码”,为了避免二义性,因此分组属性是“发票.发票号码”或“发票明细.发票号码”。因为在包含聚合运算的Select子句中,只有在Group By子句中出现的属性才能在Select子句中以非聚合形式出现,而Select子句中有非聚合形式的属性“交易日期”出现,所以(5)空缺处应填入“发票.发票号码,交易日期”或“发票明细.发票号码,交易日期”。
需要查询的是每张发票的交易商品件数和交易总金额。交易商品件数是发票商品数量的总和,因此(2)空缺处应填入SUM(数量)。交易总金额是每条交易商品明细中每条记录商品金额的总和,每条记录商品金额是单价*数量,因此(3)空缺处应填入SUM(单价*数量)。
【正确答案】(6) A或者ASA
(7) NOT EXISTS
(8) *
【答案解析】[解析]
SQL语句中有两种格式为表或视图取别名:“表名AS别名”或“表名别名”。整体阅读该SQL查询程序之后,可知关系“发票明细”的别名是A,因此(6)空缺处应填入A(或者ASA)。
要查询“从未出售”的商品,对应于要查询的商品在交易记录中不存在,因此(7)空缺处应填入NOT EXISTS,(8)空缺处应填入*。
【正确答案】有必要。因为属性“价格”表示的是商品的当前价格,它在不同时间段有可能是变动的;属性“单价”表示的是在开具发票时该商品的单价。若缺少其中任意一个,将导致商品单价不能进行调整,否则当商品的单价发生变化时,销售历史中的商品价格将随之发生变化
【答案解析】[解析]
由于关系“商品”中属性“价格”表示的是商品的当前价格,超市中的价格在不同时间段是可能变动的。而关系“发票明细”中的属性“单价”表示的是在开具发票时该商品的单价。如果缺少其中任意一个属性,将导致商品单价不能进行调整,否则当商品的单价发生变化时,销售历史中的商品价格将随之发生变化。因此这两个关系的相关属性有必要同时存在。