DB 資料庫設計

2021-10-09 07:40:51 字數 3784 閱讀 8989

二、設計正規化

設計關聯式資料庫時,遵從不同的規範要求,設計出合理的關係型資料庫,這些不同的規範要求被稱為不同的正規化,各種正規化呈遞次規範,越高的正規化資料庫冗餘越小。

目前關聯式資料庫有六種正規化:第一正規化(1nf)、第二正規化(2nf)、第三正規化(3nf)、巴斯-科德正規化(bcnf)、第四正規化(4nf)和第五正規化(5nf,又稱完美正規化)。

以下僅介紹前三種設計正規化。通常,滿足前三種設計正規化的資料庫可以滿足絕大多數的資料儲存需求。

第一正規化(1nf):每一列都是不可分割的原子資料項

第二正規化(2nf):在1nf的基礎上,非碼屬性必須完全依賴於碼(在1nf基礎上消除非主屬性對主碼的部分函式依賴)

第三正規化(3nf):在2nf基礎上,任何非主屬性不依賴於其它非主屬性(在2nf基礎上消除傳遞依賴)

案例分析:**的設計和優化

觀察以下**,從設計正規化的角度出發,分析**資料的儲存方式存在哪些問題?如何改進?

顯然,這張**不滿足第一正規化。因為,對於 「系」 字段,它不是乙個原子資料項,它可以繼續拆分成 「系名」 和 「系主任」 兩個字段。所以,該錶目前不滿足所有的設計正規化。

為了使**滿足第一正規化,需要修改 「系」 字段:

此時,**已經滿足第一正規化,所有欄位都是不可分割的原子資料項。然而,這張表依然存在一些問題:

存在非常嚴重的資料冗餘(重複):姓名、系名、系主任

資料新增存在問題:新增新開設的系和系主任時,資料不合法

資料刪除存在問題:張無忌同學畢業了,刪除資料,會將系的資料一起刪除。

這些問題只有通過引入第二正規化第三正規化才能解決。為了理解第二正規化,需要先掌握以下概念

函式依賴:a–>b,如果通過a屬性(屬性組)的值,可以確定唯一b屬性的值。則稱b依賴於a。

例如:學號-->姓名;(學號,課程名稱) --> 分數
完全函式依賴:完全函式依賴:a–>b, 如果a是乙個屬性組,則b屬性值得確定需要依賴於a屬性組中所有的屬性值。

例如:(學號,課程名稱) --> 分數
部分函式依賴:a–>b, 如果a是乙個屬性組,則b屬性值得確定只需要依賴於a屬性組中某一些值即可。

例如:(學號,課程名稱) -- > 姓名
傳遞函式依賴:a–>b, b – >c . 如果通過a屬性(屬性組)的值,可以確定唯一b屬性的值,在通過b屬性(屬性組)的值可以確定唯一c屬性的值,則稱c傳遞函式依賴於a

例如:學號-->系名,系名-->系主任
:如果在一張表中,乙個屬性或屬性組,被其他所有屬性所完全依賴,則稱這個屬性(屬性組)為該錶的碼。

例如:該表中碼為(學號,課程名稱)
主屬性(碼屬性):碼屬性組中的所有屬性。

非主屬性(非碼屬性):除去碼屬性組的屬性。

結合第二正規化的描述:在1nf基礎上消除非主屬性對主碼的部分函式依賴。在滿足inf的表中,碼屬性組是(學號,課程名稱),只有 「分數」 完全依賴於主碼;而 「姓名」、「系名」 和 「系主任」 欄位只依賴於 「學號」,它們都屬於部份依賴於主碼,顯然當前的**不滿足2nf。

為了使資料儲存進一步滿足第二正規化,首先需要對**的內容進行拆分:將原表中區域性依賴於主碼組的字段單獨抽取出來,將這些欄位與它們完全依賴的 「學號」 欄位組在一起建一張新錶:

此時,右表存在天然的資料冗餘,將冗餘記錄去除後發現:左表儲存了學生的課程和分數,右表儲存了學生的基礎資訊。將左表稱為 「選課表」,右表稱為 「學生表」。

此時,對於這兩張表而言,它們中的所有欄位都屬於原子資料項,且 「分數」 完全依賴於(「學號」,「課程名稱」),「姓名」、「系名」、「系主任」 完全依賴於 「學號」。兩張表均滿足第二正規化

至此,回頭思考之前發現的 3 個問題,發現第 1 個問題已經解決,資料不再有嚴重的冗餘情況。但是,對於 2,3 問題,無論是新增新的專業還是去掉某個學生的記錄,都會是**再次處於不合法的狀態。解決這兩個問題,需要借助第三正規化的設計思路。

根據第三正規化的描述可知,需要在 2nf 基礎上消除**中的傳遞依賴。觀察學生表發現:「系名」 完全依賴於 「學號」,而 「系主任」 雖然也完全依賴於 「學號」,但同時也完全依賴於 「系名」。因此,「學號」、「系名」、「系主任」構成了傳遞依賴

為了進一步使資料儲存滿足第三正規化,將學生表中的 「系名」 和 「系主任」 字段提取,構造一張新錶稱為 「係表」,主鍵設為 「系名」。原來的學生表只儲存係表中的主鍵,並剔除係表中的冗餘記錄。

此時,在消除傳遞依賴後,對學生資訊的增刪改不再影響教師資訊的儲存,而對教師資訊的增刪改也不再影響學生資訊的儲存。整體資料的儲存滿足第三正規化

mysql資料庫 DB類

mysql資料庫 db類 package db author yytcpt 無影 version 2008 03 27 copyrigth class db else if this connection id if mysql select db db config database this c...

redis之db(資料庫)

一台伺服器上都快開啟200個redis例項了,看著就崩潰了。這麼做無非就是想讓不同型別的資料屬於不同的應用程式而彼此分開 那麼,redis有沒有什麼方法使不同的應用程式資料彼此分開同時又儲存在相同的例項上呢?redis下預設有16個資料庫,每個資料庫都有屬於自己的空間,不必擔心之間的key衝突。re...

建立 DB2 資料庫

可以使用 tivoli privacy manager 資料庫建立程式或使用資料庫產品介面可以建立 tivoli privacy manager 資料庫 表和配置資料庫。使用 db2 資料庫建立程式 使用 tivoli privacy manager 資料庫建立程式來建立 tivoli privac...