在生活中,除非我們是受虐狂,否則都會努力建立和維護平衡的關系。理想情況下,我們在關系中投人的與我們得到的基本一樣多。當段人際關系傾斜向某個人了,那么另一方就會不高興,從而重新評估這段關系,可能就此結束它。雖然本書不是講人際關系的,但在人際關系中存在的付出=回報的等式同樣適用于數(shù)據庫中的關系。
數(shù)據庫關系是由數(shù)據模型決定的,而數(shù)據模型抓住了數(shù)據的基數(shù)和參照完整性規(guī)則。要理解這是如何實現(xiàn)的,以及為什么它如此重要,就需要理解構建數(shù)據模型需要的基礎步驟,這些步驟將生成數(shù)據定義語言DDL)的可,即表和列。雖然這一流程有很多變體,但對于關系模型來說,第一步通常都是定義實體
實體可以是獨立存在的任何東西,如物理對象、事件或概念。實體之間可以存在關系,實體和關系都可以具有描述它們的屬性。打個比方,實體就是名詞,關系就是動詞,修飾實體的屬性就是形容詞,修飾關系的屬性就是副詞。
實體可以是某個事物的實例,例如客戶的訂單,可以具有訂單ID和總價這樣的屬性。把同種類型的實體集合起來就形成了實體集。在數(shù)據庫中,實體相當于表中的一行,而實體集相當于表。描述實體特有屬性的是表的主鍵。主鍵通過唯一標識實體的實例實現(xiàn)了實體完整性。外鍵描述實體間關系的特有屬性。外鍵把不同實體集中的兩個實體關聯(lián)在起,從而實現(xiàn)了弓引用完整性。最常用的實體、關系和屬性的圖解表示法是實體關系圖(ERD)。ERD展示了實體集間的基本關系,是一對一對多還是多對多
一旦定義和映射了實體、關系和屬性,設計數(shù)據模型就剩下最后一步了:規(guī)范化。規(guī)范化數(shù)據模型的主要目的是,確保存儲數(shù)據的方式允許在保證數(shù)據完整性的情況下對數(shù)據進行插入、更新選擇和刪除的操作傾即CRUD,Create Read Update Delete)不規(guī)范的數(shù)據模型具有高度的數(shù)據冗余,這意味著數(shù)據完整性問題的風險更大。范式是逐級構建的,這意味著滿足第二范式的數(shù)據庫也必須滿足第一范式。下面的補充說明介紹了最常見的范式。如果一個數(shù)據庫至少滿足第三范式,就可以認為它是規(guī)范的。
范式
下面是數(shù)據庫中常用的范式。滿足高級范式表明必須滿足低級范式。通常,如果數(shù)據庫滿足第三范式,我們就說它是規(guī)范的。
口第一范式。按照Codd的定義,表最初應該表示一個關系且表中沒有重復的分組。雖然Codd詳細定義了“關系”,但是“重復的分組”這個概念仍然引起了爭議。爭論的內容有是否允許表中存在表,是否允許域為空。最重要的概念是能夠創(chuàng)建一個主關鍵字。
口第二范式。所有非主關鍵字域都不能只依賴于組合關鍵字的部分。
口第三范式。所有非主關鍵字城必須依賴于主關鍵字。Boyce-Cod范式。每個決定因素都是候選的關鍵字。
口第四范式。一種記錄類型中不存在多值依賴。
口第五范式。表中的每個非平凡連接依賴都是由候選主關鍵字決定的。
口第六范式。不存在非平凡連接依賴。
前三種范式的簡便記憶法是“1-一主關鍵字,2一完整的主關鍵字3一只能依賴于主關鍵字”。
你可能已經想到了,實體間的關系會對數(shù)據存儲、提取和更新的有效性產生巨大的影響。由于這些關系定義了如何分割和共享數(shù)據庫,所以它們在擴展中也扮演著重要的角色。假設我們想根據訂單確確認服務對數(shù)據庫進行Y軸分割,那么如果訂單實體與其他實體關系緊密,那么這種分割就可能造成問題。在分割之后再試圖理清這種關系網很困難。在設計階段多花費點兒時間,在分割數(shù)據庫時就只需要花費原來的1/10甚至1/100的精力。
對于擴展性來說,數(shù)據關系的最后一個關鍵點是在查詢中如何連接表。當然,這不僅是由數(shù)據模型定義的,也是由在應用中創(chuàng)建報表和新頁面的開發(fā)人員定義的。這里我們不是要詳細介紹優(yōu)化查詢的步驟,要說的是新的查詢都應該由熟悉數(shù)據模型且能力根強的DBA申貸,在把們投入到生產環(huán)境之前,還要分析性能方面的特征。
你可能已經注意到了,在通過規(guī)范化提高數(shù)據完整性的愿望和在數(shù)據庫中使用的關系程度之間是有關系的。采用的范式越高,在創(chuàng)建表時的關系越多,對重復的值這種情況尤其如此。在數(shù)據庫設計方面,幾年前被當作原則使用的東西(即采用的范式越高越好),現(xiàn)在大型交易系統(tǒng)設計時,都要進行權衡了。這種權衡與風險和成本、成本和質量、時間和成本等之間的權衡是相似的,即一方的下降通常會導致另一方的上升。通常,要提高可擴展性,我們會降低采用的范式。
因為要連接表,所以SQL査詢很慢,可以采用以下幾種方法解決。首先是對查詢進行調優(yōu)。如果這種方法無效,另一種方法是創(chuàng)建視圖、物化視圖、摘要表等,可以對連接進行預處理。還有一種方法是不要在査詢中進行連接,而是把數(shù)據集讀到應用中,在應用的內存中進行連接。雖然這種方法比較復雜,但在數(shù)據庫中進行連接通常是最難擴展的,而該方法把連接移出了數(shù)據庫,放在應用服務器層上,那么用更多的商用硬件進行水平擴展會更容易一些。最后一個辦法是追溯到業(yè)務需求上。通常,我們的業(yè)務合作伙伴會提出不同的解決方案,在解釋時會說,現(xiàn)有的請求報表的方法需要增加10%的硬件,而刪除一行會減小報表的復雜度,而得到的網站設計業(yè)務價值基本是相同的。
本文地址:http://m.blackside-inc.com//article/3494.html