数据库设计  
 
Q : 为图书馆作的表结构,这是读者表,书籍表,借还情况表。初学者可以作为研究范例。
HashCode: wshlxvbflyylfamtyuranus、nielisheng、hjhing、SE1、SE1、LightPoint、SE1、nielisheng、SE1、nielisheng、wshlxvbtj_dns1383412

--为图书馆作的表结构,这是读者表,书籍表,借还情况表。请大家给看看,行不行的通?  
--尤其重点看看借还情况表。第一次设计表结构,大家多指教。mysql数据库。  
create  table  reader  
(  
readerid            int  unsigned        not  null,                                      --读者编号,即阅览证号,  
readername        varchar(10)          not  null,                                      --读者姓名    
sex                      varchar(2)            not  null,                                      --性别  
department        varchar(50)          not  null,                                      --所属单位(或班级,院系,部门)  
cardtype            varchar(10)          not  null,                                      --证件类型(所出示身份证件)  
cardid                varchar(30)          not  null,                                      --有效证件号码(身份证,学生证,工作证)  
purview              varchar(4)            not  null,                                      --权限值(可以是1,2,3等数字,可以决定该读者所能借书的种类和天数)  
starttime          datetime                not  null,                                      --办阅览证时间。  
endtime              datetime  ,                                                                    --有效期终止期时间。  
zhiya                  float(5,2)  unsigned,                                                --该读者质押的现金数。  
primary  key  (readerid)  
)  
 
 
--书籍表  
create  table  
(  
 bookid            int  unsigned          not  null,                            --此书在本馆中的编号。主键。  
 bookname        varchar(50)            not  null,                            --书名  
 writer            varchar(30)            not  null,                            --作者  
 pubhouse        varchar(50),                                                        --出版社  
 pubtime          datetime,                                                              --出版时间  
 ISBN_id          varchar(50),                                                        --isbn编号  
 congshuname  varchar(50),                                                        --丛书名  
 price              float(6,2),                                                          --定价  
 chujiezhuangtai    varchar(20)  not  null,                            --出借状态(已出借;可以出借;仅供阅览不出借;)    
 lib                  varchar(20)            not  null,                            --所属书库(如:中文流通库,样本书库等)  
 borrowtimes    int  unsigned          default  '0',                    --本书已出借的次数,默认为零。  
 jianjie          varchar(200),                                                      --本书内容简介  
 page                int  unsigned,                                                      --本书页数。  
 primary  key(bookid)                                                                  --声名主健为bookid  
 )  
 
 
--借还情况表  
create  table    
(  
 readerid              int  unsigned    not  null,                          --借书(或还书)的读者号  
 bookid                  int  unsigned    not  null,                          --所借的书号  
 borrowdate          datetime            not  null,                          --借书时间  
 returndate          datetime,                                                      --还书时间  
 zhuangtai            varchar(10)      not  null  default  'no'  --是否已经还了所借的书,默认是未还,还书时修改该字段值为'yes'    
 purview                varchar(4)        not  null,                          --该读者权限值  
 lib                        varchar(20)      not  null,                          --该书所属书库,它与purview权限值一起决定  
                                                                                                       --该读者可以借该书库的书的期限  
 
 keeplength          varchar(3)        not  null,                          --可借阅期限,它由purview权限值与lib所属库联合决定  
 chaoqifou            varchar(4)        default  'no',                  --是否超期  默认是‘no’  ,还书时通过计算(看还书日期-借日期  是否大于借阅期限)        
 fakuan                  float(6,2),      not  null,                          --罚款,计算得来(超期天数*每日罚款额)  
 key(readerid,bookid)  
)  
 
 
 
 
 
1  书籍的分类可否从“isbn编号“得出?  
2  "本书已出借的次数"  在此合适?  
3  "借书时间","还书时间"用同一个字段表示,借还情况表加一个借还标志字段?借还书的数量在哪里?  
     
...  ...  
 
---------------------------------------------------------------  
 
你考慮得很詳細很好,不過個人認為:  
1:  書的借閱次數是否可要?  如果方便統計,也建議另建新表從書籍表中分離出來  
2:  相關罰款情況應該另建新表從借書情況表中分離出來。  
 
---------------------------------------------------------------  
 
有问题,在借还情况表存在大量冗余:  
1、zhuangtai  --是否已经还了所借的书,默认是未还,还书时修改该字段值为'yes'  :没有必要,是否还书可以通过判断还书时间是否为空;  
 
2、purview  --该读者权限值:函数依赖于readerid  --借书(或还书)的读者号  
 
3、lib  --该书所属书库:函数依赖于bookid  --所借的书号  
 
4、keeplength  --可借阅期限:依赖于purview和lib,而非主键  
 
5、chaoqifou  --是否超期:冗余,依赖于还书日期、借日期、借阅期限,可计算得出  
 
6、fakuan  --罚款:既然可以计算得到,就不必存储,除非你从效率考虑--需要有充足的理由和依据。  
 
