偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

SQL Server數(shù)據(jù)庫(kù)設(shè)計(jì)規(guī)范

數(shù)據(jù)庫(kù) SQL Server 數(shù)據(jù)庫(kù)運(yùn)維
數(shù)據(jù)庫(kù)設(shè)計(jì)是指對(duì)一個(gè)給定的應(yīng)用環(huán)境,構(gòu)造最優(yōu)的數(shù)據(jù)庫(kù)模式,建立數(shù)據(jù)庫(kù)及其他應(yīng)用系統(tǒng),使之能有效地存儲(chǔ)數(shù)據(jù),滿足各種用戶的需求。數(shù)據(jù)庫(kù)設(shè)計(jì)過(guò)程中命名規(guī)范很是重要,命名規(guī)范合理的設(shè)計(jì)能夠省去開發(fā)人員很多時(shí)間去區(qū)別數(shù)據(jù)庫(kù)實(shí)體。

1.簡(jiǎn)介

數(shù)據(jù)庫(kù)設(shè)計(jì)是指對(duì)一個(gè)給定的應(yīng)用環(huán)境,構(gòu)造***的數(shù)據(jù)庫(kù)模式,建立數(shù)據(jù)庫(kù)及其他應(yīng)用系統(tǒng),使之能有效地存儲(chǔ)數(shù)據(jù),滿足各種用戶的需求。數(shù)據(jù)庫(kù)設(shè)計(jì)過(guò)程中命名規(guī)范很是重要,命名規(guī)范合理的設(shè)計(jì)能夠省去開發(fā)人員很多時(shí)間去區(qū)別數(shù)據(jù)庫(kù)實(shí)體。

最近也因?yàn)楣ぷ餍枰哉沓隽诉@個(gè)word文檔,望大家指正。

2.數(shù)據(jù)庫(kù)設(shè)計(jì)

數(shù)據(jù)庫(kù)規(guī)劃→需求分析→數(shù)據(jù)庫(kù)設(shè)計(jì)→應(yīng)用程序設(shè)計(jì)→實(shí)現(xiàn)→測(cè)試→運(yùn)行于維護(hù)

2.1數(shù)據(jù)庫(kù)規(guī)劃

定義數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)的主要目標(biāo),定義系統(tǒng)特定任務(wù),包括工作量的估計(jì)、使用資源、和需求經(jīng)費(fèi),定義系統(tǒng)的范圍以及邊界。

2.2需求分析

2.1.1需求分析步驟與成果

涉及人員:用戶和分析人員

任務(wù):對(duì)現(xiàn)實(shí)世界要處理的對(duì)象進(jìn)行詳細(xì)的調(diào)查,收集基礎(chǔ)數(shù)據(jù)及處理方法,在用戶調(diào)查的基礎(chǔ)上通過(guò)分析,逐步明確用戶對(duì)系統(tǒng)的需求,包括信息的要求及處理的要求。

方法與步驟:1.通過(guò)與用戶的調(diào)查,對(duì)用戶的信息需求進(jìn)行收集。

2.在收集數(shù)據(jù)的同時(shí),設(shè)計(jì)人員要對(duì)其進(jìn)行加工和整理,以數(shù)據(jù)字典和數(shù)據(jù)流圖的形式描述出來(lái),并以設(shè)計(jì)人員的角度向用戶講述信息,根據(jù)用戶的反饋加以修改并確定(該過(guò)程是反復(fù)的過(guò)程)

成果:數(shù)據(jù)流圖,數(shù)據(jù)字典,各種說(shuō)明性表格,統(tǒng)計(jì)輸出表以及系統(tǒng)功能結(jié)構(gòu)圖。

2.1.2數(shù)據(jù)流圖基本元素與數(shù)據(jù)流圖

外部實(shí)體:存在于軟件系統(tǒng)之外的人員或組織(正方形或立方體表示)。

加工:數(shù)據(jù)處理,表示輸入數(shù)據(jù)在此進(jìn)行變換,產(chǎn)生輸出數(shù)據(jù)(圓角巨型或圓形表示)。

數(shù)據(jù)流:表示流動(dòng)著的數(shù)據(jù)(箭頭線表示)。

數(shù)據(jù)存儲(chǔ):用來(lái)表示要存儲(chǔ)的數(shù)據(jù)(開門矩形或兩條平行橫線表示)。

訂單處理系統(tǒng)頂層流程圖:

0層數(shù)據(jù)流圖: 

2.3數(shù)據(jù)庫(kù)設(shè)計(jì)

2.3.1概念結(jié)構(gòu)設(shè)計(jì)

  • 對(duì)事務(wù)加以抽象以E-R圖的形式描述出來(lái)

  • E-R圖(實(shí)體聯(lián)系圖):包括實(shí)體,聯(lián)系,屬性

實(shí)體:現(xiàn)實(shí)中的事物例如,學(xué)生,老師

聯(lián)系:兩個(gè)實(shí)體之間的關(guān)系,1:1、1:N、M:N三種關(guān)系

屬性:實(shí)體所具有的屬性,例如 學(xué)生的學(xué)號(hào)、姓名、性別等

例如:一個(gè)學(xué)生屬于一個(gè)班級(jí),一個(gè)班級(jí)擁有多名學(xué)生,E-R圖如下

 

 

 

網(wǎng)上購(gòu)物系統(tǒng)E-R圖,該系統(tǒng)數(shù)據(jù)之間存在下列約束

  1. 一個(gè)客戶(編號(hào)唯一)可以擁有多個(gè)訂單,每個(gè)訂單僅屬于一個(gè)客戶。

  2. 一個(gè)訂單(編號(hào)唯一)可以包含多個(gè)訂購(gòu)細(xì)目,每個(gè)訂購(gòu)細(xì)目只屬于一個(gè)訂單。

  3. 一個(gè)商品可以出現(xiàn)多個(gè)訂購(gòu)細(xì)目中,一個(gè)訂購(gòu)細(xì)目只包含多個(gè)商品。

  4. 一個(gè)商品類別可以包含多種商品,一種商品只屬于一個(gè)商品類別。

