database|数据库|mysql|人大数据库
《数据库原理及应用》(Introduction to Database Systems)
一、关系代数(共15分,每小题3分)
设有供应商-零件-工程数据库模式如下:
供应商表S(sNo,sName, sCity, sTel)
零件表P(pNo, pName, pColor, pOrigin)
工程项目表J(jNo, jName, jCity)
供应情况表SPJ(sNo, jNo, pNo, Qty)
给出得到如下结果的关系代数表达式:
(1) 供应工程J1零件的供应商号码sNo?
(2) 供应工程J1零件P1的供应商号码sNo?
(3) 供应工程J1零件为红色的供应商号码sNo?
(4) 没有使用天津供应商生产的红色零件的工程号jNo?
(5) 至少用了供应商S1所供应的全部零件的工程号jNo?
参考答案:
- PsNo(σjNo=”J1”(SPJ))
- PsNo(σjNo=”J1” Ù pNo=”P1”(SPJ))
- PsNo(σjNo=”J1” Ù pColor=”Red”(SPJ ⋈ P)), or
PsNo(σjNo=”J1” (SPJ) ⋈ σpColor=”Red” (P))
其中,Red用”红色”或”红”均可,⋈用q或X也可以
- PjNo(J) –PjNo(σpOrigin=”Tianjin”(S)⋈ SPJ⋈ σpColor=”Red”(P))
其中,Tianjin用”天津”,Red用”红色”或”红”均可,⋈用q或X也可以
- PjNo, pNo(SPJ) ¸ PpNo(σsNo=”S1”(SPJ))
二、半结构化数据(共15分,每小题3分)
参阅给出的stu.xml文档样例,回答如下问题:
(1) 为该xml文档设计一个合适的DTD。
(2) 给出一个XPath表达式,返回成绩低于70的所有男同学的姓名。
(3) 给出一个XPath表达式,返回学号为”102″的同学的所有技能。
(4) 编写一段XQuery代码,查找掌握MySQL技能的所有同学的姓名。
(5) 编写一段XQuery代码,查找成绩低于平均成绩的所有同学的姓名。
参考答案:
<!DOCTYPE Roster [
<!ELEMENT Roster (stu*)>
<!ELEMENT stu (name, sex, birthday, score, skill+)>
<!ATTLIST stu id ID #REQUIRED>
<!ELEMENT name (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ELEMENT birthday (#PCDATA)>
<!ELEMENT score (#PCDATA)>
<!ELEMENT skill (#PCDATA)>
]>
其中,ID用CDATA也可以
- doc(“stu.xml”)/Roster/stu/name[../sex=”男” and ../score<70]
- doc(“stu.xml”)/Roster/stu[@id=”102”]/skill
- let $d:=document(“stu.xml”)/Roster
for $x in $d/stu/name[contains(..//skill, “MySQL”)]
return $x
- let $d=document(“stu.xml”)/Roster
for $x in $d/stu
where $c in $x/score satisfies $c > data(
{let $plist := $d/score
return avg($plist)}
)
三、SQL查询语言(16分,每小题4分)
有如下数据库创建的脚本文件(c:\b_n_b.sql)。
(1) 请检查其中存在的错误,说明原因,并进行纠正。
(2) 写出在MySQL中运行该脚本的命令。
create database if not exists b_n_b;
use b_n_b;
create table if not exists bars (
name varchar(20) primary key,
phone char(12),
addr varchar(20)
);
create table if not exists beers (
name varchar(20) primary key,
manf varchar(30)
);
create table if not exists sells (
bar varchar(20),
beer varchar(20),
price real,
primary key (bar,beer),
foreign key (beer)
references beers(name)
on delete set null
on update cascade
);
insert into bars values (‘Sally’, ‘555-328-7651’, ‘123 Sesame Street’);
insert into bars values (‘Joe”s’, ‘555-367-5809’, ‘4567 Jasper Avenue’);
insert into beers values (‘Bud’,’AB’);
insert into beers values (‘Bud Lite’,’AB’);
insert into beers values (‘TsingTao’,’TsingTao’);
insert into sells values (‘Joe”s’,’Bud’,2.5);
insert into sells values (‘Joe”s’,’Bud Lite’,2.5);
insert into sells values (‘Joe”s’,’TsingTao’,3.5);
insert into sells values (‘Sally’,’Bud’,2.5);
insert into sells values (‘Sally’,’TsingTao’,3.5);
(3) 以下为基于上述数据库的两个查询Q1和Q2,在什么情况下这两个查询返回的结果不同?
Q1:
select name
from bars
where name in (select bar from sells where beer=’TsingTao’ and price>3.0)
Q2:
select bars.name
from bars, sells
where bars.name=sells.bar and sells.beer=’TsingTao’ and sells.price>3.0
(4) 给出如下查询的SQL或MySQL查询语句:
青岛啤酒(TsingTao)卖的最贵的酒吧(Bar)出售Bud啤酒的价格。
参考答案:
(1)
错误:在创建表sells,外键beer与表beers的关联规则时出错,即on delete set null。
原因:在sells中beer既是foreign key,又是sells的组合键的一部分,而这个组合键又设置为primary key(而非unique),所有primary key不能为null。
纠正:把on delete set null改为on delete cascade;或者干脆把这一子句删除。
(2)
mysql> source c:/b_n_b.sql;
(3)
没有这样的情况。
(4)
select price
from sells
where beer=’Bud’ and bar = (
select bar
from sells
where beer=’TsingTao’ and
price >= all(
select price
from sells
where
beer=’TsingTao’
)
);
四、数据库设计(共10分)
关系数据库模式R{A, B, C, D, E, F}满足如下函数依赖:
AB->C, C->A, BC->D, ACD->B, BE->C, CE->FA, CF->BD, D->EF
找到该函数依赖集的最小依赖集,并写出求解过程。
参考答案:
(1) 去掉F中冗余的函数依赖
判断AB->C是否冗余
G1={C->A, BC->D, ACD->B, BE->C, CE->FA, CF->BD, D->EF}
ABG1+=AB
∵C Ï ABG1+
不冗余
判断C->A是否冗余
G2={BC->D, ACD->B, BE->C, CE->FA, CF->BD, D->EF}
CG2+=C
∵A Ï CG2+
不冗余
判断BC->D是否冗余
G3={ACD->B, BE->C, CE->FA, CF->BD, D->EF}
BCG3+=BC
∵D Ï BCG3+
不冗余
判断ACD->B是否冗余
G4={BE->C, CE->FA, CF->BD, D->EF}
ACDG4+=ABCDEF
∵B Î ACDG4+
冗余
判断BE->C是否冗余
G5={CE->FA, CF->BD, D->EF}
BEG5+=BE
∵C Ï BEG5+
不冗余
判断CE->FA是否冗余
G6={CF->BD, D->EF}
CEG6+=CE
∵FA Ï CEG6+
不冗余
判断CF->BD是否冗余
G7={D->EF}
CFG7+=CF
∵BD Ï CFG7+
不冗余
Fmin={C->A, BC->D, BE->C, CE->FA, CF->BD, D->EF}
五、综合分析与设计(共54分)
RentTheRunway是一家提供著名设计师的服装和配饰租赁的公司。刚开始时是一家纯电子商务公司,自2013年开始在线下扩张,在美国开了3个零售店。创始人Jennifer Hyman和Jennifer Fleiss在哈佛大学商学院相识,公司开张于2009年9月。截至2014年2月,该公司提供50,000件女装和10,000件配饰租赁,有400万会员注册,雇用了250员工,与200名服装设计师建立了伙伴关系,包括Badgley Mischka, Vera Wang, Alexis Bittar, Carolina Herrera and Calvin Klein。
该公司本质上向女性提供奢侈品的使用权,无论是买不起或者是买了也不会使用几次。与零售商一样,商品直接来自设计师,通过提供女性以10%零售价格租赁著名设计师服装和配饰,从而改变了时装产业。租赁期限4或8天,费用为零售价格的10%,服装尺寸0到22(取决于设计师)。每一服装租赁包括一套确保合身的后备尺寸,无需额外付费。订单内的第二套服装款式只需另加$32.50。同时为客户提供了一个预付费的、已写好收件地址用于归还服装的包装盒,以及$5保险费以防服装意外损伤。租赁价格包括干洗和衣物护理,亦出租配饰,包括首饰珠宝和手包;出售“必需品”,包括内衣、紧身衣、塑身内衣和化妆品。
会员需要注册,收费标准是,$350/月注册费,一个月内无限次,同时不超过4件;$900注册费,1/2/3月份无限次租赁,同时不超过4件。
请根据你自己的理解和创意,帮助RentTheRunway公司设计一个关系数据库系统,旨在提升客户管理部门的运营效率和对于客户的洞察力。
具体要求如下:
(1) 给出符合BCNF范式的关系数据库模式(10);
(2) 画出该关系数据库的E/R图(10);
(3) 给出在MySQL中创建该数据库的DDL语句(10);
(4) 设计常用的3个不同查询,并写出实现这些查询的SQL(或MySQL)语句(12);
(5) 设计有创意的3个不同查询, 并写出实现这些查询的SQL(或MySQL)语句(12)。
参考答案
(1)
会员(Customers) C(cID, cName, cAddress, cPhone, cMail, cDate)
其中,cID会员号,cName会员姓名,cAddress会员地址,cPhone会员电话,cDate会员注册日期
员工(Employees) E(eID, eName, eDept, ePhone, eMail, eDate)
其中,eID员工编号,eName员工姓名,eDept员工所在部门,ePhone员工联系电话,eMail员工邮箱,eDate员工入职日期
设计师(Designers) D(dID, dName, dAddress, dPhone, dMail, dDate)
其中,dID是设计师编号,dName设计师姓名,dAddress设计师地址,dPhone设计师联系电话,dMail设计师邮箱,dDate设计师签约日期
服装(Products) P(pDD, pType, pDescription, dID)
其中,pDD服装编号(同一个pDD服装可能有多件,其pID不一样),pType服装类型,pDescription服装描述,dID设计师编号(外键)
服装明细(Product Details) PD(pID, pDD, pPrice,pLaunchDate, pStatus)
其中,pID服装唯一编号,pDD服装编号(外键),pPrice价格,pLaunchDate投放市场日期,pStatus状态(0-在库,1-已租出)
订单(Order Master) O(oID, oDate, cID, eID, oReturnDate)
其中,oID订单编号,oDate订单日期,cID会员编号,eID订单员工(外键),oReturnDate归还日期
订单明细(Order Details) OD(oID, pID, pReturnStatus)
其中,oID订单编号,pID服装唯一编号(外键),eID归还检查员工(外键),pReturnStatus归还状态(0-完好,1-有破损,2-破损严重);oID+pID组合键
(2)
(3)
create database if not exists RTR;
use RTR;
create table if
not exists C (
cID char(8) primary key,
cName varchar(20),
cAddress varchar(40),
cPhone char(12),
cMail varchar(20),
cDate date
);
create table if
not exists E(
eID char(4) primary key,
eName varchar(20),
eDept char(10),
ePhone char(12),
eMail varchar(2),
eDate date
);
create table if
not exists D(
dID char(4) primary key,
dName varchar(20),
dAddress varchar(40),
dPhone char(12),
dMail varchar(20),
dDate date
);
create table if
not exists P(
pDD char(8) primary key,
pType char(3),
pDescription varchar(40),
dID char(4) references D(dID)
);
create table if
not exists PD(
pID char(8) primary key,
pDD char(8) references P(pDD),
pPrice real,
pLaunchDate date,
pStatus char(1)
);
create table if
not exists O(
oID char(12) primary key,
oDate date,
cID char(8) references C(cID),
eID char(4) references E(eID),
oReturnDate date
);
create table if
not exists OD(
oID char(12) references
O(oID),
pID char(8) references
PD(pID),
pReturnStatus,
primary key (oID, pID)
);
(4)
(5)
stu.xml文档
<?xml version=”1.0″ encoding=”gb2312″ ?>
<roster>
<stu id=”101″>
<name>李华</name>
<sex>男</sex>
<birthday>1978.9.12</birthday>
<score>92</score>
<skill>Java</skill>
<skill>Oracle</skill>
<skill>C sharp</skill>
<skill>My SQL</skill>
</stu>
<stu id=”102″>
<name>倪冰</name>
<sex>女</sex>
<birthday>1979.1.12</birthday>
<score>89</score>
<skill>Visual Basic</skill>
<skill>SQL Server</skill>
<skill>ASP</skill>
</stu>
<stu id=”103″>
<name>张君宝</name>
<sex>男</sex>
<birthday>1982.9.9</birthday>
<score>98</score>
<skill>UML</skill>
<skill>C sharp</skill>
<skill>My SQL</skill>
</stu>
<stu id=”104″>
<name>杨惠</name>
<sex>女</sex>
<birthday>1980.5.16</birthday>
<score>85</score>
<skill>Visual C++</skill>
<skill>SQL Server</skill>
<skill>UML</skill>
</stu>
<stu id=”105″>
<name>崔春晓</name>
<sex>男</sex>
<birthday>1981.4.19</birthday>
<score>86</score>
<skill>C Sharp</skill>
<skill>SQL Server</skill>
<skill>XML</skill>
<skill>UML</skill>
</stu>
</roster>