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網站開發後面的數據庫後面仍是用回這幾個數據庫表)