面試官:想進(jìn)阿里,你卻連數(shù)據(jù)庫(kù)設(shè)計(jì)開發(fā)規(guī)范都不會(huì)?

1?數(shù)據(jù)庫(kù)命名約定

1.1 規(guī)則

(1) 命名富有意義英文詞匯,多個(gè)單詞組成的,中間以下劃線分割。

(2) 除數(shù)據(jù)庫(kù)名稱長(zhǎng)度為1-8個(gè)字符,其余為1-30個(gè)字符,dblink名稱也不要超過(guò)30個(gè)字符。

(3)命名只能使用英文字母,數(shù)字和下劃線,字母全部小寫

(4)避免使用Oracle的保留字如level、關(guān)鍵字如type。

1. 2系統(tǒng)模塊

1. 3業(yè)務(wù)功能

1. 4數(shù)據(jù)庫(kù)對(duì)象

2?SQL書寫方式

2.1 注釋

(1)注釋以中文為主。

(2)注釋盡可能詳細(xì)、全面,并且將注釋放在實(shí)現(xiàn)代碼的前面,不要集中放在對(duì)象的開始。

(3)每一數(shù)據(jù)對(duì)象的前面,應(yīng)具體描述該對(duì)象的功能和用途。傳入?yún)?shù)的含義應(yīng)該有所說(shuō)明。如果取值范 未確定,也應(yīng)該一并說(shuō)明。取值有特定含義的變量(如boolean類型變量和枚舉型變量),應(yīng)給出每個(gè)值的含義。

(4)注釋語(yǔ)法包含兩種情況:?jiǎn)涡凶⑨?、多行注?/p>

(5)注釋簡(jiǎn)潔,同時(shí)應(yīng)描述清晰。

注釋舉例:編寫函數(shù)、觸發(fā)器、存儲(chǔ)過(guò)程以及其他數(shù)據(jù)對(duì)象時(shí),必須為每個(gè)對(duì)象增加適當(dāng)注釋。該注釋以多行注釋為主,主要結(jié)構(gòu)如下(作者可以適當(dāng)增減):

2.1?排版

(1) 程序塊要采用縮進(jìn)風(fēng)格編寫,縮進(jìn)的空格可根據(jù)實(shí)際情況進(jìn)行調(diào)整,總的原則是使代碼清晰可讀。 示例:

(2)相對(duì)獨(dú)立的程序塊之間、變量說(shuō)明之后必須加空行。

(3)較長(zhǎng)的語(yǔ)句(>80字符)要分成多行書寫,長(zhǎng)表達(dá)式要在低優(yōu)先級(jí)操作符處劃分新行,操作符或關(guān)鍵字放在新行之首,劃分出的新行要進(jìn)行適當(dāng)?shù)目s進(jìn),使排版整齊,語(yǔ)句可讀。 示例:

(4) 循環(huán)、判斷等語(yǔ)句中若有較長(zhǎng)的表達(dá)式或語(yǔ)句,則要進(jìn)行適應(yīng)的劃分,長(zhǎng)表達(dá)式要在低優(yōu)先級(jí)操作符處劃分新行,操作符或關(guān)鍵字放在新行之首。 示例:

(5)若函數(shù)或過(guò)程中的參數(shù)較長(zhǎng),則要進(jìn)行適當(dāng)?shù)膭澐帧?示例:

(6)只使用空格鍵,不要使用TAB鍵。

說(shuō)明:以免用不同的編輯器閱讀程序時(shí),因TAB鍵所設(shè)置的空格數(shù)目不同而造成程序布局不整齊。例如:

2. 3事務(wù)處理

(1)事務(wù)是SQL語(yǔ)句的一個(gè)序列,對(duì)事務(wù)的改變通過(guò)COMMIT語(yǔ)句成為永久的變化,部分或全部事務(wù)可以由ROLLBACK語(yǔ)句撤消。任何一個(gè)事務(wù)在運(yùn)行過(guò)程中都要消耗一定的系統(tǒng)資源,如內(nèi)存、回滾空間、磁盤空間等。在開發(fā)數(shù)據(jù)庫(kù)應(yīng)用軟件的過(guò)程中,要注意正確估算相關(guān)事務(wù)的大小,對(duì)過(guò)大的事務(wù)操作采取必要的措施。

(2)明確事務(wù)的時(shí)間長(zhǎng)短,要求事務(wù)在該時(shí)間內(nèi)完成。

(3) 明確對(duì)事務(wù)的要求高低:如果對(duì)事務(wù)要求較高,對(duì)commit語(yǔ)句要判斷執(zhí)行是否正確,發(fā)現(xiàn)commit語(yǔ)句執(zhí)行不正確,進(jìn)行提示或記錄。如果對(duì)事務(wù)要求較低,對(duì)commit語(yǔ)句不要判斷執(zhí)行是否正確,因?yàn)閳?zhí)行不正確也沒(méi)有解決方法。對(duì)roolback都不用判斷。

