- Python高效開發實戰:Django、Tornado、Flask、Twisted(第3版)
- 劉長龍
- 3097字
- 2021-10-15 17:52:57
4.1 數據庫的概念
盡管數據庫本身可以指任何以存儲數據為目的的軟硬件系統,但由于關系數據庫在當今Web開發中的重要地位,本書中的數據庫只指用E-R圖建模、使用SQL或ORM進行交互的關系數據庫。
4.1.1 Web開發中的數據庫
任何應用系統都離不開對數據的增加、刪除和修改,Web系統也不例外。讀者可以回憶一下自己常用的網站,除了有精美的網頁、人性化的交互,所有站點的核心功能都是圍繞著數據展開的。
? 購物網站上,琳瑯滿目的商品、價格、購物記錄、支付狀態都通過數據庫進行保存。
? 社交網站上,博客消息、好友狀態、朋友關聯都由數據庫提供支撐。
? 技術論壇上,話題板塊分類、文章帖子、網友跟帖都要由數據庫管理。
? 搜索引擎中,各種關鍵字、網頁快照都由數據庫進行索引和保存。
網站系統的設計一般遵循三層架構,即將網站系統在邏輯上分為三層:客戶端層(HTML、CSS、JavaScript)、業務邏輯層(Python)、數據訪問層(Python)。其中客戶端層直接服務于用戶,業務邏輯層為客戶端層服務,數據訪問層為業務邏輯層提供數據支持,數據訪問層直接和數據庫打交道。Web系統的三層架構如圖4.1所示。

圖4.1 Web系統的三層架構
從圖4.1可以看出數據庫為整個網站提供基礎服務,圖4.1同時給出了和數據庫相關的3種人員的角色,對他們各自的行為總結如下。
? 用戶:通過客戶端軟件(Web瀏覽器)訪問網站,通過業務邏輯層和數據訪問層間接獲得數據服務。
? 開發者:設計和開發三層架構中的所有程序,與數據庫相關的部分包括數據庫模型建立、數據訪問代碼開發等。
? 數據庫管理員:通過數據庫管理系統(DBMS)對數據庫進行維護和配置,包括數據庫性能分析、性能改進、數據備份、數據恢復等。
由此可見,作為網站開發者的讀者,需要具備數據庫建模(E-R圖)和開發數據訪問代碼(SQL或ORM)的能力。
在Web架構設計期,我們通常需要考慮數據庫選型。數據庫選型的依據一般為開發人員的熟練程度、費用、數據規模、性能要求、集群能力等,也可參考數據庫管理員的建議。對當前比較常見的數據庫介紹如下。
? PostgreSQL:始于1986年的著名開源數據庫,在靈活的BSD風格許可證下發行。PostgreSQL的特性覆蓋了SQL-2/SQL-92和SQL-3/SQL-99,幾乎包括了世界上最豐富的數據類型,“IP類型”等數據類型連商業數據庫都不具備。但它在數據集群及管理工具上不如一些商業數據庫。
? MySQL:瑞典MySQL AB公司開發的開源數據庫,目前為Oracle旗下的公司,是一種快速、多線程、多用戶的SQL數據庫服務器,在Web開發領域比較常見,可以輕易地支持上千萬條數據的數據量。其缺點是由于缺乏官方資料而比較難學,開發者在開發中遇到問題時需要自己鉆研,對存儲過程的支持也比較有限。
? Oracle:很長時間以來最著名、市場占有率最高的商業數據庫。Oracle以極強的數據一致性能力而著稱,因而常見于金融、通信、政府等大型項目中。對幾乎所有操作系統都有良好的支持。其缺點是價格昂貴,一般小項目較少選擇Oracle。
? MS SQL Server:微軟發布的商業數據庫,其圖形化的用戶界面使系統管理和數據庫管理更加直觀、簡單,而且與Windows完全集成,可以利用Windows的許多功能,如管理登錄安全性、Office報表展現等。它在Windows平臺下是極其優秀的關系數據庫,缺點是尚無Linux平臺版本。
? SQLite:一個輕量級、跨平臺的關系數據庫,支持SQL 92中的大部分功能。與以上數據庫不同的是,SQLite不是C/S模式的數據庫,它是進程內的數據庫引擎,因此不存在數據庫的客戶端和服務器。由于其輕量級的特點,SQLite常用于嵌入式設備或并發可能性很低的場合。
4.1.2 關系數據庫建模
數據庫建模(Database Modeling)是指針對一個給定的應用環境構造數據庫模式,建立數據庫及其應用系統,使之能夠有效地存儲數據,滿足用戶的應用需求。在現代敏捷開發方法的指導下,明確Web系統的業務需求后,關系數據庫建模通常由以下兩步完成。
? 設計E-R圖:構造一個反映現實世界實體之間聯系的模型。
? 關系表設計:將E-R圖轉換為關系表,并定義列類型,建立主鍵、外鍵等各種約束。
1. 設計E-R圖
E-R圖,即實體-關系(Entity-Relationship)圖,是P.P.S.Chen于1976年提出的數據建模方法,由于其簡單實用,得到了普遍應用,是目前描述信息結構最常用的方法。E-R圖通過以下3種概念描述信息結構。
? 實體:客觀存在的事物、事件、角色等,比采購員、老師、課程、訂單等。
? 實體屬性:用于描述實體的特性,每個實體可以有多個屬性,如老師的性別、名字、住址等。
? 關系:反映兩個實體之間客觀存在的關系。
設計E-R圖就是圍繞著識別系統中的實體和明確實體之間關系而進行的。E-R圖中兩個實體(假設分別為實體A和實體B)的關系被分為以下3類。
? 一對一關系:實體A的任意一個實例至多只有一個實體B的實例與之關聯;而實體B的任意一個實例也至多只有一個實體A的實例與之關聯。典型的一對一關系包括人與身份證、丈夫與妻子等。一對一關系在E-R圖中被記為1∶1。
? 一對多關系:實體A的任意實例可以有零個、一個或多個實體B的實例與之關聯;而實體B的任意實例至多只與一個實體A的實例關聯。典型的一對多關系包括班級與學生、人與銀行卡等。一對多關系在E-R圖中被記為1∶N。
? 多對多關系:實體A的任意一個實例可以與實體B中的任意多個實例關聯;而實體B中的任意一個實例也可以與實體A中的任意多個實例關聯。典型的多對多關系包括老師和班級、學生與課程等。多對多關系在E-R圖中被記為M∶N。
在E-R圖的繪制中,通常用方塊表示實體,用實體周圍的圓圈表示屬性,用實體之間的菱形表示關系。圖4.2是一個學校系統的E-R圖示例。

