目标

  • 试图搞清楚1NF、2NF、3NF的规范含义
  • 试图找到一种范式与非范式之间的平衡应用与日常开发

题目

给定以下数据表,参考数据库设计范式进行结构优化,可以输出ER图或者表定义

表结构

CREATE TABLE Orders (
    order_id INT PRIMARY KEY,                    -- 订单ID
    customer_name VARCHAR(255),                  -- 客户名称
    customer_address VARCHAR(255),               -- 客户地址
    order_date DATETIME,                         -- 订单日期
    product_id INT,                              -- 产品ID
    product_name VARCHAR(255),                   -- 产品名称
    quantity INT,                                -- 数量
    unit_price DECIMAL(10, 2),                   -- 单价
    total_price DECIMAL(10, 2),                  -- 总价
    sales_rep_id INT,                            -- 销售代表ID
    sales_rep_name VARCHAR(255),                 -- 销售代表名称
    sales_rep_phone VARCHAR(20),                 -- 销售代表电话
    delivery_date DATETIME,                      -- 交货日期
    payment_method VARCHAR(50),                  -- 支付方式
    payment_status VARCHAR(50)                   -- 支付状态
);

表数据例子

order_idcustomer_namecustomer_addressorder_dateproduct_idproduct_namequantityunit_pricetotal_pricesales_rep_idsales_rep_namesales_rep_phonedelivery_datepayment_methodpayment_status
1A华盛顿特区宾夕法尼亚大道1600号2023-08-01 14:00:00101笔记本电脑2800.001600.001D111111112023-08-05 09:00:00信用卡已支付
2B唐宁街10号2023-08-03 16:30:00102智能手机1600.00600.002E222222222023-08-07 10:00:00支付宝待支付
3A华盛顿特区宾夕法尼亚大道1600号2023-08-02 12:15:00103平板电脑3200.00600.001D111111112023-08-06 11:00:00信用卡已支付
4C永田町2丁目3-12023-08-04 11:00:00101笔记本电脑1800.00800.002E222222222023-08-08 13:00:00银行转账已支付
5A华盛顿特区宾夕法尼亚大道1600号2023-08-05 14:30:00104显示器2150.00300.001D111111112023-08-09 09:30:00信用卡已支付

结果

三范式

  1. 第一范式
    1NF,是对属性的原子性约束,要求属性具有原子性,不可再分解。
  2. 第二范式
    2NF,是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性。
  3. 第三范式
    3NF,是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。

ER图

erDiagram
    CUSTOMERS {
        INT customer_id PK
        VARCHAR customer_name
        VARCHAR customer_address
    }
    
    PRODUCTS {
        INT product_id PK
        VARCHAR product_name
        DECIMAL unit_price
    }

    SALESREPS {
        INT sales_rep_id PK
        VARCHAR sales_rep_name
        VARCHAR sales_rep_phone
    }

    ORDERS {
        INT order_id PK
        INT customer_id FK
        DATETIME order_date
        INT product_id FK
        INT quantity
        DECIMAL total_price
        INT sales_rep_id FK
        DATETIME delivery_date
        VARCHAR payment_method
        VARCHAR payment_status
    }

    CUSTOMERS ||--o{ ORDERS : "places"
    PRODUCTS ||--o{ ORDERS : "contains"
    SALESREPS ||--o{ ORDERS : "handled by"

参考