(4) 明確事務(wù)書寫的規(guī)則:事務(wù)和存儲(chǔ)過(guò)程的關(guān)系:存儲(chǔ)過(guò)程中包含事務(wù),還是事務(wù)中包含存儲(chǔ)過(guò)程。同樣要明確:事務(wù)和中間件的關(guān)系、事務(wù)和函數(shù)的關(guān)系。

(5)明確是否使用事務(wù)嵌套:有的數(shù)據(jù)庫(kù)支持事務(wù)嵌套,有的數(shù)據(jù)庫(kù)不支持事務(wù)嵌套。在設(shè)計(jì)是要明確整個(gè)系統(tǒng)是否使用事務(wù)嵌套。

(6)某些復(fù)雜的事務(wù)提交需要同涉及文件系統(tǒng)的某過(guò)程同時(shí)提交,此時(shí),需要分析事務(wù)與過(guò)程的關(guān)系,決定提交的次序和錯(cuò)誤恢復(fù)的策略。

2.4?安全性設(shè)計(jì)

(1) 數(shù)據(jù)庫(kù)用戶一定要通過(guò)操作系統(tǒng),網(wǎng)絡(luò)服務(wù),或數(shù)據(jù)庫(kù)進(jìn)行身份確認(rèn)。

(2)如果用戶是通過(guò)數(shù)據(jù)庫(kù)進(jìn)行用戶身份的確認(rèn),那么建議使用密碼加密的方式與數(shù)據(jù)庫(kù)進(jìn)行連接。

(3)數(shù)據(jù)庫(kù)開發(fā)者不能將數(shù)據(jù)庫(kù)登陸密碼直接寫在其開發(fā)源代碼中。

2.5?優(yōu)化設(shè)計(jì)

下面的情況針對(duì)的是大數(shù)據(jù)量的情況下。在數(shù)據(jù)量小的時(shí)候,下面的約定沒(méi)有必要,例如,小表掃描比使用索引消耗的資源還小些。 為了SQL語(yǔ)句執(zhí)行的速度,減少阻塞和死鎖,提高請(qǐng)求的響應(yīng)時(shí)間,請(qǐng)遵照如下約定:

2.5.1 索引的使用

在SQL的寫法中,所有在大范圍數(shù)據(jù)里搜索記錄,必須有合適的索引來(lái)配匹,否則引起長(zhǎng)時(shí)間的表掃描鎖定。這是所有系統(tǒng)性能低下的最基本的根源。請(qǐng)為每一個(gè)SQL語(yǔ)句設(shè)計(jì)合適的索引,當(dāng)系統(tǒng)開始設(shè)計(jì)時(shí)沒(méi)有索引時(shí)請(qǐng)向項(xiàng)目經(jīng)理申請(qǐng)?jiān)黾印?/p>

(1)對(duì)于取值不能重復(fù)的、經(jīng)常作為查詢條件的字段,應(yīng)該建立唯一索引:unique index

示例: create unique index my_unique_idx on myTable (id);

(2)對(duì)于經(jīng)常作為查詢條件的字段,其值可以不是唯一,則應(yīng)該建立可重復(fù)索引:

index 示例: create index my_dup_idx on myTable(name);

(3)盡量避免以索引的一部分作為查詢的條件:

示例:某表的建立SQL為: create table myTable(id int,name char(8),age int, primary key(id, name)) 即表myExample是以 id 和 name 共同組成 Primary Key。

則下面方式的查詢語(yǔ)句效率很好: select ... from myTable where id= .... and name =....

而如果僅僅以 primary key 的一部分作為條件,則沒(méi)有起到key 的作用。

如下面兩條SQL查詢效率很低: select ... from myTable where id=.... select ... from myTable where name=...

以上兩條SQL,數(shù)據(jù)庫(kù)系統(tǒng)將會(huì)使用順序掃描,從而導(dǎo)致效率低下。

(4)組合索引要盡量使關(guān)鍵查詢形成索引覆蓋,其前導(dǎo)列一定是使用最頻繁的列。

(5)經(jīng)常同時(shí)存取多列,且每列都含有重復(fù)值可考慮建立組合索引;

(6)有大量重復(fù)值、且經(jīng)常有范圍查詢 (between, >,< ,>=,< =)和order by 、group by發(fā)生的列,可考慮建立群集索引;

2.5.2?嚴(yán)禁使用的SQL

在大范圍的數(shù)據(jù)情況下,下面的用法,堅(jiān)決杜絕使用。

