• 实习日记2018-08-06 之 设计一套大学学生管理系统数据库


    一、    整体要求

        我们要设计一套大学学生管理系统数据库,用来管理学生的基本信息、学生的课业信息以及学生在学校除学习外的一些相关信息。本次数据库作业基于该系统来进行表结构的设计。要求表结构的设计  尽量合理,数据库的操作尽量符合规范。进行表设计的过程中,可以借助于SQLYog自带的工具进行设计,但是更推荐全程用SQL语句来完成设计。

    1.     信息

      记录学生的学号、姓名、性别、出生日期、籍贯、班级、院系、学生卡号、每学期所选科目、科目成绩、学分、GPA、学生卡食堂消费情况、图书馆借书情况、信息中心上网记录、所在宿舍信息。

    2.     表结构

      根据信息要求,进行表结构设计,来记录要求中的所有学生信息。

    3.     数据

      表结构设计完成后,可以构造一部分数据插入数据库。构造的数据中必须包含以下相关数据:

        1)  借阅红楼梦这本书的借书记录。

        2)  微积分这门课挂科的记录。

        3)  学生单月食堂消费满10次,但是消费总额不超过100元的记录

        4)  至少包含20名学生

        5)  至少包含3个院系

        6)  至少包含3届学生,至少有两届学生包含多个学期的记录

        7)  至少存在1次换宿舍的情形,且存在学生在同一宿舍

    4.创建表

      1)表结构基础要求:

    CREATE TABLE test_timestamp(
      id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
      state TINYINT(3) UNSIGNED NOT NULL DEFAULT '1',
      create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
      update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      PRIMARY KEY (id)
    ) ENGINE=INNODB DEFAULT CHARSET=utf8
    
    以上几个属性每个表中必须要有!!!

      2)具体表创建

    CREATE TABLE students(
      id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
      student_id INT(10) UNSIGNED NOT NULL,
      student_name VARCHAR(20) NOT NULL,
      sex VARCHAR(2) NOT NULL CHECK(sex LIKE '' OR ''),
      birthday TIMESTAMP NOT NULL,
      birth_place VARCHAR(20) NOT NULL,
      class int(10) NOT NULL REFERENCES classes(class_id),
      card_id INT(10) NOT NULL,
      get_credit INT(10) NOT NULL DEFAULT 0,
      gap INT(10) NOT NULL,
      state TINYINT(3) UNSIGNED NOT NULL DEFAULT '1',
      create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
      update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      PRIMARY KEY (id)
    ) ENGINE=INNODB DEFAULT CHARSET=utf8
    
    
    CREATE TABLE classes(
      id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
      class_id INT(10) NOT NULL,
      class_name VARCHAR(10) NOT NULL,
      college_id INT(10) NOT NULL,
      time_of_enrollment TIMESTAMP NOT NULL,
      state TINYINT(3) UNSIGNED NOT NULL DEFAULT '1',
      create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
      update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      PRIMARY KEY (id)
    ) ENGINE=INNODB DEFAULT CHARSET=utf8
    
    
    CREATE TABLE colleges(
      id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
      college_id INT(10) NOT NULL,
      college_name VARCHAR(20) NOT NULL,
      state TINYINT(3) UNSIGNED NOT NULL DEFAULT '1',
      create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
      update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      PRIMARY KEY (id)
    ) ENGINE=INNODB DEFAULT CHARSET=utf8
    
    
    CREATE TABLE courses(
      id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
      course_id INT(10) NOT NULL,
      course_name VARCHAR(20) NOT NULL,
      learning_time VARCHAR(10) NOT NULL,
      time_of_start INT(10) NOT NULL REFERENCES term(term_id),
      state TINYINT(3) UNSIGNED NOT NULL DEFAULT '1',
      create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
      update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      PRIMARY KEY (id)
    ) ENGINE=INNODB DEFAULT CHARSET=utf8
    
    
    CREATE TABLE terms(
      id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
      term_id INT(10) NOT NULL,
      term_name VARCHAR(10) NOT NULL,
      state TINYINT(3) UNSIGNED NOT NULL DEFAULT '1',
      create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
      update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      PRIMARY KEY (id)
    ) ENGINE=INNODB DEFAULT CHARSET=utf8
    
    
    CREATE TABLE college_term_courses( 
        id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
        term_id INT(10) NOT NULL REFERENCES term(term_id), 
        college_id INT(10) NOT NULL REFERENCES colleges(college_id), 
        course_id INT (10) NOT NULL REFERENCES courses(courses_id), 
        credit INT(10) NOT NULL ,
        state TINYINT(3) UNSIGNED NOT NULL DEFAULT '1', 
        create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 
        update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
        PRIMARY KEY (id) 
    ) ENGINE=INNODB DEFAULT CHARSET=utf8; 
    
    
    CREATE TABLE student_courses(
      id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
      id_c INT(10) NOT NULL REFERENCES college_term_courses(id),
      state TINYINT(3) UNSIGNED NOT NULL DEFAULT '1',
      create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
      update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      PRIMARY KEY (id)
    ) ENGINE=INNODB DEFAULT CHARSET=utf8
    
    CREATE TABLE food_records(
      id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
      card_id INT(10) NOT NULL REFERENCES students(card_id),
      eating_time TIMESTAMP NOT NULL,
      money INT(10) NOT NULL,
      state TINYINT(3) UNSIGNED NOT NULL DEFAULT '1',
      create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
      update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      PRIMARY KEY (id)
    ) ENGINE=INNODB DEFAULT CHARSET=utf8
    
    
    CREATE TABLE read_records(
      id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
      card_id INT(10) NOT NULL REFERENCES students(card_id),
      book_id INT(10) NOT NULL REFERENCES book(book_id),
      state TINYINT(3) UNSIGNED NOT NULL DEFAULT '1',
      create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
      update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      PRIMARY KEY (id)
    ) ENGINE=INNODB DEFAULT CHARSET=utf8
    
    
    CREATE TABLE books(
      id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
      book_id INT(10) NOT NULL,
      book_name VARCHAR(20) NOT NULL,
      state TINYINT(3) UNSIGNED NOT NULL DEFAULT '1',
      create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
      update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      PRIMARY KEY (id)
    ) ENGINE=INNODB DEFAULT CHARSET=utf8
    
    
    CREATE TABLE net_records(
      id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
      card_id INT(10) NOT NULL REFERENCES students(card_id),
      net_time TIMESTAMP NOT NULL,
      state TINYINT(3) UNSIGNED NOT NULL DEFAULT '1',
      create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
      update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      PRIMARY KEY (id)
    ) ENGINE=INNODB DEFAULT CHARSET=utf8
    
    CREATE TABLE dorms(
      id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
      dorm_id INT(10) NOT NULL,
      dorm_name INT(10) NOT NULL, 
      state TINYINT(3) UNSIGNED NOT NULL DEFAULT '1',
      create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
      update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      PRIMARY KEY (id)
    ) ENGINE=INNODB DEFAULT CHARSET=utf8
    
    
    CREATE TABLE student_dorms(
      id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
      dorm_id INT(10) NOT NULL,
      student_id INT(10) NOT NULL REFERENCES students(student_id),
      check_in_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
      move_out_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
      state TINYINT(3) UNSIGNED NOT NULL DEFAULT '1',
      create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
      update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      PRIMARY KEY (id)
    ) ENGINE=INNODB DEFAULT CHARSET=utf8

     5.填入数据

     6.数据查询

    1)    借阅红楼梦这本书的借书记录。
    SELECT *
    FROM books AS a JOIN read_records AS b
    ON a.`book_id`=b.`book_id`
    WHERE a.`book_name`='红楼梦'
    
    2)    微积分这门课挂科的记录。
    SELECT *
    FROM student_courses AS a JOIN college_term_courses AS b
    ON a.`id_c`=b.`id` 
    WHERE grade<60 AND course_id = (SELECT course_id FROM courses WHERE course_name='微积分')
                    
    3)    学生单月食堂消费满10次,但是消费总额不超过100元的记录
    SELECT student_name
    FROM students
    WHERE card_id IN(SELECT card_id
            FROM food_records
            GROUP BY card_id
            HAVING COUNT(eating_time)>=10 AND SUM(money)<=100)
            
    4)    至少包含20名学生
    SELECT *
    FROM students
    5)    至少包含3个院系
    SELECT *
    FROM colleges
    
    6)    至少包含3届学生,至少有两届学生包含多个学期的记录
    SELECT *
    FROM classes
    
    SELECT student_id,term_id
    FROM student_courses AS a,college_term_courses AS b
    WHERE a.`id_c`=b.`id` 
    
    
    7)    至少存在1次换宿舍的情形,且存在学生在同一宿舍
    SELECT student_id
    FROM student_dorms
    GROUP BY student_id
    HAVING COUNT(dorm_id)>1

     二、数据库总结

    问题总结:  

        1.表之间建立连接,创建关系表,
            如学期、学院和课程之间的关系表,要写出每个学院每学期上哪些课程,并设置每学期的课程状态,已过的学期课程置为2
            学生选课时从学院_学期_课程中选课
        2.日志
            如食堂、信息中心、图书馆借书记录
            记录下发生的时间、动作、人物及结果
        3.注意实体间的关系
            是一对多还是多对多
            根据实体间关系确定是否需要联系表
        4.注意数据冗余
            大部分时候可直接利用id,除非其id属性有特殊含义
            当两个属性有唯一关联时,可只写一个属性
            当每条记录内容皆无重复时,其他表引用时可考虑使用id代替其余属性
        5.慎用 DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
        6.表名、属性名要用小写名词,表名需用名词复数
        7.时间属性要用timestamp类型
        8.注意置状态位,防止记录冲突
        9.创建表时一定要加上id、state、createtime、updatetime属性,字符集为utf8,引擎为Innodb
        10.注意分析各内容间的联系,再创建表
        11.create table student_1 like student
            insert into student_1 select * from student
        12.引用外键时一定要保证数据类型及长度与原表中数据一致
        13.SQL查询时,尽量少使用子查询,多用join,当数据多时,子查询效率较慢

    三、数据库创建第一版

     (未注意表与表、实体与实体间的关系,表名不够清晰明了,未注意数据的冗余!!!)

    CREATE TABLE lst_students (
    stu_id INT(10) NOT NULL,
    stu_name VARCHAR(20) NOT NULL,
    stu_sex VARCHAR(8) CHECK (stu_sex='male' OR stu_sex='female'),
    stu_birthday date,
    stu_native_place VARCHAR(30),
    stu_class VARCHAR(20),
    stu_institute VARCHAR(20),
    stu_card VARCHAR(20) REFERENCES lst_card_eating(card_id),
    stu_state TINYINT(1),
    stu_createtime date,
    stu_updatetime date,
    PRIMARY KEY(stu_id)
    );
    CREATE TABLE lst_card_eating(
    card_id INT(20),
    eating_cost INT(20),
    eating_times INT(10),
    eating_state TINYINT(1),
    eating_createtime date,
    eating_updatetime date, 
    PRIMARY KEY(card_id)
    );
    CREATE TABLE lst_card_reading (
    card_id INT(20),
    reading_book VARCHAR(20),
    reading_state TINYINT(1),
    reading_createtime date,
    reading_updatetime date,
    PRIMARY KEY(card_id)
    );
    CREATE TABLE lst_card_net (
    card_id INT(20),
    net_times INT(10),
    net_state TINYINT(1),
    net_createtime date,
    net_updatetime date,
    PRIMARY KEY(card_id)
    );
    CREATE TABLE lst_dorm (
    stu_id INT(10) REFERENCES lst_students(stu_id),
    dorm_id INT(10) NOT NULL,
    dorm_state TINYINT(1),
    dorm_createtime date,
    dorm_updatetime date,
    PRIMARY KEY(dorm_id,stu_id)
    );
    CREATE TABLE lst_course (
    cou_id INT(10) NOT NULL,
    cou_name VARCHAR(20) NOT NULL,
    cou_credit INT(10) NOT NULL,
    cou_state TINYINT(1),
    cou_createtime date,
    cou_updatetime date,
    PRIMARY KEY(cou_id)
    );
    CREATE TABLE lst_study (
    stu_id INT(10) REFERENCES lst_students(stu_id),
    cou_id INT(10) REFERENCES lst_course(cou_id),
    grade INT(10),
    GPA INT (10),
    study_state TINYINT(1),
    study_createtime date,
    study_updatetime date,
    PRIMARY KEY(stu_id,cou_id)
    );

    完成时间2018-08-08,经历两版,历时2天

  • 相关阅读:
    jmeter接口测试----10从文件中读取
    How to let a html with JavaScript can display in Outlook?
    [Jenkins] 将上游Job的参数传递给多个下游Job
    Jenkins Job之间传递参数
    一个Jenkins job里面配置多个批处理脚本,如果其中某一个有fail的,其后面的批处理脚本全都不执行了
    JMeter supports dashboard report generation to get graphs and statistics from a test plan
    分享几个实用的批处理脚本
    Job构建步骤间的自定义变量传递
    Download file from a URL using AutoIt, and run in Robot Framework. (Also can use in other application)
    [Selenium] Upload File on Remote Node Machines
  • 原文地址:https://www.cnblogs.com/lst-315/p/9480386.html
Copyright © 2020-2023  润新知