數(shù)據(jù)庫(kù)設(shè)計(jì)三范式

設(shè)計(jì)關(guān)系數(shù)據(jù)庫(kù)時(shí)毅人,遵從不同的規(guī)范要求托启,設(shè)計(jì)出合理的關(guān)系型數(shù)據(jù)庫(kù)宅倒,這些不同的規(guī)范要求被稱為不同的范式,各種范式呈遞次規(guī)范屯耸,越高的范式數(shù)據(jù)庫(kù)冗余越小拐迁。

目前關(guān)系數(shù)據(jù)庫(kù)有六種范式:第一范式(1NF)、第二范式(2NF)疗绣、第三范式(3NF)线召、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF持痰,又稱完美范式)灶搜。

數(shù)據(jù)庫(kù)三范式

第一范式(1NF)

  • 所謂第一范式(1NF)是指在關(guān)系模型中,對(duì)域添加的一個(gè)規(guī)范要求工窍,所有的域都應(yīng)該是原子性的割卖,即數(shù)據(jù)庫(kù)表的每一列都是不可分割的原子數(shù)據(jù)項(xiàng),而不能是集合患雏,數(shù)組鹏溯,記錄等非原子數(shù)據(jù)項(xiàng)。即實(shí)體中的某個(gè)屬性有多個(gè)值時(shí)淹仑,必須拆分為不同的屬性丙挽。在符合第一范式(1NF)表中的每個(gè)域值只能是實(shí)體的一個(gè)屬性或一個(gè)屬性的一部分。簡(jiǎn)而言之匀借,第一范式就是無(wú)重復(fù)的域颜阐。
  • 說(shuō)明:在任何一個(gè)關(guān)系數(shù)據(jù)庫(kù)中,第一范式(1NF)是對(duì)關(guān)系模式的設(shè)計(jì)基本要求吓肋,一般設(shè)計(jì)中都必須滿足第一范式(1NF)凳怨。不過(guò)有些關(guān)系模型中突破了1NF的限制,這種稱為非1NF的關(guān)系模型。換句話說(shuō)肤舞,是否必須滿足1NF的最低要求紫新,主要依賴于所使用的關(guān)系模型。

第二范式(2NF)

  • 在1NF的基礎(chǔ)上李剖,非碼屬性必須完全依賴于候選碼(在1NF基礎(chǔ)上消除非主屬性對(duì)主碼的部分函數(shù)依賴)
  • 第二范式(2NF)是在第一范式(1NF)的基礎(chǔ)上建立起來(lái)的芒率,即滿足第二范式(2NF)必須先滿足第一范式(1NF)。第二范式(2NF)要求數(shù)據(jù)庫(kù)表中的每個(gè)實(shí)例或記錄必須可以被唯一地區(qū)分篙顺。選取一個(gè)能區(qū)分每個(gè)實(shí)體的屬性或?qū)傩越M偶芍,作為實(shí)體的唯一標(biāo)識(shí)。例如在員工表中的身份證號(hào)碼即可實(shí)現(xiàn)每個(gè)一員工的區(qū)分慰安,該身份證號(hào)碼即為候選鍵腋寨,任何一個(gè)候選鍵都可以被選作主鍵。在找不到候選鍵時(shí)化焕,可額外增加屬性以實(shí)現(xiàn)區(qū)分萄窜,如果在員工關(guān)系中,沒(méi)有對(duì)其身份證號(hào)進(jìn)行存儲(chǔ)撒桨,而姓名可能會(huì)在數(shù)據(jù)庫(kù)運(yùn)行的某個(gè)時(shí)間重復(fù)查刻,無(wú)法區(qū)分出實(shí)體時(shí),設(shè)計(jì)辟如ID等不重復(fù)的編號(hào)以實(shí)現(xiàn)區(qū)分凤类,被添加的編號(hào)或ID選作主鍵穗泵。(該主鍵的添加是在ER設(shè)計(jì)時(shí)添加,不是建庫(kù)時(shí)隨意添加)
  • 第二范式(2NF)要求實(shí)體的屬性完全依賴于主關(guān)鍵字谜疤。所謂完全依賴是指不能存在僅依賴主關(guān)鍵字一部分的屬性佃延,如果存在,那么這個(gè)屬性和主關(guān)鍵字的這一部分應(yīng)該分離出來(lái)形成一個(gè)新的實(shí)體夷磕,新實(shí)體與原實(shí)體之間是一對(duì)多的關(guān)系履肃。為實(shí)現(xiàn)區(qū)分通常需要為表加上一個(gè)列,以存儲(chǔ)各個(gè)實(shí)例的唯一標(biāo)識(shí)坐桩。簡(jiǎn)而言之尺棋,第二范式就是在第一范式的基礎(chǔ)上屬性完全依賴于主鍵。