1、游標(biāo):大數(shù)據(jù)范圍的循環(huán),Oracle不能很好的支持。會(huì)造成系統(tǒng)性能嚴(yán)重下降。

2、函數(shù):函數(shù)同光標(biāo)一樣一行行的執(zhí)行,效率也非常低。

3、"!=", "!>", "!<", "NOT", "NOT EXISTS", "NOT IN", "NOT LIKE",like %aaa%?等比較運(yùn)算。他們都不會(huì)做索引。堅(jiān)決反對(duì)使用。

4、不得建沒(méi)有作用的事物:事物的啟動(dòng)需要一定的資源,請(qǐng)不要亂用例如產(chǎn)生報(bào)表時(shí)。 5、Select Into創(chuàng)建表:請(qǐng)使用顯示定義Create table 。

特別的是不要在事物里創(chuàng)建表和臨時(shí)表。

6、在Where字句中,Oracle的函數(shù)和字段一定的分離。堅(jiān)決不得使用如下的寫法: where Convert(varchar(10),fdate,112) = ?2003-09-06? 或者 where Substring(PNO,4,3) = ?001? 他們都是表完全掃描。

2.5.3?需要慎重使用的SQL

下面這些語(yǔ)句容易對(duì)服務(wù)器造成額外的負(fù)擔(dān),例如Order by 消耗了大量的CPU資源。所以要避免采用它,當(dāng)然不是說(shuō)不用他們。有時(shí)需要將結(jié)果集排序顯示就一定要用到Order by,但不要用多余的Order by.

Order By:消耗了內(nèi)存和CPU,在Temp中完成操作。

(1)Group By:同Order BY

(2) Having:同Order BY

(3) Distinct:同Order BY

(4)Union (盡量用Union All) :同Order BY

(5) in :沒(méi)有Between快。

(6)視圖:盡量少用。

(7)SELECT COUNT(*) :用Exists更好

2.5.4?大量裝載數(shù)據(jù)的注意事項(xiàng):

(1)大批量裝載數(shù)據(jù)的時(shí)候,如果有可能,盡量把數(shù)據(jù)庫(kù)設(shè)置為非日志方式。裝載數(shù)據(jù)完成以后,再把數(shù)據(jù)庫(kù)恢復(fù)成原先的方式。

(2) 大批量裝載數(shù)據(jù)的時(shí)候,盡量把內(nèi)存參數(shù)、數(shù)據(jù)同步的參數(shù)設(shè)大。

(3)大批量裝載數(shù)據(jù)的時(shí)候,避免使用insert語(yǔ)句,而應(yīng)該使用數(shù)據(jù)庫(kù)提供的裝載工具或者采用游標(biāo)insert方式來(lái)實(shí)現(xiàn)。

2.5.5 盡量減少多表連接的操作

說(shuō)明:多表連接的操作一般效率較差,在聯(lián)機(jī)事務(wù)處理(OLTP)的應(yīng)用中,應(yīng)該盡量避免多表連接的操作,盡量避免建立多表的關(guān)系。

2.5.6?SQL語(yǔ)句優(yōu)化

說(shuō)明:SQL語(yǔ)句編寫的好壞,直接影響到系統(tǒng)性能及增加數(shù)據(jù)庫(kù)的負(fù)荷。SQL優(yōu)化的實(shí)質(zhì)就是在結(jié)果正確的前提下,用優(yōu)化器可以識(shí)別的語(yǔ)句,充分利用索引,減少表掃描的I/O次數(shù),盡量避免表搜索的發(fā)生。

(1)任何對(duì)列的操作都將導(dǎo)致表掃描,它包括數(shù)據(jù)庫(kù)函數(shù)、計(jì)算表達(dá)式等等,查詢時(shí)要盡可能將操作移至等號(hào)右邊。

(2)in、or子句常會(huì)使用工作表,使索引失效;如果不產(chǎn)生大量重復(fù)值,可以考慮把子句拆開;拆開的字句中應(yīng)該包含索引。

(3) 多條件查詢時(shí)候,根據(jù)最優(yōu)化原則,指定要應(yīng)用的索引,屏蔽非索引字段。

2.5.7 建表、索引及關(guān)鍵字時(shí)參數(shù)的使用

新建表、索引及關(guān)鍵字時(shí),應(yīng)帶相關(guān)參數(shù):

1、 建議PCTINCREASE參數(shù)設(shè)置為0,可使碎片最小化,使每一個(gè)Extent都相同(等于NEXT值)。

2、 如果一個(gè)表無(wú)頻繁刪除,修改操作,建議PCTFREE參數(shù)適當(dāng)設(shè)低,如有頻繁刪除,修改操 作可適當(dāng)調(diào)高,如以上格式。

