【實戰演練】數據庫基本知識與原理系列02-數據庫設計與開發的範式

django網站開發,已經將靜態頁面的開發基本講完了,要開發動態網頁(用戶與網站能夠輸入輸出交互),就須要展現層(靜態頁面)->邏輯層(函數)->數據層(數據庫)進行交互。數據庫


而如何在數據庫、數據庫表、字段、關聯關係都清楚明瞭的狀況下,在django建立數據庫很是簡單。django

可是若是將系統需求收集、分析,而後設計出整套數據庫的數據庫表、字段、關聯關係,則很是地困難。(這叫數據庫設計/開發)數據庫設計


在數據庫設計/開發階段階段,須要遵循數據庫的三大範式來進行設計。ide


一、數據庫設計三範式:函數

第一範式,數據不可分。網站

#能夠理解爲一個字段裏面僅有一個數,例如一個字段不能既存放用戶名與手機號碼,若是要存,就拆開兩個字段分別存。spa

第二範式,每一個表格須要有個惟一性主鍵。設計

#由於關係型數據庫是須要經過主鍵查找的,例如姓名這種可能有多個重名的張三,就不能拿來作主鍵,要用×××號。orm

第三範式,表裏面不能夠有數據對非主鍵的數據有依賴。對象

#例如一張表裏面有×××號,姓名,電話號碼,居住省,居住市這樣4個字段,×××號肯定,就必定能夠肯定姓名與電話號碼,這叫「姓名」與「電話號碼「惟一性依賴。而」居住省「,」居住市「這兩個字段與」×××號「實際上是沒有必然的依賴關係的。原本也沒有問題,可是明顯」居住市「是對」居住省「有依賴的,例如廣州市確定是在廣東省的前提下才能選擇的。而」居住省「不是主鍵,因此叫作有數據對非主鍵有依賴。所以,違反第三範式,解決方法是應該將」居住省「」居住市「單獨拆分到另一張」居住地表「。


二、數據關聯關係:

前面說過了,關係型數據庫,就是一堆有關聯關係的二維表,關聯關係一般有3種狀況。

一對一:直接用一張表,其餘字段依賴於主鍵;

#例如一個學號,會對應一個學生姓名

一對多、多對一:在多的裏面引用一的外鍵

#例如,假設一個老師僅能教一門課,而一門課能夠多個老師授課。那麼老師與課程的關係就是多對一,課程與老師的關係是一對多。

在數據庫設計裏面,應該在多者所在表(老師表)裏面添加外鍵,引用一者(課程表)表裏面的主鍵(課程ID)

#能夠進行另外的假設,例如一個老師能夠教多門課程,而一門課程僅能一個老師上課,那麼老師與課程的關係就變爲一對多,而課程與老師關係變爲多對一。

數據庫的設計,就變成了多者所在的表(課程表)添加外鍵,引用一者(老師表)的主鍵(多是老師ID,員工工號之類)

多對多:這種狀況沒法在兩張表之間直接創建關聯關係,須要憑空創建一張中間表,做爲鏈接。

#例如一個學生可以選修多門課程,一個課程能夠給多個學生選修,關係則爲多對多,這種沒法經過在哪一邊引入外鍵解決。

必須建立一張中間表,例如叫「選課表」,建立一個主鍵(例如序號/ID),而後外鍵引用學生表的主鍵、課程表的主鍵。將學生與課程關聯起來。


三、數據庫表設計

咱們回顧一下django網站系統開發的需求:【實戰演練】Python+Django網站開發系列02-Django完整開發環境部署http://www.javashuo.com/article/p-hcssixvx-w.html

咱們會有學生、老師、課程這3大類的對象,先分析一下需求與關聯關係。

假設咱們系統要求每一個學生能夠最多選修2門課程,每一個老師能夠授課2門課程,每一個課程僅能一名老師上課。那麼在這樣的需求下:

1)學生與課程之間關係是:多對多;

2)老師與課程之間關係是:一對多;

3)學生與老師之間關係是:沒有直接關聯關係,都是經過課程聯繫起來的;

所以,至少須要4張表,學生表、老師表、課程表、成績表(學生與課程的中間表),而課程表(多)裏面引用老師表(一)的主鍵爲外鍵。


而後設計4張表的字段,思考一下須要什麼信息才能知足咱們的系統需求。(not null表示不能爲空值)

學生表(student)
學號 sno 主鍵 not null
姓名 sname
null
性別 ssex
null
用戶名 susername
null
年齡 sage
null
所在系
sdept
null


老師表(teacher)
教師號 tno 主鍵 not null
教師姓名 tname
null
教師用戶名 tusername
null
職稱 ttitle
null


課程表(course)
課程號

cno

主鍵 not null
課程名 cname
null
學分 ccredit
null
上課時間 ctime
null
上課地點 cplace
null
老師號 tno_id 外鍵 not null


成績表(score)
課程號 cno_id 外鍵 not null
學號 sno_id 外鍵 not null
成績 cscore
null


這樣,數據庫的設計/開發就完成了。按照三大範式與關聯關係檢查一下,若是有違反的,就須要再次將違反範式的字段拆分出來,而後再視關聯關係來看是否須要增長中間表。(以上只是很簡單的案例,實際生產系統的數據庫設計/開發比這個要困難不少,django網站開發後面的數據庫後面仍是用回這幾個數據庫表)

相關文章
相關標籤/搜索