2.3.2邏輯結(jié)構(gòu)設(shè)計(jì)

2.3.2.1E-R圖轉(zhuǎn)換成關(guān)系模式

  •  將E-R圖轉(zhuǎn)換成關(guān)系模式

將每個(gè)實(shí)體轉(zhuǎn)換成一個(gè)關(guān)系模式,實(shí)體的屬性即關(guān)系模式的屬性,實(shí)體的標(biāo)識(shí)即關(guān)系模式的鍵。

  •  根據(jù)規(guī)則合并E-R圖中的1:1,1:N,M:N之間的聯(lián)系

  1. 若實(shí)體的聯(lián)系是(1:1),則可以將兩個(gè)實(shí)體轉(zhuǎn)換成兩個(gè)關(guān)系模式,任意一個(gè)關(guān)系模式的屬性中加入另一個(gè)關(guān)系模式的主鍵(作為外鍵)和聯(lián)系自身的屬性

  2. 若實(shí)體間的聯(lián)系是一對(duì)多(1:n),則將n端的實(shí)體類型轉(zhuǎn)換成關(guān)系模式中加入1端實(shí)體類型的主鍵(作為外鍵)和聯(lián)系類型的屬性。

  3. 若實(shí)體間的聯(lián)系是多對(duì)多(m:n),則將聯(lián)系類型也轉(zhuǎn)換成關(guān)系模式,其屬性為2實(shí)體類型的主鍵(作為外鍵)加上聯(lián)系類型自身的屬性,而該關(guān)系模式的主鍵為2端實(shí)體主鍵的組合。

  4. 若關(guān)系模式是1:1:1的關(guān)系,轉(zhuǎn)換原則同1:1

  5. 若關(guān)系模式是1:1:n的聯(lián)系,轉(zhuǎn)換原則同1:n

  6. 若關(guān)系模式是1:n:m的聯(lián)系,則可以將聯(lián)系類型也轉(zhuǎn)換成關(guān)系模式,其屬性為m端和n端實(shí)體類型的主鍵(作為外鍵)加上聯(lián)系類型自身的屬性,而關(guān)系模式的主鍵為n和m端實(shí)體主鍵的組合

  7. 若關(guān)系模式是n:m:p的聯(lián)系,轉(zhuǎn)換規(guī)則同m:n

根據(jù)E-R圖實(shí)體之間的聯(lián)系可以轉(zhuǎn)換成以下關(guān)系模式

客戶(客戶編號(hào),姓名,電話,E-mail)。關(guān)系的主鍵:客戶編號(hào);外鍵:無(wú)

訂單(訂單編號(hào),訂購(gòu)時(shí)間,客戶編號(hào))。關(guān)系的主鍵:訂單編號(hào);外鍵:客戶編號(hào)

訂購(gòu)細(xì)目(訂購(gòu)明細(xì)編號(hào),訂購(gòu)數(shù)量,支付金額,訂單編號(hào))。關(guān)系主鍵:訂購(gòu)明細(xì)編號(hào);外鍵:訂單編號(hào)。

出現(xiàn)(訂購(gòu)明細(xì)編號(hào),商品編號(hào),類型)。關(guān)系的主鍵:訂購(gòu)明細(xì)編號(hào),商品編號(hào);外鍵:訂購(gòu)明細(xì)編號(hào),商品編號(hào)。

商品:(商品編號(hào),商品名稱,單價(jià),生產(chǎn)日期,商品類別號(hào),商品類別名)。關(guān)系的主鍵:商品編號(hào);外鍵:無(wú)

在關(guān)系模式設(shè)計(jì)中可能會(huì)出現(xiàn)以下幾個(gè)問(wèn)題:數(shù)據(jù)冗余、數(shù)據(jù)修改不一致、數(shù)據(jù)插入異常、數(shù)據(jù)刪除異常,所以提出范式的要求,目的就是***限度地冗余,避免插入、刪除、修改異常。

2.3.2.2范式

主屬性:包含鍵的所有屬性。

  •  關(guān)系模式要求達(dá)到4NF (減少冗余,消除操作異常)

***范式(1NF):若關(guān)系模式R的每一個(gè)分量是不可分的數(shù)據(jù)項(xiàng),則關(guān)系模式屬于***范式。即每個(gè)屬性都是不可拆分的.

第二范式(2NF):R屬于1NF,且每一個(gè)非主屬性完全依賴于鍵(沒有部分依賴),則R屬于2NF

例如:選課關(guān)系(學(xué)號(hào),課程號(hào),成績(jī),學(xué)分)

該關(guān)系的主鍵是(學(xué)號(hào),課程號(hào)),但是課程號(hào)→學(xué)分,所以學(xué)分屬性部分依賴于主鍵,即關(guān)系部滿足第二范式,可以拆分為(學(xué)號(hào),課程號(hào),成績(jī)),(課程號(hào),學(xué)分)兩個(gè)關(guān)系

第三范式(3NF):R屬于2NF,且每個(gè)非主屬性即不部分依賴于碼,也不傳遞依賴于碼

例如:學(xué)生關(guān)系(學(xué)號(hào),姓名,所屬系,系地址)

該關(guān)系的主鍵是:學(xué)號(hào)

學(xué)號(hào)→所屬系,所屬系→學(xué)號(hào),所屬系→系地址;根據(jù)函數(shù)的依賴公理,系地址傳遞函數(shù)依賴于學(xué)號(hào),即關(guān)系不滿足第三范式,可以拆分關(guān)系為(學(xué)號(hào),姓名,所屬系),(所屬系,系地址)

如果不拆分會(huì)存在數(shù)據(jù)修改異常,比如該學(xué)生的換了系,修改了所屬系,但是系地址沒有修改,這樣就造成了修改異常

 BCNF:R屬于3NF,且不存在主屬性對(duì)碼的部分和傳遞函數(shù)依賴

例如:關(guān)系R(零件號(hào),零件名,廠商名),如果設(shè)定每種零件號(hào)只有一個(gè)零件名,但不同的的零件號(hào)可以有相同的零件名,每種零件可以有多個(gè)廠商生產(chǎn),但每家廠商生產(chǎn)的零件應(yīng)有不同的零件名。這樣可以得到:

零件號(hào)→零件名,(廠商名,零件名)→零件號(hào)

所以主屬性包括(零件號(hào),廠商名,零件名),但是“零件名”傳遞依賴于碼“廠商名,零件名”,所以關(guān)系R不滿足BCNF,當(dāng)一個(gè)零件由多個(gè)生產(chǎn)廠商生產(chǎn)時(shí),由于零件號(hào)只有一個(gè)而零件名根據(jù)廠商不同而又多個(gè),零件名與零件號(hào)之間的聯(lián)系將多次重復(fù),帶來(lái)數(shù)據(jù)冗余和操作異?,F(xiàn)象

可以將關(guān)系分解為(零件號(hào),廠商名),(零件號(hào),零件名)

4NF:關(guān)系模式R屬于1NF,若對(duì)于R的每個(gè)非平凡多值依賴X→→Y且Y不包含于X時(shí),X必含碼,則R屬于4NF

5NF:對(duì)關(guān)系進(jìn)行投影,消除關(guān)系中不是由候選碼所蘊(yùn)含的連接依賴

對(duì)于上面的商品關(guān)系,由于關(guān)系的主鍵是商品編號(hào),而商品類別號(hào)→商品類別名

所以商品關(guān)系部滿足第三范式,非主屬性商品類別名傳遞依賴于商品編號(hào),會(huì)存在數(shù)據(jù)冗余,數(shù)據(jù)修改異常問(wèn)題。將商品關(guān)系分解為:

商品(商品編號(hào),商品名稱,單價(jià),生產(chǎn)日期,商品類別號(hào))

商品類別(商品類別號(hào),商品類別名)

2.3.3物理結(jié)構(gòu)設(shè)計(jì)

為一個(gè)給定的邏輯數(shù)據(jù)模型設(shè)計(jì)一個(gè)最合適應(yīng)用要求的物理結(jié)構(gòu)的過(guò)程

  •  數(shù)據(jù)庫(kù)的建立

  •  數(shù)據(jù)表的建立

  •  索引的建立

  •  視圖的建立

  •  觸發(fā)器的建立

  •  存儲(chǔ)過(guò)程設(shè)計(jì)

  • 用戶自定義函數(shù)設(shè)計(jì)

  •  對(duì)關(guān)系模式的數(shù)據(jù)項(xiàng)加以約束,如檢查約束、主鍵約束、參照完整性約束以保證數(shù)據(jù)正確性

2.4應(yīng)用程序設(shè)計(jì)

采用高級(jí)語(yǔ)言以結(jié)構(gòu)化設(shè)計(jì)方法或面向?qū)ο蠓椒ㄟM(jìn)行設(shè)計(jì)

2.5系統(tǒng)實(shí)現(xiàn)

3.優(yōu)化策略

3.1.查詢優(yōu)化策略

  1. 盡可能地減少多表查詢或建立物化視圖

  2. 只檢索需要的列

  3. 用帶IN的條件字句等級(jí)替換or字句

  4. 經(jīng)常提交COMMIT,以盡早釋放鎖

3.2表設(shè)計(jì)

1.如果頻繁地訪問(wèn)涉及的是對(duì)兩個(gè)相關(guān)的表進(jìn)行連接操作,則考慮將其合并

2.如果頻繁地訪問(wèn)只是在表中的某一部分字段上進(jìn)行,則考慮分解表,將該部分單獨(dú)作為一個(gè)表

3.對(duì)于很少更新的表,引入物化視圖

4. 當(dāng)系統(tǒng)中有一些少量的,重復(fù)出現(xiàn)的值時(shí),使用字典表來(lái)節(jié)約存儲(chǔ)空間和優(yōu)化查詢。如地區(qū)、系統(tǒng)中用戶類型的代號(hào)等。這類值不會(huì)在程序的運(yùn)行期變化,但是需要存儲(chǔ)在數(shù)據(jù)庫(kù)中。

   就地區(qū)而言,如果我們要查詢某個(gè)地區(qū)的記錄,則數(shù)據(jù)庫(kù)需要通過(guò)字符串匹配的方式來(lái)查詢;如果將地區(qū)改為一個(gè)地區(qū)的代號(hào)保存在表中,查詢時(shí)通過(guò)地區(qū)的代號(hào)來(lái)查詢,則查詢的效率將大大提高。

程序中宜大量的使用字典表來(lái)表示這類值。字典表中保存這類值的代號(hào)和實(shí)體的集合,以外鍵的方式關(guān)聯(lián)到使用這類值的表中。然而,在編碼階段,程序員并不使用字典表,因?yàn)槭紫炔樵冏值浔碇袑?shí)體的代號(hào),違背了提高查詢效率的初衷。程序員在數(shù)據(jù)字典的幫助下,直接使用代號(hào)來(lái)代表實(shí)體,從而提高效率。

雖然字典表在實(shí)際上并不使用,但是仍應(yīng)該保留在數(shù)據(jù)庫(kù)中(起碼是在開發(fā)期內(nèi)保留)。字典表作為另一種形式上的“數(shù)據(jù)字典文檔”出現(xiàn),以說(shuō)明數(shù)據(jù)庫(kù)中哪些表的哪些字段是使用了字典表的。

為了提高數(shù)據(jù)庫(kù)的數(shù)據(jù)完整性,在開發(fā)階段可以保留完整的字典表和普通表的外鍵約束。但是在數(shù)據(jù)庫(kù)的運(yùn)行階段,應(yīng)該將普通表和字典表的外鍵刪除,以提高運(yùn)行效率,特別是某些表使用了很多字典表的情況。

   案例:某數(shù)據(jù)庫(kù)中有百萬(wàn)條用戶信息,應(yīng)用系統(tǒng)中常常需要按照地區(qū)要查詢用戶的信息。用戶信息表以前是按照具體的地區(qū)名稱來(lái)保存的,現(xiàn)在將具體的名稱改為字典表中的地區(qū)代號(hào),查詢效率大大提高。

