SQL反模式總結

2021-06-29 11:24:46 字數 2576 閱讀 1894

1.亂穿馬路

現象:在乙個表鍵中存放多個值,用,. / \類似的符號隔開

問題:這會讓查詢.插入和刪除的效率變得非常低

解決方案:不要在乙個表鍵中存放多個值,將所有原本在乙個表鍵中的值存放到一張單獨的表,在新錶中建立兩個屬性,

乙個與原表的主鍵建立外來鍵關係,乙個標明值。例子見表

產品id 經銷商

1 張三

1 李四

2 老王

2 老李

3 老劉

id 名字 其他屬性

1 電鋸

2 錘子

3 鐮刀

同樣的,這個方法也可以用來儲存商品標籤

2.單純的樹3主鍵規範

現象:不管有用沒用,都設定個id

問題:假如乙個表裡面已經有乙個可以unique的屬性,為何要在建立乙個id

解決方案:避免加入乙個毫無意義的主鍵,或使用組合鍵

技巧:使用using來處理聯結

select * table_1 join table_2 on (table_1.id=table_2.id)

如上 如果兩張表的聯結鍵值一樣的話,可以這樣寫

select * table_1 join table_2 using(id)

技巧:mysql中last_insert_id()可以用來返回最後乙個自動生成(auto increment)的值

sqlserver使用的是 scope_identity()

4.缺少外來鍵約束

現象:省略外來鍵似乎會讓資料庫更加簡單;

問題:你的資料可能會出現很多莫名其妙的無主資料,你需要不時的清理他們,而且還會使資料庫不完備;

解決方案:一定要設立外來鍵!

技巧:將空鍵設為預設 update bugs set status = default where…….

技巧:級聯更新

考慮table_1下列語句

foreign key (v_1)references table_2(account_id)

on update cascade

on delete restrict,

解釋:on update cascade 即會隨著table_2中的id改變

on delete restrict 如果刪除乙個被table_1表應用的table_2中account_id為主鍵的行,將會阻止並報錯,這個是預設的。

同時常用的還有 set default 同上情況,只不過不會阻止,而是將該值設為預設

技巧:set key=nullif(key,value)//當傳入的鍵和值相等時返回空

5.元資料**

現象:我有一張客戶表,記錄客戶業務資訊,他每一年都要更新列或表來儲存新的資訊。

問題:資料量的增加讓管理和查詢變得十分低效

解決方案:利用資料庫特性拆分表;

create table bugs(

bug_id serial primary ,

//other columns

date_reported date

)partition by hash (year(date_reported))

partitions 4

//按年份自動分表,最大被設定為4張 當超過4年的資料出現 某一張表用來儲存多於一年的資料

6.取整作死

使用float進行運算會出現很多錯誤,建議使用numeric(精度,小數點後位數),盡可能不是用float。

7.新型別

先看乙個例子

create table bugs(

… status varchar(20) check(status in (「new」,」old」,」fixed」));

) mysql也支援enum

create table bugs(

… status enum(「new」,」old」,」fixed」);

) 使用上述方法可以很方便的從列舉中選值,但是

很難更新。

解決方法:在新錶中插入資料標明狀態,見第一條。

8.幽靈檔案

現象:使用檔案系統儲存了二進位制檔案等資訊

問題:不支援刪除(需要額外操作),不支援事務隔離,不支援回滾,不支援備份,不能有效控制許可權

解決方案:將特大檔案和不常用的檔案移動到檔案系統儲存,或者有充分信心可以再應用層控制檔案

否則,在必要的時候使用blob型別。

技巧:mysql中有個技巧可以直接把轉換成二進位制

update table

set image=load_file(「path」);

where….

當需要讀取的時候

select image into dumpfile 『path』 from table where….

這樣就把資料庫中的二進位制轉換成了檔案

在php中也可以直接讀出檔案:

《SQL反模式》讀後感

年前買了這本書,在家沒事看看,二百多頁,沒幾天就看完了。印象最深的就是這句 所謂專家,就是在乙個很小的領域裡把所有錯誤都犯過了的人 可以看出來作者自己確實犯了很多很多錯誤,所以書裡談論的問題是實際應用中遇到的真問題,只這一點,我覺得買這本書值了。其他優點就不說了,沒那個談一件事之前先來一大段吹捧的習...

SQL反模式(二 單純的樹)

1 最常用來儲存樹的結構,儲存上級節點id 屬於一種反模式 2 使用鄰接表來維護樹 使用這種反模式來維護樹,一些操作是非常方便,比如增加葉子節點,修改乙個節點和一顆子樹的位置,然而從一棵樹中刪除乙個節點會變得比較複雜,比如刪除一顆子樹,你不得不執行多次查詢來找到所有的後代節點,然後逐個從最低級別開始...

SQL反模式筆記18 使用 查詢

目標 減少輸入 反模式 使用 缺點1 傳輸的資料量大。解決方案 明確列出列名 這一章內容太簡單了,好像沒啥可說的。我想起用ibatis的時候遇到的乙個問題 最初的sql都是自動生成的,比如根據id update某個表,輸入引數是這個表對應的乙個entity,包含了這個表幾乎所有的字段。這樣使用的時候...