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