3.3索引

  1. 如果查詢是瓶頸,則在關(guān)系上建立適當(dāng)?shù)乃饕煌ǔ?,作為查詢條件的屬性上建立索引可以提高查詢效率。

  2. 如果更新是瓶頸,因?yàn)槊看胃露紩?huì)重建表上的索引,引起效率降低,則考慮刪除某些索引。

  3. 選擇適當(dāng)索引,如果經(jīng)常使用范圍查詢,則B樹索引比散列索引更高效

  4. 將有利于大多數(shù)查詢和更新的索引設(shè)為聚集性索引。

3.4提高IO效率

  1. 索引文件和數(shù)據(jù)文件分開存儲(chǔ),事務(wù)日志文件存儲(chǔ)在高速設(shè)備上

  2. 經(jīng)常修改數(shù)據(jù)文件和索引文件的頁(yè)面大小

  3. 定期對(duì)數(shù)據(jù)進(jìn)行排序

  4. 增加必要的索引項(xiàng)

#p#

4.數(shù)據(jù)庫(kù)命名規(guī)范

4.1數(shù)據(jù)庫(kù)對(duì)象

對(duì)象

前綴

數(shù)據(jù)庫(kù)

無(wú)

無(wú)

視圖

VI

索引

IX

存儲(chǔ)過(guò)程

SP

函數(shù)

FN

觸發(fā)器

TR

自定義數(shù)據(jù)類型

ud

Default

DF

主鍵

pk

外鍵

FK

rule

ru

序列

Sq

UNIQUE

uq

數(shù)據(jù)庫(kù)對(duì)象采用26個(gè)英文字母(區(qū)分大小寫)和0-9這十個(gè)自然數(shù),加上下劃線_組成,共63個(gè)字符。不能出現(xiàn)其他字符(注釋除外)。

同一個(gè)數(shù)據(jù)庫(kù)中這些對(duì)象名都是不能重復(fù)

C    CHECK_CONSTRAINT

D    DEFAULT_CONSTRAINT

F    FOREIGN_KEY_CONSTRAINT

IT   INTERNAL_TABLE

P    SQL_STORED_PROCEDURE

PK   PRIMARY_KEY_CONSTRAINT

S    SYSTEM_TABLE

SQ   SERVICE_QUEUE

TR   SQL_TRIGGER

U    USER_TABLE

UQ   UNIQUE_CONSTRAINT

V    VIEW

4.2命名規(guī)范規(guī)定

1.表名使用單數(shù)名

例如:對(duì)存儲(chǔ)客人信息的表(Customer)不使用Customers

2.避免無(wú)謂的表格后綴

1、 表是用來(lái)存儲(chǔ)數(shù)據(jù)信息的,表是行的集合。那么如果表名已經(jīng)能夠很好地說(shuō)明其包含的數(shù)據(jù)信息,就不需要再添加體現(xiàn)上面兩點(diǎn)的后綴了。

2、  GuestInfo(存儲(chǔ)客戶信息)應(yīng)寫成Guest,F(xiàn)lightList(存儲(chǔ)航班信息的表)應(yīng)寫成Flight

3.所有表示時(shí)間的字段,統(tǒng)一以 Date 來(lái)作為結(jié)尾(而不是有的使用Date,有的使用Time)

以大家都熟悉的論壇來(lái)說(shuō),需要記錄會(huì)員***一次登錄的時(shí)間,這時(shí)候一般人都會(huì)把這個(gè)字段命名為L(zhǎng)oginTime 或者 LoginDate。這時(shí)候,已經(jīng)產(chǎn)生了一個(gè)歧義;如果僅看表的字段名稱,不去看表的內(nèi)容,很容易將LoginTime理解成登錄的次數(shù),因?yàn)?,Time還有一個(gè)很常用的意思,就是次數(shù)

4.所有表示數(shù)目的字段,都應(yīng)該以Count作為結(jié)尾

5.所有代表鏈接的字段,均為Url結(jié)尾

6.所有名稱的字符范圍為:A-Z, a-z, 0-9 和_(下劃線)。不允許使用其他字符作為名稱。

7.采用英文單詞或英文短語(yǔ)(包括縮寫)作為名稱,不能使用無(wú)意義的字符或漢語(yǔ)拼音。

8.名稱應(yīng)該清晰明了,能夠準(zhǔn)確表達(dá)事物的含義,***可讀,遵循“見名知意”的原則。

 

4.3數(shù)據(jù)庫(kù)命名規(guī)范

數(shù)據(jù)庫(kù)名稱不需要簡(jiǎn)寫,根據(jù)實(shí)際意義來(lái)命名。例如:ReportServer

數(shù)據(jù)庫(kù)名:ReportServer

邏輯數(shù)據(jù)名:ReportServer;邏輯日志名:ReportServer_log

物理數(shù)據(jù)名:ReportServer.mdf;物理日志名:ReportServer_log.LDF

CREATE DATABASE [ReportServer] ON  PRIMARY

( NAME = N'ReportServer', FILENAME = N'D:\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\useData\ReportServer.mdf' , SIZE = 3328KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )

 LOG ON

( NAME = N'ReportServer_log', FILENAME = N'D:\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\useData\ReportServer_log.LDF' , SIZE = 6400KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)

GO

注意:避免所有數(shù)據(jù)庫(kù)的邏輯名稱使用相同的名稱。

4.4表設(shè)計(jì)命名規(guī)范

注意字段名不能使用保留關(guān)鍵字:如action,avg等

1、不使用tab或tbl作為表前綴(本來(lái)就是一個(gè)表,為什么還要說(shuō)明)

2、表名以代表表內(nèi)的內(nèi)容的一個(gè)和多個(gè)名詞組成,以下劃線分隔,每個(gè)名詞的***個(gè)字母大寫,例如:User、UserLogin,UserGroupRelation等

3、使用表的內(nèi)容分類作為表名的前綴:如,與用戶信息相關(guān)的表使用前綴User,與內(nèi)容相關(guān)的信息使用前綴Content。