圖4.2 學校系統的E-R圖示例
圖4.2中定義了4個實體和3個關系,實體分別是“老師”“課程”“學生”“學生證”。實體的各個屬性如圖4.2中的圓圈部分所示。3個關系分別是:課程與老師之間的一對多任教關系(假設學校只允許一個老師教一門課程,但一門課程可以有多個老師任教);課程與學生之間的多對多選課關系(每門課程可以有多個學生學習,每個學生可以選擇多門課程);學生與學生證的一對一入學關系(每個學生在入學時辦理唯一的學生證)。
2. 關系表設計
在完成了數據需求分析和E-R圖設計后,就可以進行關系表的具體設計了。將E-R圖設計轉變為關系表設計可按照如下步驟進行。
? 數據庫選型,如MySQL、SQL Server、Oracle、PostgreSQL等。因為各種數據庫支持的列類型略有不同,所以需要在物理表設計之前完成選型。
? 將每個實體轉換為一個數據表,將實體的屬性轉換為該表中的列,為每個列定義相應的數據類型。
? 對于1∶1關系的兩個表,為兩個表設置相同的主鍵列。
? 對于1∶N關系的兩個表,在N表中添加一個外鍵列,該列與1表的主鍵相關聯。
? 對于M∶N關系,生成一個單獨的表表示該關系,該關系的列由兩個表的主鍵組成。
? 重新審核所有的表,在需要的地方添加約束,對常用的條件字段設置索引。
通過上述步驟,可以將圖4.2中的實體關系模型轉換為具體的關系表。該圖一共生成了5個表:4個實體表和1個關系表。假設數據庫采用PostgreSQL,則轉換后的表定義如表4.1、表4.2、表4.3、表4.4和表4.5所示。
表4.1 表定義——課程

表4.2 表定義——老師

表4.3 表定義——學生

表4.4 表定義——學生證

表4.5 表定義——選課

在以上表定義中,讀者尤其應該注意關系的表達方法。
? 表student和表card通過設置相同的主鍵(即student_id)實現了1∶1關系。
? 表teacher中通過設置外鍵course_id實現了與課程的1∶N關系。
? 表enroll實現了“學生”與“課程”的M∶N關系。
考慮到可能會有不熟悉數據庫理論的讀者,這里將表4.1~表4.5中的鍵型、索引、約束解釋如下。
? Index:索引,是對數據庫表中一列或多列的值進行排序的一種結構。對常用的查詢條件字段添加索引可顯著提高SQL語句的性能。
? Constraint:約束,是對列數據取值的某種限定。常見的約束有主鍵、外鍵、非空、唯一等。
? PK:主鍵(Primary Key),唯一標識一條記錄,不允許為空。在大多數數據庫中主鍵列也是一個索引列。
? FK:外鍵(Foreign Key),是另一個表的主鍵,表示關聯關系,可以是空字段。
? NOT NULL:非空約束,即不允許列值為空。
- Monkey Game Development:Beginner's Guide
- Vue.js 2 and Bootstrap 4 Web Development
- Mastering Scientific Computing with R
- Go并發編程實戰
- SQL Server從入門到精通(第3版)
- Webpack實戰:入門、進階與調優
- HTML5+CSS3+jQuery Mobile APP與移動網站設計從入門到精通
- Mastering Apache Storm
- Oracle實用教程
- Julia數據科學應用
- Mastering Android Studio 3
- 面向對象程序設計及C++(第3版)
- SAP Web Dynpro for ABAP開發技術詳解:基礎應用
- jQuery Mobile Web Development Essentials(Second Edition)
- 深入理解Kafka:核心設計與實踐原理