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,包含了這個表幾乎所有的字段。這樣使用的時候...