規範化:將像一年這樣的靜態數值拆分到自己的表中是否被認為是合規的?
我正在與另一位數據庫設計師就規範化進行有趣的討論。在這個例子中,我們有一個 GameTitles 表,每條記錄都必須包含遊戲發布的年份。他說 2NF 要求所有內容都必須規範化,因此,為了符合要求,應該將年份欄位拆分為具有自己的主鍵的 ReleaseYears 表,該表由 GameTitles 表引用。我說它應該保留為 GameTitles 表本身的一個欄位。
我對此的論點是,一年只是一個非原始數值,本質上是靜態的(即,2011 永遠是 2011)。因此,它作為自己的標識符,不需要任何東西來引用它,因為它就是它。這也引入了額外的維護,因為您現在必須在表中添加一個新的年份來引用它。如果您使用大範圍的年份預先填充表,那麼您將擁有可能根本不會引用它們的額外記錄。這也增加了數據庫大小,因為您現在有一個額外的表、記錄成本以及年份本身的額外主鍵。如果您將年份保留為 GameTitles 表中的一個欄位,則可以消除所有這些額外的維護和成本。
對此有什麼想法?
**編輯:**打算在 StackOverflow 上發布。有人可以投票刪除或標記它以引起注意嗎?
另一個數據庫設計者是完全錯誤的,但你的推理也是錯誤的。假設您從這個表開始,它有一個候選鍵“game_title”。
Table: game_titles game_title year_first_released -- The first game 1998 The second game 1999 Best game: the third one 2001 The fourth game 2003 Forty-two, the end of games 2011
你通過問自己這些問題來評估它是否在 2NF 中。
Q:首先,是1NF嗎?
答:是的,是的。
問:主要屬性是什麼(作為候選鍵一部分的屬性)?
A:“game_title”是唯一的主要屬性。
問:什麼是非主要屬性?
A:“year_first_released”是唯一的。
問:“year_first_released”在功能上是依賴於整個“game_title”,還是僅依賴於其中的一部分?
A:唯一的候選鍵“game_title”是單列;它甚至沒有零件。所以“year_first_released”在功能上依賴於整個“game_title”。
這是。你找到了 2NF。
您可以通過先詢問它是否在 1NF 中,然後回答這個問題來跳過一些正式術語。
問:有沒有復合候選鍵?
答:沒有。
瞧。你又找到了 2NF。
根據定義,對於違反 2NF 的表,它必須至少有一個候選鍵具有多於一列。
以下是您拒絕朋友意見的原因。
- 一年只是一個非原始數值。
- 一年本質上是靜態的。
- 一年作為它自己的標識符。
- 年表介紹了額外的維護。
- 年份表可能包含未引用的額外行。
- 年份表會增加數據庫大小。
這些原因都與表是否在 2NF 中沒有任何關係。
在設計數據庫時,考慮維護問題、數據庫大小、未引用的行、範圍約束等並沒有錯。將這些東西稱為標準化是錯誤的。
哦,還有我在上面提供的那個兩列表——它在 5NF 中。
為任何屬性創建單獨的表與規範化無關。2NF、3NF、BCNF、4NF、5NF 都與消除非關鍵依賴關係有關。如果您將任何單個屬性刪除到新表並將其替換為外鍵屬性,則表中的依賴關係在邏輯上將與以前相同 - 因此表的修訂版本不會或多或少地標準化是以前。