---------------------------------------------------------------  
 
书籍表:  
1、borrowtimes冗余,可以通过查询借还情况表获得。  
 
2、chujiezhuangtai  --出借状态:语义不清,应改为可出借、仅供阅览不出借。是否已经出借同样可以通过查询借还情况表获得。  
 
---------------------------------------------------------------  
 
以下是个人之见,大家互相探讨:  
1、读者表  
       该表只列出了阅览证上的项目。缺少读者的通信信息,此表无法和读者联系。应加上通信信息相关的字段。  
 
2、书籍表  
       此表缺少书籍的购买时间、上架时间、下架时间等信息,不方便书籍的管理。  
 
3、借还情况表  
       此表需重新设计,有冗余  
 
       另在程序设计中,对ID的编号,应作充分的考虑,应包括尽可多的信息在里面。以方便查询和定位。尽可能使用自动编号。以确保编号的更加合理。  
 
 
 
 
---------------------------------------------------------------  
 
罚款应考虑两个方面:  
应罚款金额(可计算获得,在缴纳罚款前随时间迁移而变化)、缴纳罚款时间、缴纳罚款金额(原则上应与应罚款金额相同,但实际上可能不同)  
---------------------------------------------------------------  
 
 
 
 
 
to:  flyylf(飞飞)    
 
--你的大方向没有问题  
 
 
 
---------------------------------------------------------------  
 
hello,飞飞。  
看来你是个初学者,本人不才,对你的设计作出几点建议:希望你不要介意.  
先说你的第一个表;  
     你的第一个表cardid  属于一个可分的字段,按照数据库的标准这是不符合第一范式的。而且你按你的设计,如果进行试运行的化,势必造成此字段的存储内容的混乱。  
       此外,请注意你的数据库是图书馆的,不是ASP,也不是电子商务没有必要使用那么详细的字段说明,你的设计会使操作的程序很麻烦,而且影响效率;试想,如果有20同时还书操作人员用你的数据库需要多长时间完成,如果此情况连续进行,操作员是很累的。建议你减少你的字段,例如,把你的两个字段混合成一个字段使用“身份证号码”作为一个字段名,或者不用此字段,因为图书馆很少有人不使用借书证,所以此字段设置为“图书证号”作为字段名也可。  
再说你的第二个表:  
       你设计的表,如果哪不客气的说,完全没有存在的理由.必须进行分解,从第一到第三范式你都不符合,现在初步进行分解成四个表:  
 例:      第一个表:书名;  
                       ISDN号;  
                       借出状状态;  
                       借出人的借书证号;  
此表为第一表也就是用户(操作员)所接触的视图.  
你的分数太少,我就不详细说了.告诉你一个很好的例子,在SQL  server中有个数据库PUBS,你可以参照设计.  
不好意思说了,这么多的不同议建的话,你应该详细看看关于数据库原理方面的书,  
希望你进行数据库的重构.  
谢谢大家看了我这么多的话.  
要骂我的话.请发邮件到:wsh_lx@hotmail.com  
 
现在给出建议表设计:  
第一个表(前台操作人员):  
     书名;  
     ISDN号;(主键)  
     借出/归还时间  
     借出/归还时间  
     (以上两字段由数据库系统默认添加,由系统时间决定,不能由人员添加)        
     (从以上两字段生成新的字段,算出"借出时间"字段的值)  
     借书人的借书证号(外键);  
第二个表(后台手工输入):  
     借书证号;(主键);  
     借书人证件类型身份;  
     借书人姓名;  
     借书人性别;  
     ......借书人相关字段;  
 
第三个表(图书馆籍总表):  
     书籍ISDN号;  
     书籍名称;  
     作者名;  
     出版社;        
     定价;  
     书籍本馆ID;  
     借出次数;  
以上设计仍不完全,此表不好完成.一定要由具体需要人员自己设定.  
 
这样的库结构太简单,冗余太多,无法满足应用,比如:某些书在书库有很都本,以及多站点操作的并发性等。  
我认为比较合理的库结构:  
 
读者表                  (同意你的结构)  
书籍基础信息表  (去除  出借状态  字段,只记录书的基础信息,书号为主键)  
书籍库存表          (只需设:书号,数量  两个字段,出租时检查数量不为0减1,反之为还)  
租还明细表          (设:读者号,书号,借还时间,借或还标志位,超期标志位,罚款)  
借书时,不需要录入后两字段,还书时通过读者表的权限字段判断超期及罚款  
 
其他各种应用都可通过表间连接查询或视图实现  
 
如果有多站点操作,还应加上:站点租借子表(结构与租还明细表相同,有几个站点就动态建立,业务发生时先向子表中写数,然后向租还明细表中写数,所有应用都以书籍库存表为中心  
 
 
第一个表(前台):  
         持有人姓名;  
         图书证号;  
         借出日期;  
         归还时间;  
         借出书在本馆内的ID号;  
         隐藏字段:借出时间(由借出日期和归还日期相减);  
         罚金:(由超天数乘以