3、 根據(jù)表數(shù)據(jù)量的大小及將來(lái)的擴(kuò)充 將STORAGE 中 INITIAL 、NEXT 合理設(shè)置,保證該表數(shù)據(jù) 盡量保持在同一塊區(qū),保證查詢速度,減少I/O資源損耗。

4、 建立索引和關(guān)鍵字時(shí)候,指定特定專用的表空間,這樣在處理數(shù)據(jù)時(shí)就可以充分利用磁盤I/O,使 數(shù)據(jù)和索引在不同的I/O上進(jìn)行,以提高訪問(wèn)速度。

2?附錄

2.1?ORACLE關(guān)鍵字列表

access,add,all,alter,and,any,as,asc,audit,between,bfile,blob,by,char,char,check,clob,cluster,column,comment,compress,connect,count,create,current date,date,decimal,decimal,default,delete,desc,distinct,drop else,exclusive,exists file,float,for,from grant,group,grouping,having,identified,immediate,in,increment,index,initial,insert,integer,integer,intersect,into,is,level,like,lock,long,maxextents,minus,mlslabel,mode,modify,noaudit,nocompress,not,nowait,null,number,number,of,offline,on,online,option,or,order,pctfree,prior,privileges,public,raw,rename,resource,revoke,row,rowid,rownum,rows,select,session,set,share,size,smallint,start,successful,sum,synonym,sysdate,table,then,to,trigger,type,uid,union,unique,update,user,validate,values,varchar,varchar2,varchar2,varchar,view,whenever,where,with

2.2?SQL Server關(guān)鍵字列表

add,EXTERNAL,PROCEDURE,ALL,FETCH,PUBLIC,ALTER,FILE,RAISERROR,AND,FILLFACTOR,READ,ANY,FOR,READTEXT,AS,FOREIGN,RECONFIGURE,ASC,FREETEXT,REFERENCES,AUTHORIZATION,FREETEXTTABLE,REPLICATION,BACKUP,RESTORE,BEGIN,FULL,RESTRICT,BETWEEN,FUNCTION,RETURN,BREAK,GOTO,REVERT,BROWSE,GRANT,REVOKE,BULK,GROUP,RIGHT,BY,HAVING,ROLLBACK,CASCADE,HOLDLOCK,ROWCOUNT,CASE,IDENTITY,ROWGUIDCOL,CHECK,IDENTITY_INSERT,RULE,CHECKPOINT,IDENTITYCOL,SAVE,CLOSE,IF,SCHEMA,CLUSTERED,IN,SECURITYAUDIT,COALESCE,INDEX,SELECT,COLLATE,INNER,SEMANTICKEYPHRASETABLE,COLUMN,INSERT,SEMANTICSIMILARITYDETAILSTABLE,COMMIT,INTERSECT,SEMANTICSIMILARITYTABLE,COMPUTE,INTO,SESSION_USER,CONSTRAINT,is,SET,CONTAINS,JOIN,SETUSER,CONTAINSTABLE,KEY,SHUTDOWN,CONTINUE,KILL,SOME,CONVERT,LEFT,STATISTICS,CREATE,LIKE,SYSTEM_USER,CROSS,LINENO,TABLE,CURRENT,LOAD,TABLESAMPLE,CURRENT_DATE,MERGE,TEXTSIZE,CURRENT_TIME,NATIONAL,THEN,CURRENT_TIMESTAMP,NOCHECK,CURRENT_USER,NONCLUSTERED,TOP,CURSOR,NOT,TRAN,DATABASE,NULL,TRANSACTION,DBCC,NULLIF,Trigger,DEALLOCATE,OF,TRUNCATE,DECLARE,OFF,TRY_CONVERT,DEFAULT,OFFSETS,TSEQUAL,DELETE,ON,UNION,DENY,OPEN,UNIQUE,DESC,OPENDATASOURCE,UNPIVOT,DISK,OPENQUERY,UPDATE,DISTINCT,OPENROWSET,UPDATETEXT,DISTRIBUTED,OPENXML,USE,DOUBLE,OPTION,USER,DROP,OR,VALUES,DUMP,ORDER,VARYING,ELSE,OUTER,View,END,OVER,WAITFOR,ERRLVL,PERCENT,WHEN,ESCAPE,PIVOT,WHERE,EXCEPT,PLAN,WHILE,EXEC,PRECISION,WITH,EXECUTE,PRIMARY,WITHIN GROUP,EXISTS,PRINT,WRITETEXT,EXIT,PROC

由于篇幅限制,需要免費(fèi)領(lǐng)取《數(shù)據(jù)庫(kù)設(shè)計(jì)開發(fā)規(guī)范》這份pdf,麻煩幫忙關(guān)注+轉(zhuǎn)發(fā),后臺(tái)簡(jiǎn)信【學(xué)習(xí)】即可免費(fèi)領(lǐng)取~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容