10年前,我的老師曾經(jīng)在數(shù)據(jù)庫(kù)課上跟我們講到了mysql五種范式,今天在這里和大家分享一下。
首先,什么是范式(norm)?和它有關(guān)的術(shù)語(yǔ)有關(guān)系(relation)、屬性(attribute)、分量(component)、鍵(key)、依賴(dependency)、正規(guī)化(normalization)等。范式是關(guān)系型數(shù)據(jù)庫(kù)設(shè)計(jì)的一種標(biāo)準(zhǔn),是衡量數(shù)據(jù)庫(kù)設(shè)計(jì)合理性的一個(gè)標(biāo)準(zhǔn),它規(guī)定了一個(gè)數(shù)據(jù)庫(kù)的表單如何分解以及如何分配數(shù)據(jù)。
mysql有五種范式:
1NF(第一范式):字段不可再分。每個(gè)字段都是具有原子性的不可再分成其他的字段,例如一個(gè)人的姓名,名稱是不能再進(jìn)行分解的。 2NF(第二范式):表中不存在非關(guān)鍵字段對(duì)任一候選關(guān)鍵字段的部分函數(shù)依賴。這個(gè)要求我們將表進(jìn)行劃分,將部分?jǐn)?shù)據(jù)放到另一個(gè)表中。 3NF(第三范式):表中不存在依賴于非關(guān)鍵字段的傳遞依賴關(guān)系。例如學(xué)生成績(jī)表中,學(xué)生姓名和學(xué)生成績(jī)是具有關(guān)聯(lián)關(guān)系,但是若是將學(xué)生班級(jí)呢?班級(jí)和學(xué)生同樣是存在關(guān)聯(lián)關(guān)系的,但是并不存在與其他的關(guān)聯(lián),這個(gè)時(shí)候我們需要將班級(jí)信息單獨(dú)拎出來(lái)進(jìn)行關(guān)聯(lián)。 BCNF(巴斯-科德范式):全稱是巴斯-科德范式,即對(duì)于任意一個(gè)非平凡的join依賴X ->Y,X 必須是 Y 的超鍵(即 X 是一個(gè)碼)是指每個(gè)屬性都不依賴于他們之間的依賴關(guān)系,只依賴于主鍵。 4NF(第四范式):表中不存在依賴于多值屬性的非平凡多值依賴。一個(gè)非平凡的多值依賴是指在一個(gè)屬性中包含多個(gè)相關(guān)的值時(shí),如果這個(gè)屬性和表中的其他屬性有著關(guān)聯(lián),那么這個(gè)屬性就稱為多值依賴。 5NF(第五范式):即每個(gè)不可分解的且無(wú)重復(fù)數(shù)據(jù)的關(guān)系都在模式中定義有一個(gè)鍵,證明了關(guān)系模式的不錯(cuò)合分性,強(qiáng)調(diào)的是關(guān)系模式的不可合并性。
最后,我們需要指出的是,范式不是越高越好,過(guò)度的規(guī)范化處理可能會(huì)增加數(shù)據(jù)庫(kù)設(shè)計(jì)的復(fù)雜度,處理查詢的效率也可能會(huì)降低。在實(shí)際使用時(shí)我們需要根據(jù)具體的需求來(lái)進(jìn)行設(shè)計(jì)。