4、表的前綴以后,是表的具體內(nèi)容的描述。如:用戶登錄信息的表名為:UserLogin,用戶在論壇中的信息的表名為:UserBBSInfo

5、一些作為多對(duì)多連接的表,可以使用兩個(gè)表的前綴作為表名:

         如:用戶登錄表UserLogin,用戶分組表GroupInfo,這兩個(gè)表建立多對(duì)多關(guān)系的表名為:UserGroupRelation

4.4.1字段命名規(guī)范

  1. 字段名不要存在無(wú)用前綴,例如表‘WeiXinConfig’,既然我已經(jīng)知道這張表是關(guān)于微信的表,里面的名稱字段可以可以使用Name,不需要添加無(wú)用的前綴類似‘WeiXinName’,‘WeiXinGuanZhuMsg’,‘WeiXinUpImgMsg’等

  2. 字段使用實(shí)際英文翻譯作為命名字段,見名知意,不要使用讓人看了半天都不知道是啥意思的字段(類似:lev1,lev2…)

4.5存儲(chǔ)過(guò)程命名

存儲(chǔ)過(guò)程名=[SP_]+[表名]+[操作名字]

[操作名字]=[insert|delete|update|calculate|confirm]

例如:SP_community_update

4.5.1只允許應(yīng)用程序通過(guò)存儲(chǔ)過(guò)程訪問(wèn)數(shù)據(jù)庫(kù)

   只允許應(yīng)用程序通過(guò)存儲(chǔ)過(guò)程訪問(wèn)數(shù)據(jù)庫(kù),而不允許直接在代碼中寫SQL語(yǔ)句訪問(wèn)數(shù)據(jù)庫(kù)。

在數(shù)據(jù)庫(kù)開發(fā)項(xiàng)目中,大量使用存儲(chǔ)過(guò)程有很多的好處,首先看微軟提供信息:

使用 SQL Server 中的存儲(chǔ)過(guò)程而不使用存儲(chǔ)在客戶計(jì)算機(jī)本地的 Transact-SQL 程序的優(yōu)勢(shì)有:

允許模塊化程序設(shè)計(jì):

只需創(chuàng)建過(guò)程一次并將其存儲(chǔ)在數(shù)據(jù)庫(kù)中,以后即可在程序中調(diào)用該過(guò)程任意次。存儲(chǔ)過(guò)程可由在數(shù)據(jù)庫(kù)編程方面有專長(zhǎng)的人員創(chuàng)建,并可獨(dú)立于程序源代碼而單獨(dú)修改。

允許更快執(zhí)行:

如果某操作需要大量 Transact-SQL 代碼或需重復(fù)執(zhí)行,存儲(chǔ)過(guò)程將比 Transact-SQL 批代碼的執(zhí)行要快。將在創(chuàng)建存儲(chǔ)過(guò)程時(shí)對(duì)其進(jìn)行分析和優(yōu)化,并可在***執(zhí)行該過(guò)程后使用該過(guò)程的內(nèi)存中版本。每次運(yùn)行 Transact-SQL 語(yǔ)句時(shí),都要從客戶端重復(fù)發(fā)送,并且在 SQL Server 每次執(zhí)行這些語(yǔ)句時(shí),都要對(duì)其進(jìn)行編譯和優(yōu)化。

減少網(wǎng)絡(luò)流量:

一個(gè)需要數(shù)百行 Transact-SQL 代碼的操作由一條執(zhí)行過(guò)程代碼的單獨(dú)語(yǔ)句就可實(shí)現(xiàn),而不需要在網(wǎng)絡(luò)中發(fā)送數(shù)百行代碼。

可作為安全機(jī)制使用:

即使對(duì)于沒有直接執(zhí)行存儲(chǔ)過(guò)程中語(yǔ)句的權(quán)限的用戶,也可授予他們執(zhí)行該存儲(chǔ)過(guò)程的權(quán)限。

 

 

除此以外,使用存儲(chǔ)過(guò)程的好處還有:

1、  在邏輯上,存儲(chǔ)過(guò)程將應(yīng)用程序?qū)雍蛿?shù)據(jù)庫(kù)物理結(jié)構(gòu)分離開來(lái)。存儲(chǔ)過(guò)程形成了一個(gè)應(yīng)用程序和數(shù)據(jù)庫(kù)之間的接口。這樣的接口抽象了復(fù)雜的數(shù)據(jù)庫(kù)結(jié)構(gòu),符合極限編程中“基于接口編程”的思想。

2、  將主要的業(yè)務(wù)邏輯封裝在存儲(chǔ)過(guò)程中,能夠避免在應(yīng)用程序?qū)訉懘罅康拇a(在應(yīng)用程序中通過(guò)字符串插入太長(zhǎng)的SQL語(yǔ)句影響效率,而且維護(hù)困難)。有助于提高開發(fā)效率,并且直接在查詢分析器中調(diào)試存儲(chǔ)過(guò)程,能夠更早的發(fā)現(xiàn)系統(tǒng)中的邏輯問(wèn)題,從而提高代碼的質(zhì)量。

3、  在網(wǎng)站一類的應(yīng)用系統(tǒng)中,SQL注入式漏洞一直是難以完全杜絕的漏洞。如果只通過(guò)存儲(chǔ)過(guò)程來(lái)訪問(wèn)數(shù)據(jù)庫(kù),能夠大大減少這類安全性問(wèn)題。(因此,就算是簡(jiǎn)單的只有一句的SQL語(yǔ)句,也應(yīng)該寫成存儲(chǔ)過(guò)程。)

4、  由于采用存儲(chǔ)過(guò)程,應(yīng)用程序的層面可以不關(guān)心具體的數(shù)據(jù)庫(kù)結(jié)構(gòu),而只關(guān)心存儲(chǔ)過(guò)程的接口調(diào)用。因此,在以下一些情況,存儲(chǔ)過(guò)程的優(yōu)勢(shì)非常明顯:

·需求變更,表的結(jié)構(gòu)必須要改變。使用存儲(chǔ)過(guò)程,只要參數(shù)不變,我們就只需要修改相應(yīng)的存儲(chǔ)過(guò)程,而不需要修改應(yīng)用程序的代碼。這樣的設(shè)計(jì)將減小需求變更對(duì)項(xiàng)目的影響。

·為提高效率,使部分字段冗余:一些經(jīng)常性訪問(wèn)的字段,我們可以在相關(guān)的表中進(jìn)行冗余存儲(chǔ)。這樣既提高了效率,又通過(guò)存儲(chǔ)過(guò)程屏蔽了冗余細(xì)節(jié)。

·為提高效率,使用冗余表(拆分表):一些大的表,為了提高查詢效率,可能需要將記錄分別保存到多個(gè)表中去。使用存儲(chǔ)過(guò)程,有存儲(chǔ)過(guò)程來(lái)決定從哪些拆分的表中獲取或插入數(shù)據(jù)。這樣提高了效率,又不必在應(yīng)用程序?qū)用骊P(guān)心具體的拆分規(guī)則。

5、 使用存儲(chǔ)過(guò)程,便于在項(xiàng)目后期或者運(yùn)行中集中優(yōu)化系統(tǒng)性能。在項(xiàng)目開發(fā)過(guò)程中,由于各種原因,往往無(wú)法編寫高效的代碼,這個(gè)問(wèn)題常常在項(xiàng)目后期或者在運(yùn)行期體現(xiàn)出來(lái)。通過(guò)存儲(chǔ)過(guò)程來(lái)封裝對(duì)數(shù)據(jù)庫(kù)的訪問(wèn),可以在項(xiàng)目集成以后,通過(guò)試運(yùn)行觀察系統(tǒng)的運(yùn)行效率,從而很容易找出系統(tǒng)的瓶頸,并能夠通過(guò)優(yōu)化存儲(chǔ)過(guò)程的代碼來(lái)提高系統(tǒng)的運(yùn)行效率。這樣的優(yōu)化,比在運(yùn)用程序中優(yōu)化更有效,更容易。

同時(shí),過(guò)多的使用存儲(chǔ)過(guò)程,也存在以下一些疑慮:

問(wèn)題一:存儲(chǔ)過(guò)程編譯后,將作為數(shù)據(jù)庫(kù)的全局對(duì)象保存,太多的存儲(chǔ)過(guò)程將占用大量的數(shù)據(jù)庫(kù)服務(wù)器的內(nèi)存。

問(wèn)題二:在存儲(chǔ)過(guò)程中實(shí)現(xiàn)大量的邏輯,將使大量的運(yùn)算在數(shù)據(jù)庫(kù)服務(wù)器上完成,而不是在應(yīng)用服務(wù)器上完成。當(dāng)訪問(wèn)量很大的時(shí)候,會(huì)大大消耗數(shù)據(jù)庫(kù)服務(wù)器的CPU占用率。

在此還存在這個(gè)一個(gè)案例:有一個(gè)訪問(wèn)量巨大的網(wǎng)站,有多臺(tái)WEB服務(wù)器構(gòu)成一個(gè)負(fù)載均衡的服務(wù)器群集,但是只有一臺(tái)中心的數(shù)據(jù)庫(kù)服務(wù)器。當(dāng)訪問(wèn)量持續(xù)增加的時(shí)候,接入更多的WEB服務(wù)器來(lái)滿足高并發(fā)量的訪問(wèn);但是數(shù)據(jù)庫(kù)服務(wù)器卻沒辦法一直增加。因此,就需要盡量在WEB服務(wù)器上完成業(yè)務(wù)邏輯,盡量避免消耗數(shù)據(jù)庫(kù)服務(wù)器的資源。

對(duì)于這兩個(gè)擔(dān)心,我的想法是:

問(wèn)題一的解決:存儲(chǔ)過(guò)程是經(jīng)過(guò)編譯后的SQL語(yǔ)句,在內(nèi)存中是二進(jìn)制的代碼,并不會(huì)消耗太多內(nèi)存。并且,存儲(chǔ)過(guò)程比起直接使用SQL語(yǔ)句來(lái)說(shuō),效率大大提高。換個(gè)角度來(lái)說(shuō),這是一個(gè)“以空間換時(shí)間”的方案,多消耗一點(diǎn)內(nèi)存來(lái)?yè)Q取效率的提高,是值得的。

問(wèn)題二的解決:首先,在實(shí)現(xiàn)業(yè)務(wù)邏輯的問(wèn)題上,在存儲(chǔ)過(guò)程中實(shí)現(xiàn)比在應(yīng)用程序中實(shí)現(xiàn)更容易;其次,從開發(fā)效率上,存儲(chǔ)過(guò)程的開發(fā)比應(yīng)用程序更簡(jiǎn)單(就完成相同邏輯而言)。在高訪問(wèn)量的系統(tǒng)中,應(yīng)用服務(wù)器和數(shù)據(jù)庫(kù)服務(wù)器的資源分配的問(wèn)題,應(yīng)該從成本的角度來(lái)開率:軟件開發(fā)中的成本,人工支出的費(fèi)用遠(yuǎn)遠(yuǎn)高于硬件支出的成本。我們可以很容易花錢購(gòu)買更好的服務(wù)器,但是很難花錢讓開發(fā)人員使程序有大幅度的提高。

使用存儲(chǔ)過(guò)程來(lái)封裝業(yè)務(wù)邏輯,首先節(jié)省的是大量的開發(fā)時(shí)間和調(diào)試時(shí)間,并能夠大大提高代碼的質(zhì)量。因此,從成本來(lái)說(shuō),應(yīng)該使用存儲(chǔ)過(guò)程。

對(duì)于大訪問(wèn)量的情況,最簡(jiǎn)單的辦法是投入更多的硬件成本:更快的硬盤,更大的內(nèi)存和更多的CPU,還有更好的網(wǎng)卡…………等等。

其次,在應(yīng)用程序的層面,可以大量的使用靜態(tài)文件緩存的辦法來(lái)減輕數(shù)據(jù)庫(kù)的壓力。如:不經(jīng)常變化的信息,可以從數(shù)據(jù)庫(kù)服務(wù)器中讀取,保存為應(yīng)用服務(wù)器上的XML靜態(tài)文件等。

