日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

SQL 反模式

發(fā)布時(shí)間:2025/6/15 数据库 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL 反模式 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

所謂專家就是在一個(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 反模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。