zoukankan      html  css  js  c++  java
  • [7] MySQL数据库--学生管理系统数据库设计

    完整建库建表SQL命令参考

    完整建库建表SQL命令参考

    学生管理系统数据库设计

    设计一套数据库首先要熟悉当前系统有哪些功能,具体的业务流程是什么

    学生管理系统功能介绍

    一套学校用的学生管理系统,最核心的功能如下

    1. 学生信息管理(增加学生,删除学生,修改学生,查询学生信息==简称:CURD)
    2. 老师信息管理(CURD)
    3. 课程信息管理系统(CURD)
    4. 成绩信息管理系统(CURD)
    5. 违纪信息管理(CURD)
    6. 活动信息管理(CURD)
    7. 物资/设备信息管理(CURD)
    8. 等....

    要完成以上所有的功能,需要操作以上对象的相关信息. 以上对象的信息可以按照固定格式存储在数据库中!
    数据库设计的**第一步就是找出业务相关的的核心对象 **,一类物体/对象的信息固定存储在一张表中!

    概念

    • 对象: 生活中的一类物体,程序中叫对象
    • 属性: 物体的名词和形容词的描述,就是对象的属性

    数据库设计步骤

    数据库设计三大核心的步骤:

    • 1.找对象
    • 2.找属性
    • 3.找关系

    第1步: 找对象

    分析系统业务中的核心对象.

    • 学生对象----> 学生表(student)
    • 老师对象----> 老师表(teacher)
    • 课程对象----> 课程表(course)
    • 成绩对象----> 成绩表(score)
    • 班级对象----> 班级表(前缀_class,因为user或class等英文单词是程序中的关键字.尽量不直接用)
    • 等.....

    **注意: 一些隐含的对象可能因为对业务不熟练,可能找不到 **,.比如:学生请假条对象. 活动对象等..... 所以进行数据库设计之前,一定要把系统功能和业务流程整理清楚.当然遗漏的对象可以在需要时再补充.数据库设计没有一步到位的.

    第2步:找属性

    属性概念: 物体/对象的名词或形容词的描述.学名叫"属性",,每个属性对应表中的1个列!

    • 学生对象(student): 唯一标识id,学号 姓名,性别,年龄,生日,电话,
    • 老师对象(teacher): 唯一标识id,姓名,性别,年龄,电话
    • 课程对象(course): 唯一标识id,课程名,开课时间,课时数量
    • 班级对象(tbl_class) : 唯一标识id,班级编号,人数
    • 成绩对象(score) : id,分数,课程名(可直接引用课程编号), 学生名(可直接引用学生编号)

    对象中每个属性就对应表中的每个列
    为了避免数据冗余(重复),用学生id和课程id代替名字!
    电脑中存储数据是严格区分不同类型的! 年龄:整数int, 名字:字符串;char/varchar/string

    第3步: 找关系

    表和表之间的关系有: 1---N(1对多) 或 N---1(多对1) 或 1-1(1对1) 或 N--N (多对多)

    • 1-N 或 1-1 或 N-1: 通过主键和外键表示
    • N-N : 一但出现多对多,必须借助一个中间表(关系表)实现
    • 比如 商品和订单表就是 N--N
      • 商品(id,商品编号,名字,数量,价格)
      • 订单(id,订单号, 用户名(id), 总价, 总数量 )

    独立一个中间表/关系表(保存另外两张表的主键引用)

    id pid(商品编号) oid(订单编号)
    1 P001 D001
    2 P002 D001
    3 P003 D001
    4 P001 D002
    5 P001 D003
    6 P002 D002
    #查  订单D001买的所有的商品!
    select * from 表名   where oid='D001'
    # 查 商品  P001被下单了多少次?
    select * from 表名  where pid = 'P001'
    
    #  看:D001 买了几个商品!
    select sum(num) from guanxi_product_order
    where oid='D001'
    
    

    建表遵守原则

    对象分析出来后就可以建表了,一般建表时遵循的原则如下.
    建表规则

    • 1. 同一类的对象信息存储在1张表中!
    • 2. 对象的每个属性对应表中的每个列!
    • 3. 列有具体的数据类型
      • int: 整数
      • 小数: float/doube
      • 日期: date.datetime
      • 字符串:char/varchar
    • 4. 每个表中必须有主键列!
      • 唯一区分一个行的列就交主键列(可以多个)
      • 规则: 为了避免没有主键习惯于添加一个虚拟的主键id(自增)
    • 5. 添加约束(限制条件)
      • 主键: primary key --->特点: 唯一
      • 自增: auto_increment----> 自动增长
      • 默认值: default ----->性别默认为男!
      • 非空: not null--------> 必须有数据
      • 唯一: unique---->不能重复
      • 外键(参考) foreign key:------>成绩表中存班级id,课程id,

    第4步: 找特例: 等级明显而且不包含敏感数据的信息建议保持为1张表

    比如:地区表 和 员工表

    id(地区编号) name code pcode父编号
    1 北京 11
    2 山东 37
    3 济南 3701 37
    4 青岛 3702 37
    5 海淀 1101 11
    6 房山 1102 11
    -- 所有省
    select * from area where pcode is null
    
    -- 山东省所有的市
    select code from area where name= '山东'
    select * from area where pcode = 37
    
    select * from area where pcode = (
     select code from area where name= '山东'
    )
    

    遵循数据库设计三大范式

    • 第一范式: 原子性
      根据业务需要保证表中的每个列不可再拆分.比如: 简单存储学生信息地址列就够用了. 但是电商类网站地址需要拆分为省,市,县,乡,村
    • 第二范式: 相关性
      保证表中的每个列都和主键相关,只要满足一类物体的信息保存在1张表中,就满足第二范式
    • 第三范式: 直接相关性
      这个一般用于多个列联合作为主键的中间表,其他列必须和每个组件直接相关,而不能只和某一个列有关系.

    参考:https://www.cnblogs.com/knowledgesea/p/3667395.html

    总结: 数据库设计遵循的原则[重点]

    • 完整建库建表SQL命令
      https://www.cnblogs.com/itzixueba/p/13935949.html
      前提: 熟悉项目的业务流程!

    • 一类对象信息保存张表中

    • 表中必须有主键列(为了防止没有主键习惯添加虚拟主键列id,id一般设置为自增)

    • 添加约束保证数据完整性

      • 主键
      • 唯一
      • 自增
      • 非空
      • 外键(实现1-N)
      • 默认值
    • 多对对必须独立一个关系表

    • 注意: 等级明显并且无敏感信息的数据可以通过自关联实现!

    • 遵守: 数据库设计三大范式(三大原则)

    更多交流,请加QQ:390351113.请备注好友来自博客园<IT自学吧>
  • 相关阅读:
    mysql数据库——特殊sql语句整理之修改表结构
    mysql数据库引擎——MyISAM,InnoDB
    Golang程序性能分析
    Docker基本操作
    go module
    Docker基础原理
    基于zookeeper或redis实现分布式锁
    漫谈微服务
    快速排序
    设计模式泛谈
  • 原文地址:https://www.cnblogs.com/itzixueba/p/11610070.html
Copyright © 2011-2022 走看看