项目小结之数据库设计
????? 最近做了一個(gè)小項(xiàng)目完整的數(shù)據(jù)庫設(shè)計(jì),想總結(jié)一些設(shè)計(jì)上的所得,希望大家多多指教。
????? 有時(shí)一個(gè)項(xiàng)目,普通程序員一般不會去接觸數(shù)據(jù)庫設(shè)計(jì),一般都有專業(yè)的DBA或是老程序員去設(shè)計(jì),下面是我推測的幾點(diǎn)可能原因:
????? 1:新手對項(xiàng)目了解不深,正好這是老鳥的長處。
????? 2:新手對局部的關(guān)注往往大于整體,很難考慮的特別周全。
????? 3:數(shù)據(jù)庫設(shè)計(jì)的好壞在某種程度上直接影響項(xiàng)目的復(fù)雜度以及性能。
????? 第一:我們要知道什么是范式,為什么說到數(shù)據(jù)庫設(shè)計(jì)總要提到一個(gè)名詞:范式。范式:符合某一種級別的關(guān)系模式的集合。設(shè)計(jì)數(shù)據(jù)庫必須遵循一定的規(guī)則,在關(guān)系數(shù)據(jù)庫中,這種規(guī)則就是范式。
????? 第二:范式的分類。關(guān)系數(shù)據(jù)庫中的關(guān)系必須滿足一定的要求,目前關(guān)系數(shù)據(jù)庫有六種范式:第一范式、第二范式、第三范式、第四范式、第五范式和第六范式。滿足最低要求的是第一范式,其余范式以次類推。這么多的分類并不一定要求全部滿足,平時(shí)我們通常是達(dá)到第三范式就行。
?????? 第三:范式的作用?
??????? 1:優(yōu)點(diǎn):是將其轉(zhuǎn)化為一些表的過程,這種方法可以使從數(shù)據(jù)庫得到的結(jié)果更加明確。
??????? 2:缺點(diǎn):可能使數(shù)據(jù)庫產(chǎn)生重復(fù)數(shù)據(jù),從而導(dǎo)致創(chuàng)建多余的表。
??????? 3:是在識別數(shù)據(jù)庫中的數(shù)據(jù)元素、關(guān)系,以及定義所需的表和各表中的項(xiàng)目這些初始工作之后的一個(gè)細(xì)化的過程。
??????? 4:設(shè)計(jì)范式是數(shù)據(jù)庫設(shè)計(jì)所需要滿足的規(guī)范,滿足這些規(guī)范的數(shù)據(jù)庫是簡潔的、結(jié)構(gòu)明晰的,也不會發(fā)生插入、刪除和更新操作異常。反之則給編程人員制造麻煩,可能存儲了大量不需要的冗余信息。?
????? 下面來簡單介紹下前三種范式:
?????? 一:第一范式。是對關(guān)系模式的基本要求,不滿足第一范式的數(shù)據(jù)庫就不是關(guān)系數(shù)據(jù)庫。 所謂第一范是指數(shù)據(jù)庫表的每一列都是不可分割的基本數(shù)據(jù)項(xiàng),同一列中不能有多個(gè)值,即實(shí)體中的某個(gè)屬性不能有多個(gè)值或者不能有重復(fù)的屬性。如果出現(xiàn)重復(fù)的屬性,就可能需要定義一個(gè)新的實(shí)體,新的實(shí)體由重復(fù)的屬性構(gòu)成,新實(shí)體與原實(shí)體之間為一對多關(guān)系。這個(gè)單一屬性由基本類型構(gòu)成,包括整型、實(shí)數(shù)、字符型、邏輯型、日期型等。 例如有一張存儲文件的表,正確應(yīng)該是這樣:可以看到這個(gè)表包含了好幾個(gè)列,如果我們把這些信息都放在一列里面那么就不滿足上面定義的1NF了。
???ID???????????????????int??????????????????identity,
???Title????????????????nvarchar(200)????????null,
???FileAddress??????????varchar(255)?????????null,
???OpenDate?????????????datetime?????????????null,
???TypeID???????????????int??????????????????null,
???PostDate?????????????datetime?????????????null,
???constraint?PK_REGULATIONS?primary?key?(ID)
)
???
?????? 二:第二范式:在第一范式的基礎(chǔ)上建立起來的。要求數(shù)據(jù)庫表中的每個(gè)實(shí)例或行必須可以被惟一地區(qū)分。通常需要為表加上一個(gè)列,以存儲各個(gè)實(shí)例的惟一標(biāo)識。這個(gè)惟一屬性列被稱為主關(guān)鍵字或主鍵、主碼。像上面的Regulations的ID列就是一個(gè)身份標(biāo)識列(identity)。
?
?????? 三:第三范式:要求一個(gè)數(shù)據(jù)庫表中不包含已在其它表中已包含的非主關(guān)鍵字信息。例如:上面有了一個(gè)文件表 Regulations,如果這個(gè)表是存儲的主文件,它相應(yīng)的還有n個(gè)附件信息的話,我們就需要?jiǎng)?chuàng)建另外一張附件表來存儲附件。兩表如何聯(lián)系起來呢,我們可以把主文件表的主鍵隨同附件信息做為一條記錄插入到附件表中,這里插入的主文件表信息中只包含了主鍵ID,并沒有插入其它信息,這種關(guān)系就滿足了第三范式要求。
create?table?Attachment?(???ID???????????????????int??????????????????identity,
???FileID???????????????int??????????????????null,//主文件主鍵ID
???Address??????????????varchar(255)?????????null,
???Title????????????????nvarchar(200)????????null,
???constraint?PK_ATTACHMENT?primary?key?(ID)
)
???????
????? 最后來總結(jié)了我這個(gè)項(xiàng)目中的具體應(yīng)用:
?
?
??????? 每一個(gè)模塊在插入記錄時(shí)都或多或少有這樣的選項(xiàng),如果每一張表都建一個(gè)對應(yīng)的選項(xiàng)表的話,維護(hù)進(jìn)來工作量相當(dāng)大,所有可以把這些小數(shù)據(jù)量的選項(xiàng)存儲到一張表,數(shù)據(jù)字典表如下:
??????? 下面是數(shù)據(jù)字典的數(shù)據(jù)展示圖:
?
????? 第二:對數(shù)據(jù)庫表字段數(shù)據(jù)類型的設(shè)置有了進(jìn)一步認(rèn)識。
???????? 1:SQL有一種特殊的數(shù)據(jù)類型;Unicode 數(shù)據(jù)類型,包括 Nchar,Nvarchar 和Ntext 傳統(tǒng)的非 Unicode 數(shù)據(jù)類型允許使用由特定字符集定義的字符。使用 Unicode 數(shù)據(jù)類型,列中可以存儲任何由Unicode 標(biāo)準(zhǔn)定義的字符。在 Unicode 標(biāo)準(zhǔn)中,包括了以各種字符集定義的全部字符。使用Unicode數(shù)據(jù)類型,所占用的空間是使用非 Unicode 數(shù)據(jù)類型的兩倍。當(dāng)列的長度變化時(shí),應(yīng)該使用Nvarchar 字符類型。當(dāng)列的長度固定不變時(shí),應(yīng)該使用 Nchar 字符類型。我們在表單驗(yàn)證時(shí),用戶有時(shí)會輸入英文和中文混合文字,為了驗(yàn)證方便,可以將這種情況時(shí)的字段設(shè)置成Unicode 。
?????????2:對于非Unicode 數(shù)據(jù),盡量選擇相對應(yīng)的類型,例如手機(jī)號碼一般都是數(shù)字組成,且長度基本固定,設(shè)置成char(15)就行,email設(shè)置成varchar(100)就行。
????? 第三:如何靈活利用一對多關(guān)系。一對多的關(guān)系非常常見,但如果加以靈活應(yīng)用有時(shí)效果更佳。
????????? 例如,上面的圖中有一個(gè)了解管道的選項(xiàng),它和對應(yīng)的主表是一對多的關(guān)系,如果這個(gè)選項(xiàng)在不同的模塊中出現(xiàn),我們是否需要為每個(gè)主表建立一個(gè)一對多關(guān)系呢?我選擇做一個(gè)中間關(guān)系表。我們可以把所有模塊中包含了了解管道選項(xiàng)的主表與這個(gè)中間關(guān)系表聯(lián)系起來,這樣就只用維護(hù)這一個(gè)關(guān)系表就行了,節(jié)約不少時(shí)間。
?
?
?
總結(jié)
以上是生活随笔為你收集整理的项目小结之数据库设计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于中国神仙的研究
- 下一篇: Linux中常用到的命令