第三范式(3NF)

  • 在2NF基礎(chǔ)上绵跷,任何非主屬性不依賴于其它非主屬性(在2NF基礎(chǔ)上消除傳遞依賴)
  • 第三范式(3NF)是第二范式(2NF)的一個(gè)子集膘螟,即滿足第三范式(3NF)必須滿足第二范式(2NF)。簡(jiǎn)而言之碾局,第三范式(3NF)要求一個(gè)關(guān)系中不包含已在其它關(guān)系已包含的非主關(guān)鍵字信息荆残。例如,存在一個(gè)部門信息表净当,其中每個(gè)部門有部門編號(hào)(dept_id)内斯、部門名稱、部門簡(jiǎn)介等信息。那么在員工信息表中列出部門編號(hào)后就不能再將部門名稱嘿期、部門簡(jiǎn)介等與部門有關(guān)的信息再加入員工信息表中。如果不存在部門信息表埋合,則根據(jù)第三范式(3NF)也應(yīng)該構(gòu)建它备徐,否則就會(huì)有大量的數(shù)據(jù)冗余。簡(jiǎn)而言之甚颂,第三范式就是屬性不依賴于其它非主屬性蜜猾,也就是在滿足2NF的基礎(chǔ)上,任何非主屬性不得傳遞依賴于主屬性振诬。

巴斯-科德范式(BCNF)

Boyce-Codd Normal Form(巴斯-科德范式)

  • 在3NF基礎(chǔ)上蹭睡,任何非主屬性不能對(duì)主鍵子集依賴(在3NF基礎(chǔ)上消除對(duì)主碼子集的依賴)
  • 巴斯-科德范式(BCNF)是第三范式(3NF)的一個(gè)子集,即滿足巴斯-科德范式(BCNF)必須滿足第三范式(3NF)赶么。通常情況下肩豁,巴斯-科德范式被認(rèn)為沒(méi)有新的設(shè)計(jì)規(guī)范加入,只是對(duì)第二范式與第三范式中設(shè)計(jì)規(guī)范要求更強(qiáng)辫呻,因而被認(rèn)為是修正第三范式清钥,也就是說(shuō),它事實(shí)上是對(duì)第三范式的修正放闺,使數(shù)據(jù)庫(kù)冗余度更小祟昭。這也是BCNF不被稱為第四范式的原因。某些書上怖侦,根據(jù)范式要求的遞增性將其稱之為第四范式是不規(guī)范篡悟,也是更讓人不容易理解的地方。而真正的第四范式匾寝,則是在設(shè)計(jì)規(guī)范中添加了對(duì)多值及依賴的要求搬葬。
  • 定義:關(guān)系模式R<U,F>∈1FNF,若X→Y且Y不是X的子集時(shí)X必含有碼,則R<U,F>∈BCNF旗吁。也就是說(shuō)踩萎,關(guān)系模式R<U,F>中,若每一個(gè)決定因素都包含碼很钓,則R<U,F>∈BCNF香府。

由BCNF的定義可以得到結(jié)論,一個(gè)滿足BCNF的關(guān)系模式有:

  • -所有非主屬性對(duì)每一個(gè)碼都是完全函數(shù)依賴码倦。
  • -所有主屬性對(duì)每一個(gè)不包含它的碼也是完全函數(shù)依賴企孩。
  • -沒(méi)有任何屬性完全函數(shù)依賴于非碼的任何一組屬性。
    若R∈BCNF袁稽,按定義排除了任何屬性對(duì)碼的傳遞依賴與部分依賴勿璃,所以R∈3NF。[1]
  • 一般關(guān)系型數(shù)據(jù)庫(kù)設(shè)計(jì)中,達(dá)到BCNF就可以了补疑!

