首頁(yè)常見問題正文

數(shù)據(jù)庫(kù)的三范式是什么?

更新時(shí)間:2023-04-26 來(lái)源:黑馬程序員 瀏覽量:

IT培訓(xùn)班

  數(shù)據(jù)庫(kù)的三范式是指關(guān)系數(shù)據(jù)庫(kù)設(shè)計(jì)中的一些規(guī)則,用于減少數(shù)據(jù)冗余、提高數(shù)據(jù)一致性和避免數(shù)據(jù)插入、更新和刪除時(shí)出現(xiàn)異常情況。以下是三范式的概述:

  1.第一范式(1NF):

  表中的每個(gè)字段都應(yīng)該是原子性的,即不可再分解的基本數(shù)據(jù)類型,不能有多值或復(fù)雜類型的字段。例如,一個(gè)訂單表中的商品字段應(yīng)該是單個(gè)商品而不是多個(gè)商品的集合。

  2.第二范式(2NF):

  表中的每個(gè)非主鍵字段都應(yīng)該完全依賴于主鍵,而不是依賴于主鍵的一部分。這意味著每個(gè)表只應(yīng)該包含一組相互獨(dú)立的屬性。例如,如果一個(gè)訂單表包含商品和商品價(jià)格,則商品價(jià)格是應(yīng)該是和商品ID關(guān)聯(lián)的,而不是和訂單ID關(guān)聯(lián)的。

  3.第三范式(3NF):

  在2NF的基礎(chǔ)上,消除非主鍵字段之間的傳遞依賴,即不允許一個(gè)非主鍵字段依賴于另一個(gè)非主鍵字段。這可以通過(guò)將這些字段拆分到單獨(dú)的表中來(lái)實(shí)現(xiàn)。例如,一個(gè)訂單表中,如果商品價(jià)格依賴于商品的供應(yīng)商,則應(yīng)該將供應(yīng)商信息存儲(chǔ)在單獨(dú)的表中,并與商品關(guān)聯(lián)。

  以下是一個(gè)簡(jiǎn)單的示例代碼演示如何在 MySQL 中創(chuàng)建符合三范式的表:

-- 創(chuàng)建訂單表
CREATE TABLE orders (
  order_id INT PRIMARY KEY,
  customer_id INT,
  order_date DATE
);

-- 創(chuàng)建商品表
CREATE TABLE products (
  product_id INT PRIMARY KEY,
  product_name VARCHAR(255),
  supplier_id INT,
  price DECIMAL(10,2)
);

-- 創(chuàng)建供應(yīng)商表
CREATE TABLE suppliers (
  supplier_id INT PRIMARY KEY,
  supplier_name VARCHAR(255),
  supplier_address VARCHAR(255),
  supplier_phone VARCHAR(20)
);

-- 在訂單表和商品表之間建立外鍵關(guān)系
ALTER TABLE orders
ADD CONSTRAINT fk_customer
FOREIGN KEY (customer_id)
REFERENCES customers(customer_id);

ALTER TABLE products
ADD CONSTRAINT fk_supplier
FOREIGN KEY (supplier_id)
REFERENCES suppliers(supplier_id);

  在這個(gè)示例中,訂單表、商品表和供應(yīng)商表都符合三范式。訂單表包含了主鍵、顧客ID和訂單日期,商品表包含了主鍵、商品名稱、供應(yīng)商ID和價(jià)格,供應(yīng)商表包含了主鍵、供應(yīng)商名稱、地址和電話。訂單表和商品表之間通過(guò)外鍵關(guān)系建立了聯(lián)系,而不是在訂單表中添加商品價(jià)格等非主鍵信息,從而避免了數(shù)據(jù)冗余。

分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!