實(shí)在不行的話,應(yīng)該在系統(tǒng)設(shè)計(jì)之初,考慮可能的訪問(wèn)量,將系統(tǒng)設(shè)計(jì)成分布式的。這樣就能從根本上解決大訪問(wèn)量的問(wèn)題。

 

4.5.2命名規(guī)范

1、存儲(chǔ)過(guò)程的前綴和表名的前綴類似:把一系列表看成一個(gè)對(duì)象,字段為對(duì)象的屬性,存儲(chǔ)過(guò)程則為訪問(wèn)對(duì)象的方法。如:添加用戶的存儲(chǔ)過(guò)程取名為:User_AddUser

2、存儲(chǔ)過(guò)程使用模塊的前綴來(lái)命名。如,用戶管理的存儲(chǔ)過(guò)程使用前綴user_。

3、存儲(chǔ)過(guò)程的前綴之后,是動(dòng)詞+名詞形式的存儲(chǔ)過(guò)程名(也可以是動(dòng)詞短語(yǔ))。

4.5.3存儲(chǔ)過(guò)程的參數(shù)命名

1、參數(shù)名采用匈牙利命名法,使用類型的前綴

2、每個(gè)存儲(chǔ)過(guò)程都有:@errno int和@errmsg varchar(255)兩個(gè)輸出參數(shù)。應(yīng)用程序中可以根據(jù)這兩個(gè)參數(shù)得到存儲(chǔ)過(guò)程執(zhí)行的情況。(這兩個(gè)參數(shù)使用默認(rèn)值,可以忽略)

errno為整型的錯(cuò)誤信息代碼,執(zhí)行成功返回0。Errno的值的具體含義通過(guò)errmsg參數(shù)說(shuō)明,或者通過(guò)代碼中的注釋或文檔。

Errmsg為錯(cuò)誤信息的字符串描述,這個(gè)參數(shù)主要用于調(diào)試期作為說(shuō)明,避免在應(yīng)用程序中使用該值。同時(shí),要注意英文版系統(tǒng)和中文版系統(tǒng)中,信息的語(yǔ)言選擇對(duì)程序的影響。

4.5.4存儲(chǔ)過(guò)程返回的記錄集

1、存儲(chǔ)過(guò)程的輸出記錄集:為程序的結(jié)構(gòu)清晰,存儲(chǔ)過(guò)程***只返回一個(gè)記錄集。但在某些為了提高性能的場(chǎng)合,還是可以輸出多個(gè)記錄集

2、記錄集中,每個(gè)輸出的字段***都指定字段的別名,以面真實(shí)的字段名信息流失到客戶端,從而加大黑客找到系統(tǒng)漏洞的可能。

4.5.5格式約定

1、  所有SQL關(guān)鍵字大寫

2、  使用良好的變量命名規(guī)范

3、  保持良好的結(jié)構(gòu),包括空行、縮進(jìn)和空格等。

4、  塊狀的語(yǔ)句,一定要寫上BEGIN…END

5、  在每個(gè)存儲(chǔ)過(guò)程的開頭加上詳細(xì)的注釋:包括存儲(chǔ)過(guò)程名稱、參數(shù)說(shuō)明、功能說(shuō)明、返回?cái)?shù)據(jù)集說(shuō)明、以及作者和版權(quán)聲明。

6、  每個(gè)存儲(chǔ)過(guò)程內(nèi)的代碼前后必須加上SET NOCOUNT ON 和SET NOCOUNT OFF。

7、  存儲(chǔ)過(guò)程格式的示例如下:

  1. CREATE PROCEDURE User_AddUser 
  2.          @strUserName varchar(20), 
  3.          @strPwd varchar(50), 
  4.          @errno int = 0 OUTPUT
  5.          @errmsg varchar(255)=NULL OUTPUT 
  6. AS 
  7. BEGIN 
  8.          SET NOCOUNT ON 
  9.          /*以下是存儲(chǔ)過(guò)程的代碼*/ 
  10.          SET NOCOUNT OFF 
  11. END 

 4.6視圖命名

一個(gè)數(shù)據(jù)庫(kù)中的視圖名不能重復(fù)

視圖名=VI(前綴)+[表名]..[表名]+[描述]

4.7主鍵命名

一個(gè)數(shù)據(jù)庫(kù)中的主鍵名不能重復(fù)

主鍵名=PK_(前綴)+[表名]

例如:pk_Community

4.8外鍵命名

一個(gè)數(shù)據(jù)庫(kù)中的外鍵名不能重復(fù)

外鍵名=FK_(前綴)+[主表名]+[從表名]+[字段名]

考慮這樣一個(gè)關(guān)系,表Hotel,字段Id, Name, CityId。表City,字段Id,Name。因?yàn)橐粋€(gè)城市可能有好多家酒店,所以是一個(gè)一對(duì)多的關(guān)系,City是主表(1方),Hotel是從表(多方)。在Hotel表中,CityId是做為外鍵使用。

在實(shí)現(xiàn)外鍵的時(shí)候我們可以這樣寫:

ALTER TABLE HotelInfo
ADD CONSTRAINT FK_Hotel_City_Cityid  FOREIGN KEY (CityID) REFERENCES City(ID)

4.9觸發(fā)器命名

  1. 前綴(tr),描述了數(shù)據(jù)庫(kù)對(duì)象的類型。

  2. 基本部分,描述觸發(fā)器所加的表。

  3. 后綴(_I、_U、_D),顯示了修改語(yǔ)句(Insert, Update及Delete)

觸發(fā)器名=TR_(前綴)+[表名]+[ _I、_U、_D]+[字段\描述]

例如:TR _Communtiy_u_name(對(duì)表community的字段name進(jìn)行更新)

4.10 default約束

  使用格式如:DF_[表名]_[列名]

例如:DF _Community_Age

4.11CHECK 約束

格式:CK_[表名]_[列名]

例如:CK_Community_Number