【數(shù)據(jù)庫(kù)五大約束】

  • 1.primary KEY:設(shè)置主鍵約束歧沪;
  • 2.UNIQUE:設(shè)置唯一性約束,不能有重復(fù)值莲组;
  • 3.DEFAULT 默認(rèn)值約束诊胞,height DOUBLE(3,2)DEFAULT 1.2 height不輸入是默認(rèn)為1,2
  • 4.NOT NULL:設(shè)置非空約束,該字段不能為空锹杈;
  • 5.FOREIGN key :設(shè)置外鍵約束撵孤。

【主鍵】

  • 1.主鍵的注意事項(xiàng)?
    主鍵默認(rèn)非空竭望,默認(rèn)唯一性約束邪码,只有主鍵才能設(shè)置自動(dòng)增長(zhǎng),自動(dòng)增長(zhǎng)一定是主鍵咬清,主鍵不一定自動(dòng)增長(zhǎng)闭专;
  • 2.設(shè)置主鍵的方式?
    在定義列時(shí)設(shè)置:ID INT PRIMARY KEY
    在列定義完之后設(shè)置:primary KEY(id)

【外鍵】

  • 1.設(shè)置外鍵的注意事項(xiàng):

只有INNODB的數(shù)據(jù)庫(kù)引擎支持外鍵旧烧,修改my.ini文件設(shè)置default-storage-engine=INNODB 外鍵必須與參照列的數(shù)據(jù)類型必須相同(數(shù)值型要求長(zhǎng)度和無(wú)符號(hào)都相同喻圃,字符串要求類型相同,長(zhǎng)度可以不同)粪滤。

  • 2設(shè)置外鍵的語(yǔ)法:

    CONSTRAINT 外鍵名 FOREIGN KEY (外鍵字段)REFERENCES 參照表 (參照字段) ON DELETE SET NULL ON UPDATE CASCADE 設(shè)置參照完整性

  • 3.外鍵約束的參照操作斧拍?

參照表的完整性操作:當(dāng)對(duì)參照表的參照字段進(jìn)行刪除或更新時(shí),外鍵表中的外鍵如何應(yīng)對(duì)杖小;

參照操作可選值:

  • RESTRICT拒絕參照表刪除或更新參照字段肆汹;

  • RESTRICT和NO ACTION相同,但這個(gè)指令只在mysql生效;

  • CASCADE刪除或更新參照表的參照字段時(shí)予权,外鍵表的記錄同步刪除更新昂勉;

  • SET NULL 刪除或更新參照表的參照字段時(shí),外鍵表的外鍵設(shè)為NULL;

  • 1NF, 字段不可再分扫腺。這個(gè)關(guān)系數(shù)據(jù)庫(kù)強(qiáng)制了岗照,想建立復(fù)合的字段也建立不起來(lái)。關(guān)系數(shù)據(jù)庫(kù)出現(xiàn)之前才有這個(gè)問(wèn)題笆环。
  • 2NF攒至,主鍵依賴,就是一張表里面的字段躁劣,必須是跟主鍵相關(guān)的迫吐,不能把無(wú)關(guān)的數(shù)據(jù)放進(jìn)來(lái)。主鍵依賴账忘,實(shí)質(zhì)就是志膀,這個(gè)信息如果是對(duì)象的屬性熙宇,就放進(jìn)來(lái),否則就不放溉浙。
  • 3NF烫止,就是不能重復(fù)存儲(chǔ)相同的信息。這個(gè)情況戳稽,其實(shí)是在一個(gè)對(duì)象里引用了另外一個(gè)對(duì)象烈拒,這個(gè)時(shí)候,存一個(gè)引用就夠了广鳍,而不是重復(fù)的存儲(chǔ)這個(gè)對(duì)象的多個(gè)副本。
  • 2NF和3NF的本質(zhì)是吓妆,對(duì)象的屬性依賴對(duì)象赊时。數(shù)據(jù)庫(kù)的主鍵,作用是什么行拢?它用來(lái)唯一的標(biāo)識(shí)這個(gè)對(duì)象祖秒,同時(shí),用來(lái)給其他對(duì)象引用 引用 引用(重要的事情說(shuō)三次)
    所以舟奠,實(shí)戰(zhàn)中竭缝,所有數(shù)據(jù)庫(kù)都是用int類型做主鍵(int,或者bigint)沼瘫,而且抬纸,主鍵一律是自增,這是不成文的規(guī)則耿戚,凡是不遵守這個(gè)規(guī)則的湿故,都是錯(cuò)的(雖然理論上可以)這樣,
    數(shù)據(jù)庫(kù)寫數(shù)據(jù)的時(shí)候膜蛔,幾乎是永遠(yuǎn)不寫入同一個(gè)對(duì)象的重復(fù)信息的坛猪,需要重復(fù)的時(shí)候,只寫這個(gè)對(duì)象的ID
