官术网_书友最值得收藏!

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圖中被記為MN

在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表的主鍵相關聯。

? 對于MN關系,生成一個單獨的表表示該關系,該關系的列由兩個表的主鍵組成。

? 重新審核所有的表,在需要的地方添加約束,對常用的條件字段設置索引。

通過上述步驟,可以將圖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實現了“學生”與“課程”的MN關系。

考慮到可能會有不熟悉數據庫理論的讀者,這里將表4.1~表4.5中的鍵型、索引、約束解釋如下。

? Index:索引,是對數據庫表中一列或多列的值進行排序的一種結構。對常用的查詢條件字段添加索引可顯著提高SQL語句的性能。

? Constraint:約束,是對列數據取值的某種限定。常見的約束有主鍵、外鍵、非空、唯一等。

? PK:主鍵(Primary Key),唯一標識一條記錄,不允許為空。在大多數數據庫中主鍵列也是一個索引列。

? FK:外鍵(Foreign Key),是另一個表的主鍵,表示關聯關系,可以是空字段。

? NOT NULL:非空約束,即不允許列值為空。

主站蜘蛛池模板: 宜黄县| 剑川县| 龙州县| 沭阳县| 德保县| 鸡西市| 科技| 赤壁市| 河东区| 望谟县| 邳州市| 平乡县| 洛阳市| 四会市| 朝阳区| 锦屏县| 凉城县| 九台市| 壤塘县| 怀集县| 同德县| 衡水市| 大理市| 昌宁县| 浠水县| 开原市| 湘阴县| 镇远县| 巨野县| 阿坝县| 梁河县| 琼海市| 奉贤区| 胶州市| 阳原县| 灵璧县| 东乌珠穆沁旗| 无极县| 宜兰县| 翁源县| 朝阳市|