SQL 反模式
所謂專家就是在一個(gè)很小的領(lǐng)域把所有錯(cuò)誤都犯過(guò)的人。
邏輯數(shù)據(jù)庫(kù)反模式
1.存儲(chǔ)多值屬性。
反模式:格式化的逗號(hào)分隔列表。增加插入,更新,刪除復(fù)雜性,無(wú)法利用索引,通過(guò)逗號(hào)列表中的某一屬性查詢效率低,無(wú)法驗(yàn)證列表有效性,需要選擇合適的分隔符,長(zhǎng)度限制。
合理使用:在不需要獲取單獨(dú)項(xiàng),僅展示列表時(shí)可以提高效率。
解決方案:創(chuàng)建交叉表:id1,id2。
2.分層存儲(chǔ)和查詢。
反模式:總依賴父節(jié)點(diǎn)。parentid。
合理使用:鄰接表優(yōu)勢(shì)在于能快速定位直接父節(jié)點(diǎn),容易插入新節(jié)點(diǎn)。通過(guò)WITH表達(dá)式也可以很好的遞歸。
解決方案:路徑枚舉、嵌套集、閉包表。
設(shè)計(jì)???表??查詢子節(jié)點(diǎn)?????查詢樹???插入???刪除????引用完整性
鄰接表??1???????簡(jiǎn)單????????困難????簡(jiǎn)單????簡(jiǎn)單??????是
遞歸查詢?1??????簡(jiǎn)單?????????簡(jiǎn)單????簡(jiǎn)單????簡(jiǎn)單??????是
路徑枚舉??1???????簡(jiǎn)單???????簡(jiǎn)單????簡(jiǎn)單????簡(jiǎn)單??????否
嵌套集??1???????困難?????????簡(jiǎn)單?????困難?????困難??????否
閉包表???2???????簡(jiǎn)單?????????簡(jiǎn)單????簡(jiǎn)單????簡(jiǎn)單??????是
??
3.建立主鍵規(guī)范。
反模式:主鍵名叫id,并自動(dòng)增長(zhǎng)。冗余的鍵值,允許重復(fù)項(xiàng),意義不明確,無(wú)法使用using關(guān)鍵字。
合理使用:框架原因需要id,或者自然鍵太長(zhǎng),長(zhǎng)字符串索引開銷較大。
解決方案:擁抱自然鍵和組合鍵
4.簡(jiǎn)化數(shù)據(jù)庫(kù)架構(gòu)。
反模式:無(wú)視約束,不添加約束。
解決方案:聲明約束,唯一性,外鍵,檢查等。可支持級(jí)聯(lián)刪除和更新。外鍵需要一些系統(tǒng)開銷,但對(duì)于其他的方案,外鍵更高效:
不需要在更新和刪除前執(zhí)行select
在同步修改時(shí)不需要鎖住整張表
不再需要定期監(jiān)控孤立數(shù)據(jù)
5.支持可變屬性。
6.引用多個(gè)父表。
反模式:使用雙用途外鍵。即通過(guò)某個(gè)字段判斷另以字段要關(guān)聯(lián)的表。
合理使用:當(dāng)程序框架中可以很好支持多態(tài)關(guān)聯(lián),并封裝了風(fēng)險(xiǎn),可以選擇使用。
解決方案:
創(chuàng)建交叉表:
A id....
X1 id
X2
若要保證唯一性,可增加unique約束。
可雙向查找。
?
創(chuàng)建公用超級(jí)表:
A : id
A1:id FK 。。。。。
A2:id FK 。。。。。
B:id,aid FK。。。。。。
查詢時(shí)
SELECT FROM b left join A1 using (ID)
left join A2 using (ID)
WHERE......
合并跑到:
通過(guò)UNION
7.存儲(chǔ)多值屬性。
反模式:創(chuàng)建多個(gè)列。x1,x2,x3。
查詢需搜索多列,添加刪除更新不安全性,無(wú)法知道更新哪一列,可能某列沒(méi)有值,無(wú)法保證唯一性,可能列不夠用要增加列。
合理使用:當(dāng)屬性列固定,當(dāng)屬性列互相沒(méi)有關(guān)系,相互獨(dú)立。
解決方案:創(chuàng)建從屬表
8.支持可擴(kuò)展性。
反模式:克隆表、克隆列。
將將很長(zhǎng)的表拆分成多張小表、將一個(gè)列拆分成多個(gè)子列。
不斷產(chǎn)生新表,數(shù)據(jù)完整性,同步數(shù)據(jù),確保唯一性,跨表查詢,同步元數(shù)據(jù),管理引用完整性,標(biāo)識(shí)元數(shù)據(jù)分裂列。
解決方案:水平分區(qū)、垂直分區(qū),使用關(guān)聯(lián)表。
水平分區(qū):物理拆分。
垂直分區(qū):根據(jù)列拆分。
物理反模式
9.取整錯(cuò)誤。
反模式:使用float類型。會(huì)舍入,不精確。
合理使用:當(dāng)取值范圍大于interger和numeric時(shí)就要使用float。
解決方案:使用numeric和decimal。盡量不要使用浮點(diǎn)數(shù)。
10.限定列的有效值。
反模式:在列定義上指定可選值。用check約束。
無(wú)法知道有哪些可選值。添加新值困難,無(wú)法刪除老值,可移植性低下。
合理使用:候選值幾乎不變時(shí)使用,可在代碼中維護(hù)列表。
解決方案:在數(shù)據(jù)中指定值。創(chuàng)建一張表。
11.存儲(chǔ)圖片和大媒體。
反模式:假設(shè)你必須使用文件系統(tǒng)。文件不支持delete,不支持事務(wù)隔離,不支持回滾,不支持?jǐn)?shù)據(jù)庫(kù)備份,不支持sql訪問(wèn)權(quán)限。
合理使用:存在文件系統(tǒng)的好處:
數(shù)據(jù)庫(kù)空間占用小,不包含文件的備份快,預(yù)覽編輯圖片方便。
解決方案:在需要時(shí)使用blob類型。
12.優(yōu)化性能。
反模式:無(wú)規(guī)劃的使用索引。不使用索引,索引不足;使用太多索引和無(wú)效索引;執(zhí)行一些無(wú)法使用索引的查詢。
解決方案:測(cè)量,解釋,挑選,測(cè)試,優(yōu)化,重建。
查詢反模式:
13.辨別懸空值。
反模式:將NULL作為普通值。
解決方案:將NULL視為特殊值。
14.獲取每組最大值。
反模式:引用非分組列。
解決方案:無(wú)歧義的使用列。
15.獲取樣本記錄。
反模式:隨機(jī)排序。使用rand()表示整個(gè)過(guò)程無(wú)法利用索引。
合理使用:數(shù)據(jù)量較小,不會(huì)有性能問(wèn)題時(shí)。
解決方案:沒(méi)有具體的順序。
專用方案:sql server:使用table-sample子句。
oracle 使用sample子句。
16.全文搜索。
反模式:模式匹配。like %a%?或正則表達(dá)式。無(wú)法從傳統(tǒng)索引上受益。返回預(yù)料之外的結(jié)果。
合理使用:一些查詢很少執(zhí)行,不需要優(yōu)化。
解決方案:使用正確的工具。
使用特殊的搜索引擎技術(shù)而不是sql,即數(shù)據(jù)庫(kù)擴(kuò)展的全文搜索。。講結(jié)果保存起來(lái)以減少重復(fù)的搜索開銷。
17.減少SQL查詢數(shù)量。
反模式:使用一步操作解決復(fù)雜問(wèn)題。
解決方案:分而治之。一步一個(gè)腳印,將復(fù)雜查詢拆分,尋找union標(biāo)記,通過(guò)代碼生成sql語(yǔ)句如
SELECT 'UPDATE X SET X = ' u.id FROM u
18.減少輸入。
反模式:捷徑會(huì)讓你迷失方向。破壞代碼重構(gòu),使用通配符*增加開銷,
解決方案:明確列出列名
應(yīng)用開發(fā)反模式:
19.恢復(fù)或重置密碼。
反模式:明文密碼。
解決方案:先哈希 后存儲(chǔ)。給哈希加料。重置密碼而非返回密碼。
20.編寫SQL動(dòng)態(tài)查詢。
反模式:將未經(jīng)驗(yàn)證的輸入作為代碼執(zhí)行。
解決方案:不信任任何人。過(guò)濾輸入內(nèi)容,參數(shù)化動(dòng)態(tài)內(nèi)容,給輸入的值加引號(hào),將用戶與代碼隔離,找可靠的人幫你審查代碼。
21.整理數(shù)據(jù)。
反模式:填充角落??吹椒峙涞木幪?hào)不連續(xù),第一反應(yīng)是填補(bǔ)其中的空缺。
解決方案:克服心理障礙。用rownumber定義行號(hào),使用guid。
向?qū)Ψ浇忉屝刑?hào)不連續(xù)的原因,清楚的表明開銷,使用自然鍵。
22.寫更少的代碼。
反模式:無(wú)米之炊。忽略了數(shù)據(jù)庫(kù)的返回值,和程序代碼混在一起閱讀sql代碼。
解決方案:關(guān)注返回值,查看程序生成的sql代碼。
23.采用最佳實(shí)踐。
反模式:將sql視為二等公民。
解決方案:建立一個(gè)質(zhì)量至上的文化。
清晰的定義項(xiàng)目需求,并寫成文檔。設(shè)計(jì)并實(shí)現(xiàn)一個(gè)解決方案來(lái)滿足需求。驗(yàn)證并測(cè)試解決方案是否符合需求。
數(shù)據(jù)庫(kù)文檔:
實(shí)體關(guān)系圖。表、列視圖。關(guān)系。觸發(fā)器。存儲(chǔ)過(guò)程。SQL安全。數(shù)據(jù)庫(kù)基礎(chǔ)設(shè)施。ORM。
24.簡(jiǎn)化MVC模型。
反模式:模型僅僅是活動(dòng)記錄。
解決方案:模型包含活動(dòng)記錄。
總結(jié)
- 上一篇: 活动图与流程图的区别
- 下一篇: 完整SQL分页存储过程(支持多表联接)