create table Courses(
    CourseID int identity primary key,
    CourseName nvarchar(50) not null
)
create table Departments( 
DepartmentID int identity primary key,  DepartmentName nvarchar(50) not null,   HeadName nvarchar(50) not null);

create table Students(  StudentID int identity primary key, Name nvarchar(50),  
DepartmentID int not null   Constraint FkStudentDepartment foreign key (DepartmentID) references Departments(DepartmentID));

create table Results(   
ResultID int identity primary key,  StudentID int not null, CourseID int not null,  Result int not null,
Constraint FkResultStudent foreign key  (StudentID) references Students(StudentID));

11.數(shù)據(jù)庫(kù)設(shè)計(jì)基礎(chǔ)原則:三范式

  • 1)表必須有主鍵
  • 2)字段內(nèi)容不能是其他的字段加工而成
  • 3)行數(shù)據(jù)不能相同

12.現(xiàn)今業(yè)界主流數(shù)據(jù)庫(kù)設(shè)計(jì)原則:反三范式

  • 1)表不是必須有主鍵
  • 2)字段存一些加工后的中間的結(jié)果皂股,冗余設(shè)計(jì)
  • 3)記錄冗余

三范式追求的目標(biāo)存儲(chǔ)空間盡量惺浴;反三范式追求的目標(biāo)是查詢速度呜呐。
創(chuàng)建數(shù)據(jù)庫(kù)設(shè)計(jì)時(shí)首先按三范式設(shè)計(jì)就斤,然后局部?jī)?yōu)化。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蘑辑,一起剝皮案震驚了整個(gè)濱河市战转,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌以躯,老刑警劉巖槐秧,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件啄踊,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡刁标,警方通過(guò)查閱死者的電腦和手機(jī)颠通,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)膀懈,“玉大人顿锰,你說(shuō)我怎么就攤上這事∑袈В” “怎么了硼控?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)胳赌。 經(jīng)常有香客問(wèn)我牢撼,道長(zhǎng),這世上最難降的妖魔是什么疑苫? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任熏版,我火速辦了婚禮,結(jié)果婚禮上捍掺,老公的妹妹穿的比我還像新娘撼短。我一直安慰自己,他們只是感情好挺勿,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布曲横。 她就那樣靜靜地躺著,像睡著了一般不瓶。 火紅的嫁衣襯著肌膚如雪胜榔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天湃番,我揣著相機(jī)與錄音夭织,去河邊找鬼。 笑死吠撮,一個(gè)胖子當(dāng)著我的面吹牛尊惰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播泥兰,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼弄屡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了鞋诗?” 一聲冷哼從身側(cè)響起锡搜,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤象对,失蹤者是張志新(化名)和其女友劉穎蜕提,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秀仲,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年壶笼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了神僵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡覆劈,死狀恐怖保礼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情责语,我是刑警寧澤炮障,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站坤候,受9級(jí)特大地震影響胁赢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜铐拐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望练对。 院中可真熱鬧遍蟋,春花似錦、人聲如沸螟凭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)螺男。三九已至棒厘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間下隧,已是汗流浹背奢人。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留淆院,地道東北人何乎。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像土辩,于是被迫代替她去往敵國(guó)和親支救。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容