更新時(shí)間:2023-04-26 來源:黑馬程序員 瀏覽量:
數(shù)據(jù)庫的三范式是指關(guān)系數(shù)據(jù)庫設(shè)計(jì)中的一些規(guī)則,用于減少數(shù)據(jù)冗余、提高數(shù)據(jù)一致性和避免數(shù)據(jù)插入、更新和刪除時(shí)出現(xiàn)異常情況。以下是三范式的概述:
表中的每個(gè)字段都應(yīng)該是原子性的,即不可再分解的基本數(shù)據(jù)類型,不能有多值或復(fù)雜類型的字段。例如,一個(gè)訂單表中的商品字段應(yīng)該是單個(gè)商品而不是多個(gè)商品的集合。
表中的每個(gè)非主鍵字段都應(yīng)該完全依賴于主鍵,而不是依賴于主鍵的一部分。這意味著每個(gè)表只應(yīng)該包含一組相互獨(dú)立的屬性。例如,如果一個(gè)訂單表包含商品和商品價(jià)格,則商品價(jià)格是應(yīng)該是和商品ID關(guān)聯(lián)的,而不是和訂單ID關(guān)聯(lián)的。
在2NF的基礎(chǔ)上,消除非主鍵字段之間的傳遞依賴,即不允許一個(gè)非主鍵字段依賴于另一個(gè)非主鍵字段。這可以通過將這些字段拆分到單獨(dú)的表中來實(shí)現(xiàn)。例如,一個(gè)訂單表中,如果商品價(jià)格依賴于商品的供應(yīng)商,則應(yīng)該將供應(yīng)商信息存儲在單獨(dú)的表中,并與商品關(guān)聯(lián)。
以下是一個(gè)簡單的示例代碼演示如何在 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ān)系建立了聯(lián)系,而不是在訂單表中添加商品價(jià)格等非主鍵信息,從而避免了數(shù)據(jù)冗余。