SQL語言藝術(shù)讀書筆記
一毒涧、創(chuàng)建
(一) 關(guān)系理論的關(guān)鍵原理:關(guān)系不包含重復(fù)數(shù)據(jù)钠四,且記錄之間沒有順序
(二)實現(xiàn)3NF的步驟
1. 確保原子性(atomicity)
細節(jié)之中潛藏著危險隙姿,過分“精益求精”會使我們精力分散般卑,甚至關(guān)注不相干的問題桌粉,合理把握處理數(shù)據(jù)的層次非常重要估盘。
一般而言,應(yīng)盡量使用具有實際意義的主鍵相种,而不是灰色的遞增整數(shù)。
所有屬性都具有了原子性品姓,且確定了鍵寝并,我們的數(shù)據(jù)就符合1NF了
2. 檢查對鍵的完全依賴性
在1NF的基礎(chǔ)上,如果去除了只依賴部分鍵的屬性后腹备,表就符合2NF了衬潦,如在保存用戶信息時,單位植酥,姓名都設(shè)置為字段镀岛,但同一個單位中的人員不止一個弦牡,那么在用戶表中保存的單位字段就不完全依賴用戶表的主鍵,這樣會造成數(shù)據(jù)的冗余漂羊,可以把單位分離出來驾锰。
3. 檢查屬性的獨立性
通常,滿足2NF的數(shù)據(jù)集也滿足3NF走越。我們可以這樣思考:屬性A的值確定之后椭豫,屬性B的值是否就確定了呢?
4. 空值對程序邏輯是危險的旨指,必須使用空值的話赏酥,一定要清楚它在特定情況下的影響
5. 子類型。
- 表過“寬”的另一個原因是對數(shù)據(jù)之間的關(guān)系了解不夠深入淤毛〗窀浚可以使用子類型。
- 給子類型表指定完全獨立于父表主鍵的主鍵低淡,是極其錯誤的姓言,如果子類型主鍵不是父表主鍵的子集的話,在很多方面都會導(dǎo)致性能降低蔗蹋。
- 所有子類型表中的主鍵的交集必須為空何荚,所有子類型表中的主鍵的并集是父表中的主鍵的集合。 這樣是正確的方法猪杭。
- 開發(fā)者不應(yīng)忘記數(shù)據(jù)庫恢復(fù)后要進行所有功能性的檢查餐塘,整個設(shè)計越復(fù)雜,開發(fā)者就越應(yīng)記住操作數(shù)據(jù)時的諸多約束皂吮。
- 如果需要對字段使用函數(shù)戒傻,就意味著表中原子性的數(shù)據(jù)不符合業(yè)務(wù)需求。
二蜂筹、查詢
- 查詢臨時表的語句效率比永久表差需纳。
- 將一次“大批量數(shù)據(jù)處理”分隔成多次“小塊處理”是個壞主意。如一次批量導(dǎo)入和多次循環(huán)逐條導(dǎo)入艺挪。
- 盡可能多地把事情交給數(shù)據(jù)庫優(yōu)化器來處理不翩,也就是說,要盡可能使用SQL解決問題麻裳,并盡可能利用每次數(shù)據(jù)庫訪問完成盡量多的工作口蝠。
- 不要把OO方法與關(guān)系數(shù)據(jù)庫處理混為一談,混淆關(guān)系和面向?qū)ο蟮母拍钜约皩⒈淼韧陬惤蚩印⒆侄蔚韧趯傩悦钫帷⒍际侵旅腻e誤。
- 沒有必要編程實現(xiàn)那些數(shù)據(jù)庫隱含實現(xiàn)的功能疆瑰。
三眉反、索引
- 對于通用目的或事務(wù)處理型數(shù)據(jù)庫而言狞谱,大部分表不需要加索引,因為許多表的查找是根據(jù)一組非常有限的條件來進行的禁漓。
- 正如數(shù)據(jù)設(shè)計的初衷所規(guī)定的,索引是一種以原子粒度訪問數(shù)據(jù)的手段孵睬,而不是為了檢索大量數(shù)據(jù)的播歼;否則,就嚴(yán)重誤解了索引的作用掰读。
- 你一定要非常清楚為哪些字段加索引秘狞,以及 為什么為它們加索引。
- 建立索引必須有理由蹈集,無論是對外鍵烁试,或是其他字段,都是如此拢肆。很多情況下無需為外鍵建立索引减响。
- 正確使用系統(tǒng)生成鍵大有裨益,但切勿濫用郭怪。
- 索引不是萬靈藥支示,充分理解要處理的數(shù)據(jù),做出合理的判斷鄙才,才能獲得高效方案颂鸿。
四、SQL語句
- 關(guān)系理論姿于數(shù)據(jù)庫攒庵,正如土木工程學(xué)之于橋梁嘴纺。
- 關(guān)系操作負責(zé)找出我們要操作的數(shù)據(jù)集,而“非關(guān)系操作層”對有限的數(shù)據(jù)集進行“精雕細刻”浓冒,從而產(chǎn)生用戶期望的結(jié)果栽渴。
- 排序,統(tǒng)計等操作屬于非關(guān)系操作范疇裆蒸。
- SQL用來表達“要做什么”熔萧,優(yōu)化器來完成“如何來做”。
- 切記僚祷,關(guān)系理論的數(shù)據(jù)基礎(chǔ)為數(shù)據(jù)處理提供了非常嚴(yán)謹(jǐn)?shù)倪壿嬛С址鹬拢虼薙QL藝術(shù)本應(yīng)該注重減小“非關(guān)系操作層”的厚度,即盡量在“關(guān)系操作層”完成大部分處理辙谜。
- 如果是若干個小查詢俺榆,優(yōu)化器將個個優(yōu)化;如果是一個大的查詢装哆,優(yōu)化器將它作為一個整體優(yōu)化罐脊。
- 熟練的開發(fā)者應(yīng)該努力使響應(yīng)時間與返回的記錄數(shù)成比例定嗓,這符合用戶的預(yù)期。
- 當(dāng)視圖返回不必要的元素時萍桌,別把視圖內(nèi)嵌在查詢中宵溅,而是應(yīng)將視圖分解,將其組成部分加到查詢主體中上炎。
- 高效定義過濾條件的準(zhǔn)則是:盡快的減少必須處理的數(shù)據(jù)量恃逻。
- 在連接中指定過濾條件利于提高性能,如:
join orders o on o.custid = c.custid and a.ordered >= somefunc
- 避免在最高層使用distinct應(yīng)該是一個基本原則藕施,如要避免下面的方式
select distinct c.custname
from customers c,
orders o,
orderdetail od,
articles a
where c.city = 'dalian'
and c.custid = o.custid
and o.ordid = od.ordid
and od.artid = a.artid
and a.artname = 'aodi'
and o.ordered >= somefunc