国产成人精品亚洲777人妖,欧美日韩精品一区视频,最新亚洲国产,国产乱码精品一区二区亚洲

您的位置:首頁技術(shù)文章
文章詳情頁

詳解MySQL 數(shù)據(jù)庫范式

瀏覽:3日期:2023-10-09 09:07:43

前言:

關(guān)于數(shù)據(jù)庫范式,時常有聽說過,一直沒有詳細(xì)去了解。一般數(shù)據(jù)庫書籍或數(shù)據(jù)庫課程會介紹范式相關(guān)內(nèi)容,范式也經(jīng)常出現(xiàn)在數(shù)據(jù)庫考試題目中。不清楚你是否對范式有比較清晰的了解呢?本篇文章我們一起來學(xué)習(xí)下數(shù)據(jù)庫范式吧。

1.數(shù)據(jù)庫范式簡介

為了建立冗余較小、結(jié)構(gòu)合理的數(shù)據(jù)庫,設(shè)計數(shù)據(jù)庫時必須遵循一定的規(guī)則。在關(guān)系型數(shù)據(jù)庫中這種規(guī)則就稱為范式。范式是符合某一種設(shè)計要求的總結(jié)。要想設(shè)計一個結(jié)構(gòu)合理的關(guān)系型數(shù)據(jù)庫,必須滿足一定的范式。

范式的英文名稱是 Normal Form ,簡稱 NF 。它是英國人 E.F.Codd 在上個世紀(jì)70年代提出關(guān)系數(shù)據(jù)庫模型后總結(jié)出來的。范式是關(guān)系數(shù)據(jù)庫理論的基礎(chǔ),也是我們在設(shè)計數(shù)據(jù)庫結(jié)構(gòu)過程中所要遵循的規(guī)則和指導(dǎo)方法。

目前關(guān)系型數(shù)據(jù)庫有六種常見范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又稱完美范式)。滿足最低要求的范式是第一范式(1NF)。在第一范式的基礎(chǔ)上進(jìn)一步滿足更多規(guī)范要求的稱為第二范式(2NF),其余范式以次類推。

2.常用范式詳解

在設(shè)計數(shù)據(jù)庫時,會參考范式要求來做,但是并不是說遵循的范式等級越高越好,范式過高雖然具有對數(shù)據(jù)關(guān)系有更好的約束性,但是也會導(dǎo)致表之間的關(guān)系更加繁瑣,從而導(dǎo)致每次操作的表會變多,數(shù)據(jù)庫性能下降。通常,在關(guān)系型數(shù)據(jù)庫設(shè)計中,最高也就遵循到 BCNF ,普遍還是 3NF 。即一般情況下,我們使用前三個范式已經(jīng)夠用了。下面我們來詳細(xì)了解下常用的前三個范式。

第一范式(1NF)

第一范式是最基本的范式。如果數(shù)據(jù)庫表中的所有字段值都是不可分解的原子值,就說明該數(shù)據(jù)庫表滿足了第一范式。簡單的講第一范式就是每一行的各個數(shù)據(jù)都是不可分割的,同一列中不能有多個值,如果出現(xiàn)重復(fù)的屬性就需要定義一個新的實(shí)體。

示例:假設(shè)一家公司要存儲其員工的姓名和聯(lián)系方式。它創(chuàng)建一個如下表:

詳解MySQL 數(shù)據(jù)庫范式

兩名員工(Jon&Lester)擁有兩個手機(jī)號碼,因此公司將他們存儲在同一表格中,如上表所示。那么該表不符合 1NF ,因?yàn)橐?guī)則說“表的每個屬性必須具有原子(單個)值”,Jon&Lester員工的 emp_mobile 值違反了該規(guī)則。為了使表符合 1NF ,我們應(yīng)該有如下表數(shù)據(jù):

詳解MySQL 數(shù)據(jù)庫范式

第二范式(2NF)

第二范式在第一范式的基礎(chǔ)之上更進(jìn)一層。第二范式需要確保數(shù)據(jù)庫表中的每一列都和主鍵相關(guān),而不能只與主鍵的某一部分相關(guān)(主要針對聯(lián)合主鍵而言)。也就是說在一個數(shù)據(jù)庫表中,一個表中只能保存一種數(shù)據(jù),不可以把多種數(shù)據(jù)保存在同一張數(shù)據(jù)庫表中。

