[toc]html
學生管理系統數據庫設計
設計一套數據庫首先要熟悉當前系統有哪些功能,具體的業務流程是什麼python
學生管理系統功能介紹
一套學校用的學生管理系統,最核心的功能以下數據庫
- 學生信息管理(增長學生,刪除學生,修改學生,查詢學生信息==簡稱:CURD)
- 老師信息管理(CURD)
- 課程信息管理系統(CURD)
- 成績信息管理系統(CURD)
- 違紀信息管理(CURD)
- 活動信息管理(CURD)
- 物資/設備信息管理(CURD)
- 等....
要完成以上全部的功能,須要操做以上對象的相關信息. 以上對象的信息能夠按照固定格式存儲在數據庫中! 數據庫設計的**第一步就是找出業務相關的的核心對象 **,一類物體/對象的信息固定存儲在一張表中!數據庫設計
概念網站
- 對象: 生活中的一類物體,程序中叫對象
- 屬性: 物體的名詞和形容詞的描述,就是對象的屬性
數據庫設計步驟
數據庫設計三大核心的步驟:spa
- 1.找對象
- 2.找屬性
- 3.找關係
第1步: 找對象
分析系統業務中的核心對象.設計
- 學生對象----> 學生表(student)
- 老師對象----> 老師表(teacher)
- 課程對象----> 課程表(course)
- 成績對象----> 成績表(score)
- 班級對象----> 班級表(前綴_class,由於user或class等英文單詞是程序中的關鍵字.儘可能不直接用)
- 等.....
**注意: 一些隱含的對象可能由於對業務不熟練,可能找不到 **,.好比:學生請假條對象. 活動對象等..... 因此進行數據庫設計以前,必定要把系統功能和業務流程整理清楚.固然遺漏的對象能夠在須要時再補充.數據庫設計沒有一步到位的.code
第2步:找屬性
屬性概念: 物體/對象的名詞或形容詞的描述.學名叫"屬性",,每一個屬性對應表中的1個列!htm
- 學生對象(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)
- 默認值
- 多對對必須獨立一個關係表
- 注意: 等級明顯而且無敏感信息的數據能夠經過自關聯實現!
- 遵照: 數據庫設計三大範式(三大原則)