Normalization

規範化:將像一年這樣的靜態數值拆分到自己的表中是否被認為是合規的?

  • August 27, 2011

我正在與另一位數據庫設計師就規範化進行有趣的討論。在這個例子中,我們有一個 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 都與消除非關鍵依賴關係有關。如果您將任何單個屬性刪除到新表並將其替換為外鍵屬性,則表中的依賴關係在邏輯上將與以前相同 - 因此表的修訂版本不會或多或少地標準化是以前。

引用自:https://dba.stackexchange.com/questions/4889