一谴分、命名風(fēng)格
【強(qiáng)制】類名使用 UpperCamelCase 風(fēng)格,必須遵從駝峰形式状土,但以下情形例外:DO / BO / DTO / VO / AO
正例:MarcoPolo / UserDO / XmlService / TcpUdpDeal / TaPromotion
反例:macroPolo / UserDo / XMLService / TCPUDPDeal / TAPromotion
【強(qiáng)制】方法名、參數(shù)名精算、成員變量、局部變量都統(tǒng)一使用 lowerCamelCase 風(fēng)格,必須遵從 駝峰形式搞动。
正例: localValue / getHttpMessage() / inputUserId
【強(qiáng)制】常量命名全部大寫躏精,單詞間用下劃線隔開,力求語義表達(dá)完整清楚鹦肿,不要嫌名字長(zhǎng)矗烛。
正例:MAX_STOCK_COUNT 反例:MAX_COUNT
【強(qiáng)制】抽象類命名使用 Abstract 或 Base 開頭;異常類命名使用 Exception 結(jié)尾箩溃;測(cè)試類命名以它要測(cè)試的類的名稱開始瞭吃,以 Test 結(jié)尾。
【強(qiáng)制】Model 類中布爾類型的變量涣旨,都不要加 is歪架,否則部分框架解析會(huì)引起序列化錯(cuò)誤。
反例:定義為基本數(shù)據(jù)類型 Boolean isDeleted霹陡;的屬性和蚪,它的方法也是 isDeleted(),RPC框架在反向解析的時(shí)候烹棉,“以為”對(duì)應(yīng)的屬性名稱是 deleted攒霹,導(dǎo)致屬性獲取不到,進(jìn)而拋出異常浆洗。
【強(qiáng)制】對(duì)于 Service 和 DAO 類催束,基于 SOA 的理念,暴露出來的服務(wù)一定是接口伏社,內(nèi)部的實(shí)現(xiàn)類用 Impl 的后綴與接口區(qū)別抠刺。 正例:CacheManagerImpl 實(shí)現(xiàn) CacheManager 接口。
【推薦】為了達(dá)到代碼自解釋的目標(biāo)洛口,任何自定義編程元素在命名時(shí)矫付,使用盡量完整的單詞組合來表達(dá)其意。
正例:從遠(yuǎn)程倉(cāng)庫(kù)拉取代碼的類命名為PullCodeFromRemoteRepository
反例:變量int a;的隨意命名方式第焰。
【推薦】接口類中的方法和屬性不要加任何修飾符號(hào)(public 也不要加)买优,保持代碼的簡(jiǎn)潔 性,并加上有效 的Javadoc 注釋挺举。盡量不要在接口里定義變量杀赢,如果一定要定義變量,肯定是 與接口方法相關(guān)湘纵,并且是整個(gè)應(yīng)用的基礎(chǔ)常量脂崔。
正例:接口方法簽名:void f(); 接口基礎(chǔ)常量表示:String COMPANY = "alibaba";
反例:接口方法定義:public abstract void f();
說明:JDK8 中接口允許有默認(rèn)實(shí)現(xiàn),那么這個(gè)default方法梧喷,是對(duì)所有實(shí)現(xiàn)類都有價(jià)值的默 認(rèn)實(shí)現(xiàn)砌左。
【參考】枚舉類名建議帶上 Enum 后綴脖咐,枚舉成員名稱需要全大寫,單詞間用下劃線隔開汇歹。
說明:枚舉其實(shí)就是特殊的常量類屁擅,且構(gòu)造方法被默認(rèn)強(qiáng)制是私有。
正例:枚舉名字為 ProcessStatusEnum 的成員名稱:SUCCESS / UNKOWN_REASON产弹。
【參考】各層命名規(guī)約:
A) Service/DAO 層方法命名規(guī)約
1) 獲取單個(gè)對(duì)象的方法用 get 做前綴派歌。
2) 獲取多個(gè)對(duì)象的方法用 list 做前綴。
3) 獲取統(tǒng)計(jì)值的方法用 count 做前綴痰哨。
4) 插入的方法用 save/insert 做前綴胶果。
5) 刪除的方法用 remove/delete 做前綴。
6) 修改的方法用 update 做前綴斤斧。
二早抠、變量定義
【推薦】不要使用一個(gè)常量類維護(hù)所有常量,按常量功能進(jìn)行歸類折欠,分開維護(hù)贝或。 說明:大而全的常量類,非得使用查找功能才能定位到修改的常量锐秦,不利于理解和維護(hù)咪奖。
正例:緩存相關(guān)常量放在類 CacheConsts 下;系統(tǒng)配置相關(guān)常量放在類 ConfigConsts 下酱床。
三羊赵、代碼格式
【強(qiáng)制】大括號(hào)的使用約定。如果是大括號(hào)內(nèi)為空扇谣,則簡(jiǎn)潔地寫成{}即可昧捷,不需要換行;如果 是非空代碼塊則:
1) 左大括號(hào)前不換行罐寨。
2) 左大括號(hào)后換行靡挥。
3) 右大括號(hào)前換行。
4) 右大括號(hào)后還有 else 等代碼則不換行 表示終止的右大括號(hào)后必須換行鸯绿。
【強(qiáng)制】 左小括號(hào)和字符之間不出現(xiàn)空格跋破;同樣,右小括號(hào)和字符之間也不出現(xiàn)空格瓶蝴。
反例:if (空格a == b空格)
【強(qiáng)制】if/for/while/switch/do 等保留字與括號(hào)之間都必須加空格毒返。
【強(qiáng)制】任何二目、三目運(yùn)算符的左右兩邊都需要加一個(gè)空格舷手。
說明:運(yùn)算符包括賦值運(yùn)算符=拧簸、邏輯運(yùn)算符&&、加減乘除符號(hào)等男窟。
【強(qiáng)制】采用 4 個(gè)空格縮進(jìn)盆赤,禁止使用 tab 字符贾富。
說明:Vue工程采用2個(gè)空格縮進(jìn)
【強(qiáng)制】注釋的雙斜線與注釋內(nèi)容之間有且僅有一個(gè)空格。
正例:// 注釋內(nèi)容弟劲,注意在//和注釋內(nèi)容之間有一個(gè)空格祷安。
【強(qiáng)制】方法參數(shù)在定義和傳入時(shí),多個(gè)參數(shù)逗號(hào)后邊必須加空格兔乞。
正例:下例中實(shí)參的"a",后邊必須要有一個(gè)空格。method("a", "b", "c");
【強(qiáng)制】IDE 的 text file encoding 設(shè)置為 UTF-8; IDE 中文件的換行符使用 Unix 格式凉唐,不要使用 Windows 格式庸追。
【推薦】方法體內(nèi)的執(zhí)行語句組、變量的定義語句組台囱、不同的業(yè)務(wù)邏輯之間或者不同的語義之間插入一個(gè)空行淡溯。相同業(yè)務(wù)邏輯和語義之間不需要插入空行。
說明:沒有必要插入多個(gè)空行進(jìn)行隔開簿训。
四咱娶、OOP規(guī)約
【強(qiáng)制】所有的覆寫方法,必須加@Override 注解强品。
【強(qiáng)制】不能使用過時(shí)的類或方法膘侮。
【強(qiáng)制】Object 的 equals 方法容易拋空指針異常,應(yīng)使用常量或確定有值的對(duì)象來調(diào)用 equals的榛。
正例:"test".equals(object);
反例:object.equals("test");
【強(qiáng)制】所有的相同類型的包裝類對(duì)象之間值的比較琼了,全部使用 equals 方法比較。
說明:對(duì)于 Integer var = ? 在-128 至 127 范圍內(nèi)的賦值夫晌,Integer 對(duì)象是在IntegerCache.cache 產(chǎn)生雕薪,會(huì)復(fù)用已有對(duì)象,這個(gè)區(qū)間內(nèi)的 Integer 值可以直接使用==進(jìn)行判斷晓淀,但是這個(gè)區(qū)間之外的所有數(shù)據(jù)所袁,都會(huì)在堆上產(chǎn)生,并不會(huì)復(fù)用已有對(duì)象凶掰,這是一個(gè)大坑燥爷, 推薦使用 equals 方法進(jìn)行判斷。
【強(qiáng)制】RPC 方法的返回值和參數(shù)必須使用包裝數(shù)據(jù)類型锄俄。
【強(qiáng)制】構(gòu)造方法里面禁止加入任何業(yè)務(wù)邏輯局劲,如果有初始化邏輯,請(qǐng)放在 init 方法中奶赠。
【推薦】當(dāng)一個(gè)類有多個(gè)構(gòu)造方法鱼填,或者多個(gè)同名方法,這些方法應(yīng)該按順序放置在一起毅戈, 便于閱讀苹丸。
【推薦】循環(huán)體內(nèi)愤惰,字符串的連接方式,使用 StringBuilder 的 append 方法進(jìn)行擴(kuò)展赘理。 說明:反編譯出的字節(jié)碼文件顯示每次循環(huán)都會(huì) new 出一個(gè) StringBuilder 對(duì)象宦言,然后進(jìn)行 append 操作,最后通過 toString 方法返回 String 對(duì)象商模,造成內(nèi)存資源浪費(fèi)奠旺。
反例:
String str = "start"; for (int i = 0; i < 100; i++) { str = str + "hello"; }
【推薦】慎用 Object 的 clone 方法來拷貝對(duì)象。 說明:對(duì)象的 clone 方法默認(rèn)是淺拷貝施流,若想實(shí)現(xiàn)深拷貝需要重寫 clone 方法實(shí)現(xiàn)屬性對(duì)象 的拷貝响疚。
五、集合處理
【強(qiáng)制】使用集合轉(zhuǎn)數(shù)組的方法瞪醋,必須使用集合的 toArray(T[] array)忿晕,傳入的是類型完全一樣的數(shù)組,大小就是 list.size()银受。
說明:使用 toArray 帶參方法践盼,入?yún)⒎峙涞臄?shù)組空間不夠大時(shí),toArray 方法內(nèi)部將重新分配 內(nèi)存空間宾巍,并返回新數(shù)組地址咕幻;如果數(shù)組元素大于實(shí)際所需,下標(biāo)為[ list.size() ]的數(shù)組 元素將被置為 null蜀漆,其它數(shù)組元素保持原值谅河,因此最好將方法入?yún)?shù)組大小定義與集合元素 個(gè)數(shù)一致。 正例:
List list = new ArrayList(2); list.add("guan"); list.add("bao"); String[] array = new String[list.size()]; array = list.toArray(array);
反例:直接使用 toArray 無參方法存在問題确丢,此方法返回值只能是 Object[]類绷耍,若強(qiáng)轉(zhuǎn)其它 類型數(shù)組將出現(xiàn) ClassCastException 錯(cuò)誤。
【強(qiáng)制】不要在 foreach 循環(huán)里進(jìn)行元素的 remove/add 操作鲜侥。remove 元素請(qǐng)使用 Iterator方式褂始,如果并發(fā)操作,需要對(duì) Iterator 對(duì)象加鎖描函。
正例:
Iterator iterator = list.iterator(); while (iterator.hasNext()) { String item = iterator.next(); if (刪除元素的條件) { iterator.remove(); } }
反例:
List list = new ArrayList(); list.add("1"); list.add("2"); for (String item : list) { if ("1".equals(item)) { list.remove(item); } }
【推薦】使用 entrySet 遍歷 Map 類集合 KV崎苗,而不是 keySet 方式進(jìn)行遍歷。
六舀寓、控制語句
【強(qiáng)制】在一個(gè) switch 塊內(nèi)胆数,每個(gè) case 要么通過 break/return 等來終止,要么注釋說明程序?qū)⒗^續(xù)執(zhí)行到哪一個(gè) case 為止互墓;在一個(gè) switch 塊內(nèi)必尼,都必須包含一個(gè) default 語句并且 放在最后,即使它什么代碼也沒有。
【強(qiáng)制】在 if/else/for/while/do 語句中必須使用大括號(hào)判莉。即使只有一行代碼豆挽,避 單行的編碼方式:if (condition) statements;
【推薦】除常用方法(如 getXxx/isXxx)等外,不要在條件判斷中執(zhí)行其它復(fù)雜的語句券盅,將復(fù) 雜邏輯判斷的結(jié)果賦值給一個(gè)有意義的布爾變量名帮哈,以提高可讀性。 說明:很多 if 語句內(nèi)的邏輯相當(dāng)復(fù)雜锰镀,閱讀者需要分析條件表達(dá)式的最終結(jié)果娘侍,才能明確什么 樣的條件執(zhí)行什么樣的語句,那么泳炉,如果閱讀者分析邏輯表達(dá)式錯(cuò)誤呢私蕾?
正例: // 偽代碼如下
final boolean existed = (file.open(fileName, "w") != null) && (...) || (...); if (existed) { ... }
反例:
if ((file.open(fileName, "w") != null) && (...) || (...)) { ... }
【推薦】循環(huán)體中的語句要考量性能,以下操作盡量移至循環(huán)體外處理胡桃,如定義對(duì)象、變量磕潮、 獲取數(shù)據(jù)庫(kù)連接翠胰,進(jìn)行不必要的 try-catch 操作(這個(gè) try-catch 是否可以移至循環(huán)體外)。
【參考】下列情形自脯,需要進(jìn)行參數(shù)校驗(yàn):
1) 調(diào)用頻次低的方法之景。
2) 執(zhí)行時(shí)間開銷很大的方法。此情形中膏潮,參數(shù)校驗(yàn)時(shí)間幾乎可以忽略不計(jì)锻狗,但如果因?yàn)閰?數(shù)錯(cuò)誤導(dǎo)致中間執(zhí)行回退,或者錯(cuò)誤焕参,那得不償失轻纪。
3) 需要極高穩(wěn)定性和可用性的方法。
4) 對(duì)外提供的開放接口叠纷,不管是 RPC/API/HTTP 接口刻帚。 5) 敏感權(quán)限入口。
七涩嚣、注釋規(guī)約
【強(qiáng)制】類崇众、類屬性、類方法的注釋必須使用 Javadoc 規(guī)范航厚,使用/**內(nèi)容*/ 格式顷歌,不得使用 // xxx 方式。
【強(qiáng)制】所有的抽象方法(包括接口中的方法)必須要用 Javadoc 注釋幔睬、除了返回值眯漩、參數(shù)、 異常說明外溪窒,還必須指出該方法做什么事情坤塞,實(shí)現(xiàn)什么功能冯勉。 說明:對(duì)子類的實(shí)現(xiàn)要求,或者調(diào)用注意事項(xiàng)摹芙,請(qǐng)一并說明灼狰。
【強(qiáng)制】所有的類都必須添加創(chuàng)建者和創(chuàng)建日期。
【強(qiáng)制】方法內(nèi)部單行注釋浮禾,在被注釋語句上方另起一行交胚,使用//注釋。方法內(nèi)部多行注釋 使用/* */注釋盈电,注意與代碼對(duì)齊蝴簇。
【強(qiáng)制】所有的枚舉類型字段必須要有注釋,說明每個(gè)數(shù)據(jù)項(xiàng)的用途匆帚。
【推薦】代碼修改的同時(shí)熬词,注釋也要進(jìn)行相應(yīng)的修改,尤其是參數(shù)吸重、返回值互拾、異常、核心邏輯 等的修改嚎幸。 說明:代碼與注釋更新不同步颜矿,就像路網(wǎng)與導(dǎo)航軟件更新不同步一樣,如果導(dǎo)航軟件嚴(yán)重滯后嫉晶, 就失去了導(dǎo)航的意義骑疆。
【參考】謹(jǐn)慎注釋掉代碼。在上方詳細(xì)說明替废,而不是簡(jiǎn)單地注釋掉箍铭。如果無用,則刪除舶担。
【參考】對(duì)于注釋的要求:第一坡疼、能夠準(zhǔn)確反應(yīng)設(shè)計(jì)思想和代碼邏輯;第二衣陶、能夠描述業(yè)務(wù)含 義柄瑰,使別的程序員能夠迅速了解到代碼背后的信息。完全沒有注釋的大段代碼對(duì)于閱讀者形同 天書剪况,注釋是給自己看的教沾,即使隔很長(zhǎng)時(shí)間,也能清晰理解當(dāng)時(shí)的思路译断;注釋也是給繼任者看 的授翻,使其能夠快速接替自己的工作。
【參考】好的命名、代碼結(jié)構(gòu)是自解釋的堪唐,注釋力求精簡(jiǎn)準(zhǔn)確巡语、表達(dá)到位。避免出現(xiàn)注釋的 一個(gè)極端:過多過濫的注釋淮菠,代碼的邏輯一旦修改男公,修改注釋是相當(dāng)大的負(fù)擔(dān)。
【參考】特殊注釋標(biāo)記合陵,請(qǐng)注明標(biāo)記人與標(biāo)記時(shí)間枢赔。注意及時(shí)處理這些標(biāo)記,通過標(biāo)記掃描拥知, 經(jīng)常清理此類標(biāo)記踏拜。線上故障有時(shí)候就是來源于這些標(biāo)記處的代碼。
1) 待辦事宜(TODO):( 標(biāo)記人低剔,標(biāo)記時(shí)間速梗,[預(yù)計(jì)處理時(shí)間]) 表示需要實(shí)現(xiàn),但目前還未實(shí)現(xiàn)的功能襟齿。這實(shí)際上是一個(gè) Javadoc 的標(biāo)簽镀琉,目前的 Javadoc 還沒有實(shí)現(xiàn),但已經(jīng)被廣泛使用蕊唐。只能應(yīng)用于類,接口和方法(因?yàn)樗且粋€(gè) Javadoc 標(biāo)簽)烁设。
2) 錯(cuò)誤替梨,不能工作(FIXME):(標(biāo)記人,標(biāo)記時(shí)間装黑,[預(yù)計(jì)處理時(shí)間]) 在注釋中用 FIXME 標(biāo)記某代碼是錯(cuò)誤的副瀑,而且不能工作,需要及時(shí)糾正的情況恋谭。
八糠睡、其他
【強(qiáng)制】在使用正則表達(dá)式時(shí),利用好其預(yù)編譯功能疚颊,可以有效加快正則匹配速度狈孔。 說明:不要在方法體內(nèi)定義:Pattern pattern = Pattern.compile(規(guī)則);
【強(qiáng)制】注意 Math.random() 這個(gè)方法返回是 double 類型,注意取值的范圍 0≤x<1(能夠 取到零值材义,注意除零異常)均抽,如果想獲取整數(shù)類型的隨機(jī)數(shù),不要將 x 放大 10 的若干倍然后 取整其掂,直接使用 Random 對(duì)象的 nextInt 或者 nextLong 方法油挥。
【強(qiáng)制】獲取當(dāng)前毫秒數(shù) System.currentTimeMillis(); 而不是 new Date().getTime();
【推薦】任何數(shù)據(jù)結(jié)構(gòu)的構(gòu)造或初始化,都應(yīng)指定大小,避免數(shù)據(jù)結(jié)構(gòu)無限增長(zhǎng)吃光內(nèi)存深寥。
九攘乒、異常處理
【強(qiáng)制】捕獲異常是為了處理它,不要捕獲了卻什么都不處理而拋棄之惋鹅,如果不想處理它则酝,請(qǐng) 將該異常拋給它的調(diào)用者。最外層的業(yè)務(wù)使用者负饲,必須處理異常堤魁,將其轉(zhuǎn)化為用戶可以理解的 內(nèi)容。
十返十、MySQL數(shù)據(jù)庫(kù)
建立表規(guī)約
【強(qiáng)制】表名妥泉、字段名必須使用小寫字母或數(shù)字,禁止出現(xiàn)數(shù)字開頭洞坑,禁止兩個(gè)下劃線中間只 出現(xiàn)數(shù)字盲链。數(shù)據(jù)庫(kù)字段名的修改代價(jià)很大,因?yàn)闊o法進(jìn)行預(yù)發(fā)布迟杂,所以字段名稱需要慎重考慮刽沾。
說明:MySQL 在 Windows 下不區(qū)分大小寫,但在 Linux 下默認(rèn)是區(qū)分大小寫排拷。因此侧漓,數(shù)據(jù)庫(kù) 名、表名监氢、字段名布蔗,都不允許出現(xiàn)任何大寫字母,避免節(jié)外生枝浪腐。
正例:aliyun_admin纵揍,rdc_config,level3_name 反例:AliyunAdmin议街,rdcConfig泽谨,level_3_name
【強(qiáng)制】禁用保留字,如 desc特漩、range吧雹、match、delayed 等涂身,請(qǐng)參考 MySQL 官方保留字吮炕。
【強(qiáng)制】主鍵索引名為 pk_字段名;唯一索引名為 uk_字段名访得;普通索引名則為 idx_字段名龙亲。 說明:pk_ 即 primary key陕凹;uk_ 即 unique key;idx_ 即 index 的簡(jiǎn)稱鳄炉。
【強(qiáng)制】小數(shù)類型為 decimal杜耙,禁止使用 float 和 double。
【強(qiáng)制】如果存儲(chǔ)的字符串長(zhǎng)度幾乎相等拂盯,使用 char 定長(zhǎng)字符串類型佑女。
【強(qiáng)制】varchar 是可變長(zhǎng)字符串,不預(yù)先分配存儲(chǔ)空間谈竿,長(zhǎng)度不要超過 5000团驱,如果存儲(chǔ)長(zhǎng)度大于此值,定義字段類型為 text空凸。
【強(qiáng)制】表必備三個(gè)字段:id嚎花,create_time, update_time, delete_flag
【強(qiáng)制】對(duì)于Boolean型的字段,采用decimal類型
【強(qiáng)制】表和字段都需要添加注釋信息呀洲。
【推薦】單表行數(shù)超過 500 萬行或者單表容量超過 2GB紊选,才推薦進(jìn)行分庫(kù)分表。 說明:如果預(yù)計(jì)三年后的數(shù)據(jù)量根本達(dá)不到這個(gè)級(jí)別道逗,請(qǐng)不要在創(chuàng)建表時(shí)就分庫(kù)分表兵罢。
【參考】合適的字符存儲(chǔ)長(zhǎng)度,不但節(jié)約數(shù)據(jù)庫(kù)表空間滓窍、節(jié)約索引存儲(chǔ)卖词,更重要的是提升檢 索速度。
十一吏夯、索引規(guī)約
【強(qiáng)制】業(yè)務(wù)上具有唯一特性的字段坏平,即使是多個(gè)字段的組合,也必須建成唯一索引锦亦。
說明:不要以為唯一索引影響了 insert 速度,這個(gè)速度損耗可以忽略令境,但提高查找速度是明 顯的杠园;另外,即使在應(yīng)用層做了非常完善的校驗(yàn)控制舔庶,只要沒有唯一索引抛蚁,根據(jù)墨菲定律,必 然有臟數(shù)據(jù)產(chǎn)生惕橙。
【強(qiáng)制】超過三個(gè)表禁止 join瞧甩。需要 join 的字段,數(shù)據(jù)類型必須絕對(duì)一致弥鹦;多表關(guān)聯(lián)查詢時(shí)肚逸, 保證被關(guān)聯(lián)的字段需要有索引。
說明:即使雙表 join 也要注意表索引、SQL 性能嘉赎。
【強(qiáng)制】在 varchar 字段上建立索引時(shí)米辐,必須指定索引長(zhǎng)度,沒必要對(duì)全字段建立索引务冕,根據(jù) 實(shí)際文本區(qū)分度決定索引長(zhǎng)度即可血当。
說明:索引的長(zhǎng)度與區(qū)分度是一對(duì)矛盾體,一般對(duì)字符串類型數(shù)據(jù)禀忆,長(zhǎng)度為 20 的索引臊旭,區(qū)分度會(huì)高達(dá) 90%以上,可以使用 count(distinct left(列名, 索引長(zhǎng)度))/count(*)的區(qū)分度 來確定箩退。
【參考】創(chuàng)建索引時(shí)避免有如下極端誤解:
1)寧濫勿缺离熏。認(rèn)為一個(gè)查詢就需要建一個(gè)索引。
2)寧缺勿濫乏德。認(rèn)為索引會(huì)消耗空間撤奸、嚴(yán)重拖慢更新和新增速度。
3)抵制惟一索引喊括。認(rèn)為業(yè)務(wù)的惟一性一律需要在應(yīng)用層通過“先查后插”方式解決胧瓜。
十二、SQL語句
【強(qiáng)制】不要使用 count(列名)或 count(常量)來替代 count(*)郑什,count(*)是 SQL92 定義的 標(biāo)準(zhǔn)統(tǒng)計(jì)行數(shù)的語法府喳,跟數(shù)據(jù)庫(kù)無關(guān),跟 NULL 和非 NULL 無關(guān)蘑拯。
說明:count(*)會(huì)統(tǒng)計(jì)值為 NULL 的行钝满,而 count(列名)不會(huì)統(tǒng)計(jì)此列為 NULL 值的行。
【強(qiáng)制】count(distinct col) 計(jì)算該列除 NULL 之外的不重復(fù)行數(shù)申窘,注意 count(di col1, col2) 如果其中一列全為 NULL弯蚜,那么即使另一列有不同的值,也返回為 0剃法。
【強(qiáng)制】當(dāng)某一列的值全是 NULL 時(shí)碎捺,count(col)的返回結(jié)果為 0,但 sum(col)的返回結(jié)果為NULL.
【強(qiáng)制】不得使用外鍵與級(jí)聯(lián)贷洲,一切外鍵概念必須在應(yīng)用層解決收厨。
【強(qiáng)制】禁止使用存儲(chǔ)過程,存儲(chǔ)過程難以調(diào)試和擴(kuò)展优构,更沒有移植性诵叁。
【推薦】in 操作能避免則避免,若實(shí)在避免不了钦椭,需要仔細(xì)評(píng)估 in 后邊的集合元素?cái)?shù)量拧额,控 制在 1000 個(gè)之內(nèi)碑诉。
【參考】如果有全球化需要,所有的字符存儲(chǔ)與表示势腮,均以 utf-8 編碼联贩,注意字符 的區(qū)別。
說明: SELECT LENGTH("輕松工作")捎拯; 返回為 12 SELECT CHARACTER_LENGTH("輕松工作")泪幌; 返回為 4 如果需要存儲(chǔ)表情,那么選擇 utfmb4 來進(jìn)行存儲(chǔ)署照,注意它與 -8 編碼的區(qū)別祸泪。
【強(qiáng)制】更新數(shù)據(jù)表記錄時(shí),必須同時(shí)更新記錄對(duì)應(yīng)的 update_time 字段值為當(dāng)前時(shí)間建芙。
【參考】@Transactional 事務(wù)不要濫用没隘。事務(wù)會(huì)影響數(shù)據(jù)庫(kù)的 QPS,另外使用事務(wù)的地方需 要考慮各方面的回滾方案禁荸,包括緩存回滾右蒲、搜索引擎回滾、消息補(bǔ)償赶熟、統(tǒng)計(jì)修正等瑰妄。
轉(zhuǎn)載地址:https://blog.csdn.net/qq_41534566/article/details/80030808