+----------+-------------+-------+| employee | department | head |+----------+-------------+-------+| Jones | Accountint | Jones || Smith | Engineering | Smith || Brown | Accounting | Jones || Green | Engineering | Smith |+----------+-------------+-------+

上表描述了被雇傭者,工作部門和領(lǐng)導(dǎo)的關(guān)系。我們把能夠唯一表示數(shù)據(jù)庫中表的一行的數(shù)據(jù)成為這個表的主鍵。表中 head 列不和主鍵相關(guān)。因此,該表是不符合第二范式的,為了使上面的表符合第二范式,需要將它拆分為兩個表:

-- employee 為主鍵+----------+-------------+| employee | department |+----------+-------------+| Brown | Accounting || Green | Engineering || Jones | Accounting || Smith | Engineering |+----------+-------------+-- department 為主鍵+-------------+-------+| department | head |+-------------+-------+| Accounting | Jones || Engineering | Smith |+-------------+-------+

第三范式(3NF)

滿足 2NF 的前提下,非主鍵外的所有字段必須互不依賴,即需要確保數(shù)據(jù)表中的每一列數(shù)據(jù)都和主鍵直接相關(guān),而不能間接相關(guān)。

簡而言之,第三范式(3NF)要求一個關(guān)系中不包含已在其它關(guān)系已包含的非主關(guān)鍵字信息。例如,存在一個部門信息表,其中每個部門有部門編號(dept_id)、部門名稱、部門簡介等信息。那么在員工信息表中列出部門編號后就不能再將部門名稱、部門簡介等與部門有關(guān)的信息再加入員工信息表中。如果不存在部門信息表,則根據(jù)第三范式(3NF)也應(yīng)該構(gòu)建它,否則就會有大量的數(shù)據(jù)冗余。

3.關(guān)于反范式

范式的優(yōu)點(diǎn)是明顯的,它避免了大量的數(shù)據(jù)冗余,節(jié)省了存儲空間,保持了數(shù)據(jù)的一致性。范式化的表通常更小,可以更好地放在內(nèi)存里,所以執(zhí)行操作會更快。那么是不是只要把所有的表都規(guī)范為 3NF 后,數(shù)據(jù)庫的設(shè)計就是最優(yōu)的呢?這可不一定。范式越高意味著表的劃分更細(xì),一個數(shù)據(jù)庫中需要的表也就越多,用戶不得不將原本相關(guān)聯(lián)的數(shù)據(jù)分?jǐn)偟蕉鄠€表中。稍微復(fù)雜一些的查詢語句在符合范式的數(shù)據(jù)庫上都可能需要至少一次關(guān)聯(lián),也許更多,這不但代價昂貴,也可能使一些索引策略無效。

所以我們在進(jìn)行數(shù)據(jù)庫設(shè)計時,并不會完全按照范式要求來做,有時候也會進(jìn)行反范式設(shè)計。通過增加冗余或重復(fù)的數(shù)據(jù)來提高數(shù)據(jù)庫的讀性能,減少關(guān)聯(lián)查詢時,join 表的次數(shù)。

以上就是詳解MySQL 數(shù)據(jù)庫范式的詳細(xì)內(nèi)容,更多關(guān)于MySQL 數(shù)據(jù)庫范式的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: MySQL 數(shù)據(jù)庫
相關(guān)文章:
主站蜘蛛池模板: 乌拉特中旗| 潮州市| 鸡东县| 五原县| 汝南县| 兴山县| 玉树县| 茌平县| 报价| 新巴尔虎左旗| 郯城县| 武清区| 兴仁县| 河源市| 鞍山市| 苍南县| 福安市| 武宣县| 铜陵市| 平湖市| 扎赉特旗| 抚宁县| 乡宁县| 井陉县| 扎赉特旗| 保定市| 盐边县| 永州市| 广水市| 新津县| 定远县| 揭阳市| 河曲县| 长武县| 克拉玛依市| 襄樊市| 绩溪县| 永宁县| 定兴县| 陆河县| 定结县|