4.12UNIQUE約束

格式:uq_[表名]_[列名]

例如:uq_Community_Name

4.13字段命名規(guī)范

1、字段不使用任何前綴(表名代表了一個(gè)名稱空間,字段前面再加前綴顯得羅嗦)

2、字典名也避免采用過(guò)于普遍過(guò)于簡(jiǎn)單的名稱:例如,用戶表中,用戶名的字段為UserName比Name更好。

3、布爾型的字段,以一些助動(dòng)詞開頭,更加直接生動(dòng):如,用戶是否有留言HasMessage,用戶是否通過(guò)檢查IsChecked等。

4、字段名為英文短語(yǔ)、形容詞+名詞或助動(dòng)詞+動(dòng)詞時(shí)態(tài)的形式表示,大小寫混合,遵循“見名知意”的原則。

4.14 SQL語(yǔ)句規(guī)范

1、不允許寫SELECT * FROM ……,必須指明需要讀取的具體字段。

2、不允許在應(yīng)用程序代碼中直接寫SQL語(yǔ)句訪問(wèn)數(shù)據(jù)庫(kù)。

3、避免在一行內(nèi)寫太長(zhǎng)的SQL語(yǔ)句,在SQL關(guān)鍵字的地方將SQL語(yǔ)句分成多行會(huì)更加清晰。

  如:SELECT UserID,UserName,UserPwd FROM User_Login WHERE AreaID=20

修改成:

 

  1. SELECT UserID,UserName,UserPwd 
  2. FROM User_Login 
  3. WHERE AreaID=20 

 

更加直觀

4、在一些塊形式的SQL語(yǔ)句中,就算只有一行代碼,也要加上BEGIN…END塊。

   如:IF EXISTS(…)

                            SET @nVar = 100

應(yīng)該寫成:

 

  1. IF EXISTS(…) 
  2. BEGIN 
  3.            SET @nVar = 100 
  4. END 

 

5、SQL批處理語(yǔ)句的空行和縮進(jìn)與一般的結(jié)構(gòu)化程序語(yǔ)言一致,應(yīng)該保持良好的代碼格式。

6、所有的SQL關(guān)鍵字大寫

4.15游標(biāo)使用約定

1、  若無(wú)必要,不要使用游標(biāo)

2、  包含游標(biāo)的存儲(chǔ)過(guò)程,必須對(duì)性能進(jìn)行認(rèn)真測(cè)試。

4.16索引命名規(guī)范

對(duì)于數(shù)據(jù)庫(kù)的維護(hù)建索引是很平常的事情,但是如果沒有一個(gè)規(guī)范化的命名,我們對(duì)于一個(gè)表的諸多索引可能需要花上一段時(shí)間的了解。

  1. 如果表中存在主鍵默認(rèn)情況下,表的聚集性索引也就是主鍵列,主鍵的命名前面已經(jīng)有提到過(guò),索引名也跟主鍵名一樣,(Pk_表名)

  2. 對(duì)于表上的非聚集索引,建議使用(IX0_表名,IX1_表名)….,這樣下去,這樣也很清晰地表達(dá)了索引,對(duì)于很多命名文章上提到的需要詳細(xì)表達(dá)出具體的列,我個(gè)人覺得沒有必要,首先聚集索引經(jīng)常涉及多列,很難羅列出所有列;還有影響美觀

當(dāng)你執(zhí)行SELECT  NAME  FROM SYS.COLUMNS 查詢索引時(shí),你根據(jù)NAME名很快就知道索引來(lái)自那張表,是否是非聚集索引,而不用根據(jù)OBJECTID列去跟對(duì)象表關(guān)聯(lián)。

4.17函數(shù)命名規(guī)范

函數(shù)命名分兩類:1.針對(duì)對(duì)象的函數(shù),2.用作輔助功能操作的函數(shù)(不針對(duì)具體的數(shù)據(jù)庫(kù)對(duì)象)

    1. ***類命名:FN_+[User]+_+[對(duì)象名] 例如:FN_User_Student(對(duì)于Student進(jìn)行操作函數(shù))

    2. 第二類命名:FN_[具體函數(shù)解釋] 例如:FN_Spit(對(duì)字段進(jìn)行拆分函數(shù))

原文鏈接:http://www.cnblogs.com/chenmh/p/3944116.html

責(zé)任編輯:彭凡 來(lái)源: 博客園
相關(guān)推薦

2011-08-12 14:18:38

SQL Server數(shù)設(shè)計(jì)規(guī)范

2010-04-12 15:53:09

Oracle

2010-05-11 18:57:53

MYSQL數(shù)據(jù)庫(kù)命名

2021-01-26 13:31:48

數(shù)據(jù)庫(kù)關(guān)系型數(shù)據(jù)庫(kù)冗余

2010-04-19 12:35:01

Oracle數(shù)據(jù)庫(kù)設(shè)計(jì)

2009-01-13 10:50:19

數(shù)據(jù)庫(kù)設(shè)計(jì)規(guī)范化

2015-07-28 10:33:17

.NETERP系統(tǒng)

2015-08-04 09:20:42

.NET數(shù)據(jù)庫(kù)設(shè)計(jì)規(guī)范

2024-04-25 09:14:57

數(shù)據(jù)庫(kù)Mysql阿里巴巴

2010-07-15 17:28:50

SQL Server

2010-04-27 16:31:41

Oracle數(shù)據(jù)庫(kù)

2019-10-12 00:39:23

MySQL數(shù)據(jù)庫(kù)Oracle

2021-05-17 06:57:34

SQLServer數(shù)據(jù)庫(kù)

2010-07-08 11:05:14

SQL Server數(shù)

2021-04-22 05:43:22

索引設(shè)計(jì)SET

2009-10-22 12:50:32

校園綜合布線系統(tǒng)

2010-06-30 11:16:50

SQL Server

2009-03-19 09:44:07

SQL Server數(shù)據(jù)庫(kù)遷移數(shù)據(jù)庫(kù)

2011-04-29 14:30:23

2011-04-01 17:05:44

SQL Server數(shù)日志
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)