(一)建表規(guī)約
1.【強(qiáng)制】在編寫(xiě)建表語(yǔ)句時(shí)筏养,需同時(shí)考慮回滾、以及必要的初始化語(yǔ)句;生產(chǎn)環(huán)境變更表或數(shù)據(jù)時(shí)須提供變更和回滾sql文件捞蛋。
? ? ??說(shuō)明: 以"項(xiàng)目名_版本號(hào)_Create.DDL"吠撮、"項(xiàng)目名_版本號(hào)_RollBack.DDL尊惰、"項(xiàng)目名_版本號(hào)_InitData.DML",
? ? ? ? ? ? ? ? ? 分別表示創(chuàng)建泥兰、回滾弄屡、初始化數(shù)據(jù)的sql文件放在項(xiàng)目工程的對(duì)應(yīng)文件夾中。
2.【強(qiáng)制】數(shù)據(jù)庫(kù)版本統(tǒng)一為MySQL5.6鞋诗,引擎統(tǒng)一使用InnoDB膀捷。
3.【強(qiáng)制】庫(kù)名、表名削彬、字段命名全庸,必須使用小寫(xiě)字母或數(shù)字組成,庫(kù)名應(yīng)與應(yīng)用名稱(chēng)一致融痛、表或字段名以英文單詞加"_"
? ? ?? ? ? ? ? ??表示其用途/目標(biāo)/意義來(lái)命名壶笼,表名、字段名不超過(guò)32個(gè)字符雁刷、表字段數(shù)量不超過(guò)35個(gè)覆劈。
? ? ? ? ? ? ? ? ?正例:poseidon(庫(kù)名)、send_task(表名),send_task_logs_201710(表名)墩崩、user_login_name(字段名)
4.【強(qiáng)制】主鍵索引名為 pk_字段名氓英、唯一索引名為 uk_字段名、普通索引名則為 idx_字段名鹦筹,索引數(shù)量不超過(guò)5個(gè)铝阐。
? ? ??說(shuō)明:pk_ 即 primary key;uk_ 即 unique key铐拐;idx_ 即 index 的簡(jiǎn)稱(chēng)
5.【強(qiáng)制】表達(dá)是與否概念的字段徘键,必須使用 is_xxx 的方式命名,數(shù)據(jù)類(lèi)型是 unsigned tinyint( 1 表示是遍蟋,0 表示否)吹害。
? ? ??說(shuō)明:任何字段如果為非負(fù)數(shù),必須是 unsigned虚青。
? ? ??正例:表達(dá)邏輯刪除的字段名 is_deleted它呀,1 表示刪除,0 表示未刪除棒厘。
6.【參考】業(yè)務(wù)數(shù)據(jù)需要進(jìn)行簡(jiǎn)單的歸類(lèi)纵穿,但相對(duì)要支持靈活變化,應(yīng)使用數(shù)據(jù)字典表或通過(guò)統(tǒng)一服務(wù)的形式獲取奢人,
? ? ? ? ? ? ? ? ?禁止通過(guò)distinct語(yǔ)句在業(yè)務(wù)數(shù)據(jù)表去重獲取,禁止將歸類(lèi)寫(xiě)死在業(yè)務(wù)處理類(lèi)和方法中谓媒。
7.【強(qiáng)制】合適的字符存儲(chǔ)長(zhǎng)度,不但節(jié)約數(shù)據(jù)庫(kù)表空間何乎、節(jié)約索引存儲(chǔ)句惯,更重要的是提升檢索速度。
? ? ?說(shuō)明:設(shè)計(jì)時(shí)盡量使用少的空間存儲(chǔ)字段支救,如能用int的就不用char或者varchar抢野、能用tinyint的就不用int 、
? ? ? 能用varchar(20)的就不用varchar(255)各墨。
8.【推薦】關(guān)于char蒙保、varchar、text應(yīng)根據(jù)是否定長(zhǎng)欲主、最大支持長(zhǎng)度邓厕、效率等因素合理選擇類(lèi)型,建議為:
? ? ? ? ? ? ? 1)?經(jīng)常變化的字段用varchar
? ? ? ? ? ? ? 2)?知道固定長(zhǎng)度的用char
? ? ? ? ? ? ? 3)?盡量用varchar
? ? ? ? ? ? ? 4)?超過(guò)255字節(jié)的只能用varchar或者text
? ? ? ? ? ? ? 5)?能用varchar的地方不用text
? ? ? ? ? ? ? 6) 如超長(zhǎng)(如5000)定義字段類(lèi)型為 text扁瓢,獨(dú)立出來(lái)一張表详恼,用主鍵來(lái)對(duì)應(yīng),避免影響其它字段執(zhí)引效率引几。
9.【禁止】禁用保留字昧互,如 desc挽铁、range、match敞掘、delayed 等叽掘,請(qǐng)參考?MySQL 官方保留字。
10.【禁止】小數(shù)類(lèi)型為 decimal玖雁,禁止使用 float 和 double更扁。
? ? ? ??說(shuō)明:float 和 double 在存儲(chǔ)的時(shí)候,存在精度損失的問(wèn)題赫冬,很可能在值的比較時(shí)浓镜,得到不
? ? ? ? ? ? ? ? ? ?正確的結(jié)果。如果存儲(chǔ)的數(shù)據(jù)范圍超過(guò) decimal 的范圍劲厌,建議將數(shù)據(jù)拆成整數(shù)和小數(shù)分開(kāi)存儲(chǔ)膛薛。
11.【強(qiáng)制】表必備三字段:id, create_time, modified_time。
? ? ? ? ?說(shuō)明:其中 id 必為主鍵补鼻。create_time表示主動(dòng)創(chuàng)建,?modified_time過(guò)去分詞表示被動(dòng)更新哄啄。
12.【強(qiáng)制】時(shí)間格式統(tǒng)一用yyyy-MM-dd HH:mm:ss.fff,精準(zhǔn)到毫秒风范;存儲(chǔ)增淹、傳輸統(tǒng)一用北京時(shí)間,
? ? ? ? ??如有其它時(shí)區(qū)時(shí)間(如下單乌企、付款等時(shí)間)保留原始時(shí)間、轉(zhuǎn)換的原則為誰(shuí)用誰(shuí)轉(zhuǎn)換成玫。
13.【推薦】字段允許適當(dāng)冗余加酵,以提高查詢(xún)性能,但必須考慮數(shù)據(jù)一致哭当。冗余字段應(yīng)遵循:
? ? ? ? ? ? ? ? ? ?1)不是頻繁修改的字段猪腕。
? ? ? ? ? ? ? ? ? ?2)不是 varchar 超長(zhǎng)字段,更不能是 text 字段钦勘。
? ? ? ?正例:商品類(lèi)目名稱(chēng)使用頻率高陋葡,字段長(zhǎng)度短,名稱(chēng)基本一成不變彻采,可在相關(guān)聯(lián)的表中冗余存
? ? ? ? ? ? ? ? ? 儲(chǔ)類(lèi)目名稱(chēng)腐缤,避免關(guān)聯(lián)查詢(xún)。
14.【推薦】單表行數(shù)超過(guò) 100 萬(wàn)行或者單表容量超過(guò) 1GB肛响,才推薦進(jìn)行分庫(kù)分表分區(qū)岭粤。
? ? ? ? ?說(shuō)明:如果預(yù)計(jì)三年后的數(shù)據(jù)量根本達(dá)不到這個(gè)級(jí)別,請(qǐng)不要在創(chuàng)建表時(shí)就分庫(kù)分表分區(qū)特笋。
15.【強(qiáng)制】表剃浇、字段注釋(COMMENT)需遵守以下注釋約束,如有修改字段含義或?qū)ψ侄伪硎镜臓顟B(tài)追加時(shí),
? ? ? ? ? ? ? ? ? ? 需要及時(shí)更新字段注釋以及《數(shù)據(jù)庫(kù)設(shè)計(jì)說(shuō)明書(shū)》虎囚,注釋格式參考:
? ? ? ? ? ? ? ? ? 1)? 表/視圖注釋格式為:用途|負(fù)責(zé)人|創(chuàng)建日期 角塑,如:記錄用戶(hù)身份證號(hào)碼|張三|2017-12-28
? ? ? ? ? ? ? ? ? 2)? 字段注釋格式為:用途|說(shuō)明 , 如:記錄用戶(hù)性別|1男淘讥,2女圃伶,3未知(李四 2017-12-28 新增)
? ? ? ? ? ? ? ? ? 3)? 關(guān)聯(lián)字段來(lái)源需要說(shuō)明,來(lái)自哪張表的那個(gè)字段适揉,如:取自eload_user.user_id
16.【禁止】禁止定義枚舉類(lèi)型的表留攒;因?yàn)樵谑褂胏anal內(nèi)核的產(chǎn)品無(wú)法拉到數(shù)據(jù)
17.【強(qiáng)制】字符類(lèi)型的存儲(chǔ)禁止用null,用""代替嫉嘀;如有將字段和值拼接成字符串存儲(chǔ)的需要炼邀,統(tǒng)一先轉(zhuǎn)json格式存儲(chǔ)。
(二)索引規(guī)范
1.【推薦】ID剪侮、關(guān)聯(lián)字段拭宁、業(yè)務(wù)外鍵、create_time 字段推薦建索引瓣俯,在選擇性高的字段創(chuàng)建索引杰标,注意組合索引的順序,
? ? ? ? ? ? ? ? ?利用索引的最左原則彩匕,使用復(fù)合索引腔剂,而不是添加新的索引、避免冗余索引驼仪。
? ? ? ? ? ? ? ? ?反例:idx_a_b_c(a,b,c)掸犬、idx_a(a)、idx_a_b(a,b)
2.【推薦】業(yè)務(wù)上具有唯一特性的字段绪爸,且具有強(qiáng)唯一性要求湾碎。推薦建成唯一索引。
? ? ??說(shuō)明: 不要以為唯一索引影響了 insert 速度奠货,這個(gè)速度損耗可以忽略介褥,但提高查找速度是明顯的;
? ? ? ? ? ? ? ? ? 另外递惋,即使在應(yīng)用層做了非常完善的校驗(yàn)控制柔滔,只要沒(méi)有唯一索引,根據(jù)墨菲定律萍虽,必然有臟數(shù)據(jù)產(chǎn)生廊遍。
? ? ??示例:如身份證號(hào)碼,在業(yè)務(wù)層面已經(jīng)做了唯一性檢查贩挣,但在表設(shè)計(jì)時(shí)還是要加唯一索引約束喉前。
3.【推薦】原則上超過(guò)三個(gè)表禁止 join没酣,如超過(guò)三張以上表join須集體評(píng)審討論通過(guò)。需要 join 的字段卵迂,
? ? ? ? ? ? ? ? ?數(shù)據(jù)類(lèi)型必須絕對(duì)一致裕便;多表關(guān)聯(lián)查詢(xún)時(shí),保證被關(guān)聯(lián)的字段需要有索引见咒。
? ? ??說(shuō)明:即使雙表 join 也要注意表索引偿衰、SQL 性能。
4.【推薦】在 varchar 字段上建立索引時(shí)改览,建議指定索引長(zhǎng)度下翎,沒(méi)必要對(duì)全字段建立索引,根據(jù)
? ? ? ? ? ? ? ? ?實(shí)際文本區(qū)分度決定索引長(zhǎng)度即可宝当。
? ? ? ?說(shuō)明:索引的長(zhǎng)度與區(qū)分度是一對(duì)矛盾體视事,一般對(duì)字符串類(lèi)型數(shù)據(jù),長(zhǎng)度為 20 的索引庆揩,區(qū)分
? ? ? ? ? ? ? ? 度會(huì)高達(dá) 90%以上俐东,可以使用 count(distinct left(列名, 索引長(zhǎng)度))/count(*)的區(qū)分度來(lái)確定。
? ? ? ?示例:如varchar(1024)订晌,索引長(zhǎng)度為36時(shí)區(qū)分度就有?90%以上虏辫,就沒(méi)必須建立1024長(zhǎng)度的索引。
5.【強(qiáng)制】頁(yè)面搜索嚴(yán)禁左模糊或者全模糊锈拨,如果需要請(qǐng)走搜索引擎來(lái)解決砌庄。
? ? ? ?說(shuō)明:索引文件具有 B-Tree 的最左前綴匹配特性,如果左邊的值未確定奕枢,那么無(wú)法使用此索引娄昆。
6.【推薦】如果有 order by 的場(chǎng)景,請(qǐng)注意利用索引的有序性验辞。order by 最后的字段是組合
? ? ? ? ? ? ? ? ?索引的一部分,并且放在索引組合順序的最后喊衫,避免出現(xiàn) file_sort 的情況跌造,影響查詢(xún)性能。
? ? ? ? ? ? ? ? ?正例:where a=? and b=? order by c; 索引:a_b_c
? ? ? ? ? ? ? ? ?反例:索引中有范圍查找族购,那么索引有序性無(wú)法利用壳贪,如:WHERE a>10 ORDER BY b; 索引a_b 無(wú)法排序。
7. 【推薦】利用覆蓋索引來(lái)進(jìn)行查詢(xún)操作寝杖,避免回表违施。
? ? ? ?說(shuō)明:如果索引包含所有滿(mǎn)足查詢(xún)需要的數(shù)據(jù)的索引成為覆蓋索引(Covering Index),也就是平時(shí)所說(shuō)的不需要回表操作
? ? ? ?說(shuō)明:使用explain瑟幕,可以通過(guò)輸出的extra列來(lái)判斷磕蒲,對(duì)于一個(gè)索引覆蓋查詢(xún)留潦,顯示為using index,
? ? ? ? ? ? ? ? ??MySQL查詢(xún)優(yōu)化器在執(zhí)行查詢(xún)前會(huì)決定是否有索引覆蓋查詢(xún)
8. 【推薦】利用延遲關(guān)聯(lián)或者子查詢(xún)優(yōu)化超多分頁(yè)場(chǎng)景。
? ? ??說(shuō)明:MySQL 并不是跳過(guò) offset 行辣往,而是取 offset+N 行兔院,然后返回放棄前 offset 行,返回
? ? ? ? ? ? ? ? ?N 行站削,當(dāng) offset 特別大的時(shí)候坊萝,效率會(huì)非常的低下。
? ? ??正例:通過(guò)使用覆蓋索引查詢(xún)返回需要的主鍵,再根據(jù)主鍵關(guān)聯(lián)原表獲得需要的數(shù)據(jù)许起。
9. 【推薦】SQL 性能優(yōu)化的目標(biāo):至少要達(dá)到 range 級(jí)別十偶,要求是 ref 級(jí)別,如果可以是 consts最好园细。
? ? ??說(shuō)明: 以下列出的12種級(jí)別惦积,等級(jí)依次降低:
? ? ? 1)?system:系統(tǒng)表,表只有一行記錄珊肃。這是const表連接類(lèi)型的一個(gè)特例荣刑;
? ? ? 2)?const:?表中最多只有一行匹配的記錄。讀常量伦乔,由于只有一行記錄厉亏,優(yōu)化程序里該行記錄的字段值可以被當(dāng)作是一
? ? ? ? ? 個(gè)常量,僅在查詢(xún)開(kāi)始時(shí)讀取一次烈和。當(dāng)PRIMARY KEY或UNIQUE索引與常量進(jìn)行比較時(shí)會(huì)顯示const爱只,速度非常快招刹;
? ? ? 3)?eq_ref:類(lèi)似const恬试,const比較的是常量,eq_ref是同另一張表中的字段關(guān)聯(lián)比較疯暑,這是最好的連接類(lèi)型训柴,
? ? ? ? ? ? ? ? eq_ref出現(xiàn)在PRIMARY KEY或UNIQUE類(lèi)型索引進(jìn)行”=”做比較時(shí)檢索字段,
? ? ? ? ? ? ? ? 比較的值可以是固定值或者是表達(dá)式妇拯,表達(dá)示中可以使用表里的字段幻馁;
? ? ? 4)?ref:查詢(xún)時(shí)的索引類(lèi)型不是PRIMARY KEY或UNIQUE類(lèi)型索引導(dǎo)致匹配到的行有多個(gè),或者僅能用到索引的
? ? ? ? ? ? ? ? 左前綴而非全部時(shí)的訪問(wèn)類(lèi)型越锈,ref可被用于基于索引字段進(jìn)行 - 或 <=> 操作仗嗦;
? ? ? 5)?ref_or_null:與ref的唯一區(qū)別就是在使用索引引用的查詢(xún)之外再增加一個(gè)空值的查詢(xún)。這種連接類(lèi)型類(lèi)似ref甘凭,
? ? ? ? ? ? ? ? 不同的是MySQL會(huì)在檢索的時(shí)候額外的搜索包含NULL值的記錄稀拐,它經(jīng)常用于子查詢(xún)。
? ? ? 6)?index_merge:查詢(xún)中同時(shí)使用兩個(gè)(或更多)索引丹弱,然后對(duì)索引結(jié)果進(jìn)行合并(merge)德撬,再讀取表數(shù)據(jù)铲咨;
? ? ? 7)?unique_subquery:?子查詢(xún)中的返回結(jié)果字段組合是主鍵或唯一約束。用于in比較操作符中的子查詢(xún)錦繡谷的
? ? ? ? ? ? ? ?“鍵值唯一”的訪問(wèn)類(lèi)型場(chǎng)景中砰逻,如value in (select primary_key from table where x = x)
? ? ? 8)?index_subquery:子查詢(xún)中的返回結(jié)果字段組合是一個(gè)索引(或索引組合)鸣驱,但不是一個(gè)主鍵或唯一索引,
? ? ? ? ? ? ? ? ?這種連接類(lèi)型類(lèi)似unique_subquery蝠咆。它用子查詢(xún)來(lái)代替IN踊东,不過(guò)它用于在子查詢(xún)中沒(méi)有唯一索引的情況下。
? ? ? 9)?range:索引范圍掃描 刚操。只有在給定范圍的記錄才會(huì)被取出來(lái)闸翅,利用索引來(lái)取得一條記錄,
? ? ? ? ? ? ? ? ?常見(jiàn)于between菊霜、<坚冀、>等的查詢(xún)
? ? ?10)?index:全索引掃描 。連接類(lèi)型跟ALL一樣鉴逞,不同的是它只掃描索引樹(shù)记某。它通常會(huì)比ALL快點(diǎn)
? ? ? ? ? ? ? ? ?因?yàn)樗饕募ǔ1葦?shù)據(jù)文件小。MySQL在查詢(xún)的字段只是單獨(dú)的索引的一部分的情況下使用這種連接類(lèi)型构捡;
? ? ?11)?fulltext:用于full text索引中用純文本匹配的方法來(lái)檢索記錄液南;
? ? ?12)?all:全表掃描。
10. 【強(qiáng)制】建組合索引的時(shí)候勾徽,區(qū)分度最高的在最左邊滑凉。
? ? ? ? ?正例:如果 where a=? and b=? ,a 列的幾乎接近于唯一值喘帚,那么只需要單建 idx_a 索引即可畅姊。
? ? ? ? ?說(shuō)明:存在非等號(hào)和等號(hào)混合判斷條件時(shí),在建索引時(shí)吹由,請(qǐng)把等號(hào)條件的列前置若未。如:where a>??
? ? ? ? ? ? ? ? ? ?and b=? 那么即使 a 的區(qū)分度更高,也必須把 b 放在索引的最前列倾鲫。
11. 【禁止】以下情況不走索引粗合,在編寫(xiě)sql或建索引時(shí)需慎重考慮:
? ? ? ? ? ? ? ? ?1) 條件字段選擇性弱,查出的結(jié)果集較大级乍,不走索引舌劳;
? ? ? ? ? ? ? ? ?2)?where條件等號(hào)兩邊字段類(lèi)型不同帚湘,不走索引玫荣;
? ? ? ? ? ? ? ? ?3)?優(yōu)化器分析的統(tǒng)計(jì)信息陳舊也可能導(dǎo)致不走索引;
? ? ? ? ? ? ? ? ?4)?索引字段 is null 不走索引大诸;
? ? ? ? ? ? ? ? ?5)?對(duì)于count(*)當(dāng)索引字段有not null約束時(shí)走索引捅厂,否則不走索引贯卦;
? ? ? ? ? ? ? ? ?6)?like 后面的字符當(dāng)首位為通配符時(shí)不走索引;
? ? ? ? ? ? ? ? ?7)?使用不等于操作符如:<>焙贷、!= 等不走索引撵割;
? ? ? ? ? ? ? ? ?8)?索引字段前加了函數(shù)或參加了運(yùn)算不走索引;
(三)SQL語(yǔ)句
1.【強(qiáng)制】重要的業(yè)務(wù)數(shù)據(jù)辙芍、配置數(shù)據(jù)等在做刪除處理時(shí)啡彬,推薦使用刪除標(biāo)記做邏輯刪除、不使用delete做物理刪除故硅;
? ? ? ? ? ? ? ? ?禁止update和delete語(yǔ)句后面沒(méi)有帶where條件庶灿。
2.【推薦】復(fù)雜的業(yè)務(wù)邏輯的判斷或操作,建議在業(yè)務(wù)代碼中分步驟拆分編寫(xiě)吃衅,如果一條sql寫(xiě)完往踢,
? ? ? ? ? ? ? ? ?會(huì)造成該sql語(yǔ)句過(guò)于復(fù)雜龐大,可讀性可維護(hù)性下變差徘层,性能一般也不會(huì)太高峻呕。
3.【強(qiáng)制】sql語(yǔ)句應(yīng)按照業(yè)務(wù)模塊等分文件統(tǒng)一寫(xiě)在xml或公用類(lèi)中,禁止sql語(yǔ)句與業(yè)務(wù)代碼混寫(xiě)在一起趣效。
4.【禁用】"<>"瘦癌、"!="、"not in"英支、"exsits"和"not exists"等反邏輯運(yùn)算符原則上禁用佩憾。
? ? ??說(shuō)明:"<>"、"!="干花、"not in"可用"="和"in"代替妄帘;"exsits"、"not exists"可用"等連接"和"外連接"
5.【推薦】關(guān)于or池凄、in抡驼、union all運(yùn)算符的選擇,建議同一字段肿仑,將or改寫(xiě)為in致盟,不同字段,將or改為union all
6.【強(qiáng)制】sql語(yǔ)句中的where子句中的每個(gè)條件的操作符兩邊類(lèi)型應(yīng)該相等尤慰,禁止?jié)撛诘臄?shù)據(jù)類(lèi)型做轉(zhuǎn)換馏锡。
7.【強(qiáng)制】不要使用 count(列名)或 count(常量)來(lái)替代 count(*),count(*)是 SQL92 定義的
? ? ? ? ? ? ? ? ?標(biāo)準(zhǔn)統(tǒng)計(jì)行數(shù)的語(yǔ)法伟端,跟數(shù)據(jù)庫(kù)無(wú)關(guān)杯道,跟 NULL 和非 NULL 無(wú)關(guān)。
? ? ?說(shuō)明:count(*)會(huì)統(tǒng)計(jì)值為 NULL 的行责蝠,而 count(列名)不會(huì)統(tǒng)計(jì)此列為 NULL 值的行党巾。
8.【強(qiáng)制】count(distinct col) 計(jì)算該列除 NULL 之外的不重復(fù)行數(shù)萎庭,注意 count(distinct
? ? ? ? ? ? ? ? ?col1, col2) 如果其中一列全為 NULL,那么即使另一列有不同的值齿拂,也返回為 0驳规。
9.【強(qiáng)制】當(dāng)某一列的值全是 NULL 時(shí),count(col)的返回結(jié)果為 0署海,但 sum(col)的返回結(jié)果為
? ? ? ? ? ? ? ? ?NULL吗购,因此使用 sum()時(shí)需注意 NPE 問(wèn)題。
? ? ??正例:可以使用如下方式來(lái)避免 sum 的 NPE 問(wèn)題:SELECT IF(ISNULL(SUM(g)),0,SUM(g))??FROM table;
10. 【強(qiáng)制】使用 ISNULL()來(lái)判斷是否為 NULL 值砸狞。
? ? ? ??說(shuō)明:? NULL 與任何值的直接比較都為 NULL巩搏。
? ? ? ? ? ? ? ? ? ? 1) NULL<>NULL 的返回結(jié)果是 NULL,而不是 false趾代。
? ? ? ? ? ? ? ? ? ? 2) NULL=NULL 的返回結(jié)果是 NULL贯底,而不是 true。
? ? ? ? ? ? ? ? ? ? 3) NULL<>1 的返回結(jié)果是 NULL撒强,而不是 true禽捆。
11.【強(qiáng)制】在代碼中寫(xiě)分頁(yè)查詢(xún)邏輯時(shí),若 count 為 0 應(yīng)直接返回飘哨,避免執(zhí)行后面的分頁(yè)語(yǔ)句胚想。
12.【禁止】不得使用外鍵與級(jí)聯(lián),一切外鍵概念必須在應(yīng)用層解決芽隆。
? ? ? ?說(shuō)明:以學(xué)生和成績(jī)的關(guān)系為例浊服,學(xué)生表中的 student_id是主鍵,那么成績(jī)表中的 student_id
? ? ? ? ? ? ? ? ? 則為外鍵胚吁。如果更新學(xué)生表中的 student_id牙躺,同時(shí)觸發(fā)成績(jī)表中的 student_id 更新,即為
? ? ? ? ? ? ? ? ? 級(jí)聯(lián)更新腕扶。外鍵與級(jí)聯(lián)更新適用于單機(jī)低并發(fā)孽拷,不適合分布式、高并發(fā)集群半抱;級(jí)聯(lián)更新是強(qiáng)阻
? ? ? ? ? ? ? ? ? 塞脓恕,存在數(shù)據(jù)庫(kù)更新風(fēng)暴的風(fēng)險(xiǎn);外鍵影響數(shù)據(jù)庫(kù)的插入速度窿侈。
13.【禁止】禁止使用存儲(chǔ)過(guò)程炼幔、觸發(fā)器、游標(biāo)史简,這些難以調(diào)試和擴(kuò)展乃秀,更沒(méi)有移植性。
14.【強(qiáng)制】數(shù)據(jù)訂正(特別是刪除、修改記錄操作)時(shí)环形,要先確認(rèn),避免出現(xiàn)誤刪除衙傀,確認(rèn)無(wú)誤才能執(zhí)行更新語(yǔ)句抬吟。?
? ? ? ??示例:如A、B兩個(gè)線(xiàn)程都讀取某條數(shù)據(jù)其中一個(gè)字段值(如1000)做加100操作统抬,A線(xiàn)程將值更新為1100火本,
? ? ? ? B線(xiàn)程如果不加判斷,結(jié)果也會(huì)更新也為1100聪建,正確的結(jié)果值應(yīng)為1200钙畔,可通過(guò)增加版本號(hào)等字段來(lái)控制。
15.【推薦】in 操作能避免則避免金麸,若實(shí)在避免不了擎析,需要仔細(xì)評(píng)估 in 后邊的集合元素?cái)?shù)量,控制在 1000 個(gè)之內(nèi)挥下。
16.【強(qiáng)制】數(shù)據(jù)庫(kù)編碼格式揍魂、所字符存儲(chǔ)與表示,均以 utf-8 編碼棚瘟,注意字符統(tǒng)計(jì)函數(shù)的區(qū)別现斋。
? ? ? ??說(shuō)明:?SELECT LENGTH("輕松工作"); 返回為 12
? ? ? ? ? ? ? ? ? ? SELECT CHARACTER_LENGTH("輕松工作")偎蘸; 返回為 4