我准备建9个表,分别如下:
1、图书基本信息表(ISBN,名称,作者,出版社,出版日期,书价,类别,数量,主题词),其中的ISBN作为主键;2、图书详细信息表(索书号,ISBN,进库日期),其中索书号为主键,因为往往相同ISBN的书好几本,为了区分每本书所以建立这个表;3、借阅信息表(索书号,读者编号,借书日期,应还日期,还书日期,罚款),其中索书号、读者编号和借书日期的组合为主键,因为同一个读者在不同的日期有可能借同一本书;4、读者信息表(读者编号,姓名,密码,注册日期,类别,性别,身份证号码,工作单位),其中读者编号为主键;5、管理员表(ID,密码),其中ID为主键,在这里应该可以把管理员的内容放到读者表里去,到底是应该放到读者表中还是就这样单独建一个表呢,请大家帮忙看看。6、读者预约表(读者编号,ISBN,预约日期),这三者的组合作为主键,因为同一个读者有可能在不同的日期预约相同的书;7、读者推荐图书表(ISBN,书名,作者,出版社,出版日期),其中ISBN为主键;8、图书类别表(图书类别),只有一个字段;9、读者类别表(读者类别),也只有一个字段;表差不多就这些了,请大家帮我看下有哪些地方可以改进,谢谢!

解决方案 »

  1.   

    1、图书基本信息表中的ISBN不宜作为主键,应该另行建立一个图书编码字段,举例:美国当时建立社会保险费系统时基本信息表以参保人的社保卡代码为主键,结果当社保卡代码升级的时候,导致所有与社保卡代码相关的表需要修改信息,但将社保卡代码作为主键的如何修改?会出现不一致信息,导致系统混乱。
    2、图书详细信息表应该将图书代码和索引号两个字段一起作为主键,以保证一本图书在图书库中的唯一性。
    3、借阅信息表缺少图书基本信息表中的主键,如图书编码,因为图书不能通过索引号作唯一表示。
    4、读者信息表和管理员表应该分开,这样可以保证系统的安全。
    5、读者预约表应该还要考虑其他的功能,比如取消预约、预约过期等等。
    6、读者推荐图书表最好再增加推荐人等字段。
    7、图书类别表和读者类别表最好再增加类别描述字段。设计一个系统需要考虑得更详细一点,可以多翻些关于数据库建模方面的资料,以上仅供参考。
      

  2.   

    在基本信息表中加图书编码字段是一个好的办法。在图书详细信息表中,我认为只要一个索书号就应该够了哦,因为每本书都有唯一的索书号(相同ISBN的几本数的索书号也不同)标识,只要知道一个索书号,就能找到那本书,而且只有一本书;我觉得只需要把这个表里的ISBN换成图书编码就够了,主键还是只有索书号一个,不知道行不?为什么索书号不能唯一确定一本书呢?
      

  3.   

    现在我已经确定下来了,表如下:
    1、图书基本信息表(图书编号,ISBN,名称,作者,出版社,出版日期,书价,类别,数量,主题词),其中的图书编号作为主键;2、图书详细信息表(索书号,ISBN,进库日期),其中索书号为主键;3、借阅信息表(索书号,读者编号,借书日期,应还日期,还书日期,罚款),其中索书号、读者编号和借书日期的组合为主键;4、读者信息表(读者编号,姓名,密码,注册日期,类别,性别,身份证号码,工作单位),其中读者编号为主键;5、管理员表(ID,密码),其中ID为主键;6、读者预约表(读者编号,图书编号,预约日期),这三者的组合作为主键;7、读者推荐图书表(ISBN,读者编号,书名,作者,出版社,出版日期),其中ISBN为主键;8、图书类别表(图书类别,描述),其中图书类别为主键;9、读者类别表(读者类别,描述),其中读者类别为主键;具体的SQL语句如下,请大家帮我看一下还有哪些地方需要改进(包括表和字段的命名,我的英文实在是太差劲了),数据库用的是MYSQL5.0.37,谢谢!drop database if exists book_management;
    create database book_management;
    use book_management;
    create table book_cate_info /*图书类别表*/
    (
    book_cate varchar(20) not null primary key,
    bk_description text
    );
    create table reader_cate_info /*读者类别表*/
    (
    reader_cate varchar(20) not null primary key,
    rd_description text
    );
    create table book_basic_info /*图书基本信息表*/
    (
    book_id mediumint auto_increment not null primary key,
    isbn char(13) not null unique,
    book_name varchar(40) not null,
    author varchar(20) not null,
    press varchar(20) not null,
    publ_date date,
    price float not null,
    book_cate varchar(20) not null references book_cate_info(book_cate), /*图书类别*/
    book_amount tinyint not null,
    keywords varchar(30)
    );
    create table book_detail_info /*图书详细信息表*/
    (
    call_id varchar(20) not null primary key,
    isbn char(13) not null references book_basic_info(isbn),
    inflow_date date
    );
    create table reader_info /*读者信息表*/
    (
    reader_id varchar(10) not null primary key,
    reader_name varchar(20) not null,
    reader_pwd varchar(20) not null,
    reg_date date,
    reader_cate varchar(20) not null references reader_cate_info(reader_cate),
    sex enum('f','m') not null,
    id_card_num varchar(18) not null,
    unit varchar(40)
    );
    create table borrow_info /*借阅信息表*/
    (
    call_id varchar(20) not null references book_detail_info(call_id),
    reader_id varchar(10) not null references reader_info(reader_id),
    borrow_date date not null,
    behove_rtn_date not null,
    return_date date not null,
    amercement float default 0.0,
    primary key(call_id,reader_id,borrow_date)
    );
    create table administrator_info /*管理员信息表*/
    (
    admin_id varchar(10) not null primary key,
    admin_pwd varchar(20) not null
    );
    create table booking_info /*预约表*/
    (
    reader_id varchar(10) not null references reader_info(reader_id),
    book_id mediumint not null references book_basic_info(book_id),
    booking_date date not null,
    primary key(reader_id,book_id,booking_date)
    );
    create table recommendation_book_info /*推荐图书表*/
    (
    isbn char(13) not null primary key,
    reader_id varchar(10) not null references reader_info(reader_id),
    book_name varchar(40) not null,
    author varchar(20) not null,
    press varchar(20) not null,
    publ_date date
    );