資料庫正規化是資料庫設計的一個重要概念,其主要目的是確保資料以最有效率和一致的方式儲存在資料庫中。資料庫正規化的核心思想是將資料分割成多個相關的表格,並建立適當的關聯,以減少資料的重複存儲並確保資料的完整性。
避免資料重複:資料庫正規化的一個主要目標是避免資料的重複。這意味著相同的資料不應該儲存在多個地方,而應該在一個地方儲存,然後使用參照(reference)來存取它。這可以減少儲存資料的需求,並確保資料的一致性。
分解表格:將大的資料表格分解成多個較小的表格,每個表格儲存特定類型的資料。這可以提高資料的組織性,減少重複資料的存儲,並簡化資料的維護。
建立關聯:在不同的表格之間建立關聯,以便輕鬆檢索和查詢相關資料。關聯可以是一對一、一對多或多對多,具體取決於資料的結構和需求。
確保資料完整性:資料庫正規化有助於確保資料的完整性,即資料應該是正確、一致和可靠的。透過約束和關聯,可以防止非法資料輸入和資料不一致性。
提高效能:雖然正規化可以減少資料重複,但在某些情況下,它可能導致複雜的查詢。在這種情況下,可能需要進行適度的反正規化,以提高查詢效能。
通常,資料庫正規化分為不同的正規化階段,從第一正規化(1NF)到第五正規化(5NF),每個階段都解決不同類型的問題。
第一正規化(1NF):確保每個表格中的每個欄位都包含原子資料,不包含可再分解的資料。
第二正規化(2NF):在滿足1NF的基礎上,確保每個非主鍵欄位都完全依賴於候選鍵(主鍵)。
第三正規化(3NF):在滿足2NF的基礎上,確保沒有傳遞依賴關係,即非主鍵欄位不依賴於其他非主鍵欄位。
巴斯-科德正規化(BCNF):在滿足3NF的基礎上,處理多值依賴性。
第四正規化(4NF):在滿足BCNF的基礎上,處理聯結依賴性。
第五正規化(5NF):在滿足4NF的基礎上,處理投影依賴性。
我們創建兩個 Modle,Article(文章)、Author(作者)。
rails g model Article title:string content:text author_id:integer
rails g model Author name:string
定義 Modle之間的關聯性
## article.rb
class Article < ApplicationRecord
belongs_to :author
end
## author.rb
class Author < ApplicationRecord
has_many :articles
end
並且我們在 rails console 創建文章、作者的紀錄
author1 = Author.create(name: 'Alice')
author2 = Author.create(name: 'Bob')
article1 = Article.create(title: 'Article 1', content: 'Content for article 1', author: author1)
article2 = Article.create(title: 'Article 2', content: 'Content for article 2', author: author2)
Rails會自動處理正規化,確保作者的記錄不會重複存儲,而是在作者表中具有唯一的ID。文章表格中包含對作者的引用(author_id),以建立它們之間的關聯。