MySQL数据库

Wesley13
• 阅读 623

[toc]

学生管理系统数据库设计

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

学生管理系统功能介绍

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

  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

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

前提: 熟悉项目的业务流程!

  • 一类对象信息保存张表中
  • 表中必须有主键列(为了防止没有主键习惯添加虚拟主键列id,id一般设置为自增)
  • 添加约束保证数据完整性
    • 主键
    • 唯一
    • 自增
    • 非空
    • 外键(实现1-N)
    • 默认值
  • 多对对必须独立一个关系表
  • 注意: 等级明显并且无敏感信息的数据可以通过自关联实现!
  • 遵守: 数据库设计三大范式(三大原则)
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
3年前
java教学进度信息管理系统
今天将为大家分析一个基于javaweb的教学进度信息管理系统。采用当前非常流行的B/S体系结构,以JAVA作为开发技术,主要依赖SSM技术框架,mysql数据库建立本系统。本文设计的高校教学管理系统能够完成教学计划制定,自动排课,课程管理,教学资源管理,学生管理等多方面的功能。基于javaweb的教学进度信息管理系统项目使用框架为SSM(MYECLIP
Wesley13 Wesley13
3年前
java作业——学生信息管理系统
//20183761司宇明ScoreInformation.javaimportjava.lang.Object;classScoreInformation{   privateStringstunumber;   privateStringname;   privatedoublemath
Stella981 Stella981
3年前
Python 学生管理
原文链接: Python学生管理(https://my.oschina.net/ahaoboy/blog/1526102)python3练手 codingutf8学生类classStu:三个字段id字符串,name字符串,score小数def__init__(sel
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
Android蓝牙连接汽车OBD设备
//设备连接public class BluetoothConnect implements Runnable {    private static final UUID CONNECT_UUID  UUID.fromString("0000110100001000800000805F9B34FB");
Stella981 Stella981
3年前
C语言实现一个Window控制台带彩色,且可以用方向键选择并确认的菜单式列表(二)
http://blog.csdn.net/morixinguan/article/details/77485367上节,我们写了一个简单的列表框架,是关于学生信息管理系统的,这节,我们来把它尽量的完善一下。目前,我这边已经除了学生信息修改以及学生信息删除还没有做好,其余功能已经可以正常使用,我们来看看程序的实现,往后更新了这两个接口,会将本文继续修改
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究