数据库 er图转化为关系模型,请帮忙看一下

1、实体
员工(工号,部门编号,姓名,性别,电话,住址,入职时间,职位,薪酬)
staff(SNO,DNO,BNO,Sname,Ssex,Sphone,Saddress,Stime,Spost,Ssalary)
主键:工号SNO
分解前:
(SNO→DNO,SNO→Sname,SNO→Ssex,SNO→Sphone,SNO→Saddress,SNO→Stime,SNO→Spost,SNO→Ssalary,Spost→Ssalary)
原表候选码:SNO
所属范式及理由:2NF 存在传递依赖
分解后:
Staff1(SNO,DNO,Sname,Ssex,Sphone,Sadress,Stime,Spost)
Fmin(SNO→DNO,SNO→Sname,SNO→Ssex,SNO→Sphone,SNO→Saddress,SNO→Stime,SNO→Spost)
候选码:SNO
所属范式及理由:3NF
Staff2(Spost,Ssalary)
Fmin(Spost→Ssalary)
候选码:Spost
所属范式及理由:3NF

结算账单(账单编号,房号,住店费用,住店天数)
bill(BNO,RNO,Bcost,Bdays)
主键:账单编号BNO
Fmin(BNO→RNO,BNO→Bcost,BNO→Bdays)
候选码:BNO
所属范式及理由:3NF

客户(身份证号,姓名,性别,电话)
client(CNO,Cname,Csex,Cphone)
主键:身份证号CNO
Fmin(CNO→Cname,CNO→Csex,CNO→Cphone)
候选码:CNO,(Cname,Csex)
所属范式及理由:3NF

客房(房号,床位,客房价格,客房状态)
room(RNO,Rbed,Rprice,Rcondition)
主键:房号RNO
Fmin(RNO→Rbed,RNO→Rcondition,RNO→Rprice)
候选码:RNO
所属范式及理由:3NF

房间类型(床位,类型名称,客房价格,额定人数,有无空调,有无电脑)
roomtype(Rbed,Rtype,Rprice,Rpeonum,Rair,Rcomputer)
主键:类型名称Rtype
Fmin(Rtype→Rprice,Rtype→Rair,Rtype→Rcomputer,Rtype→Rpeonum,Rtype→Rbed)
候选码:Rtype
所属范式及理由:3NF

2. 联系
入住(房号,身份证号,入住时间,退房时间)
checkin(RNO,CNO,Intime,Outtime)
F(CNO→RNO,CNO→Intime,CNO→Outtime)
候选码:CNO

换房(身份证号,房号,新换房号,换房时间)
changeroom(CNO,RNO,Cnewroom,Ctime)
F(CNO→RNO,CNO→Cnewroom,CNO→Ctime)
候选码:CNO

预定(房号,身份证号,预定入住时间,住店天数)
book(RNO,CNO,Btime,Bdays)
F(CNO→RNO,CNO→Btime,CNO→Bdays)
候选码:CNO

内务整理(房号,工号,整理时间,用品消耗)
arrange(RNO,SNO,Time,Consumption)
F(RNO→SNO,RNO→Time,RNO→Comsumption)
候选码:RNO

这是老师给我们关系模型转化的意见:许多主键不合理,比如入住的cno。客房和房价类型关系没联系吗?

请各数据库大神指点一下,到底应该是是怎样的,帮忙改一下,给点意见
也可根据自己的建议来修改,函数依赖可以重新确定,但对不合理的关系要分解为3NF,是最小依赖,如果觉得我的关系模型太差,可以问我要er图来修改关系模型。麻烦了

第1个回答  推荐于2017-09-21
实体:
员工(工号,部门编号,姓名,性别,电话,住址,入职时间,职位编号)主键:工号,外键:职位编号
职位(职位编号,职位,薪酬)主键:职位编号
结算账单(账单编号,房号,住店费用,住店天数)主键:账单编号
客户(身份证号,姓名,性别,电话)主键:身份证号
客房(房号,床位,客房价格,客房状态,类型编号)主键:房号,外键:类型编号
房间类型(类型编号,床位,类型名称,客房价格,额定人数,有无空调,有无电脑)主键:类型编号
关系:
入住记录(入住编号,房号,身份证号,入住时间,退房时间)主键:入住编号
换房记录(记录编号,身份证号,原房号,新换房号,换房时间)主键:记录编号
预定(预定单号,房号,身份证号,预定入住时间,住店天数)主键:预订单号
内务整理(记录编号,房号,工号,整理时间,用品消耗)主键:记录编号
其中职工职位关系和客房所属类型关系已在实体属性中的外键体现。
员工中的职位编号和客房中的类型编号。追问

不好意思,看晚了,我想问一下,为什么入住、预定、内务整理等联系都要加XX编号这个属性?

追答

原则上一个表都必须标识主键。每个表加上xx编号是为了更好的标识每条记录,更加简介明了,推荐选择其它的可以作为主键的具有实际意义属性列。

追问

但联系建表时,不是需要实体的主码吗?比如预定联系是一对多(客人——客房)的联系,主码不是应该由多的一方实体的主码作为联系建表时的主码吗?
还有,我想问一下,如果是多对多,联系的主码是由双方的主码构成,如果联合主码还不能唯一标识,用不用加上联系自己的部分码?

追答

多对多关系是要转化成一对多关系的,其中需要一个第三者关系表来构成。而双方实体与此关系表构成一对多关系,双方实体多对过关系通过此表反应出来。如果联合主码不能唯一标识,就添加一个属性列比如ID,来唯一标识。

本回答被提问者采纳