首页 > 解决方案 > 规范化后创建表的问题

问题描述

我的任务是规范化销售订单、创建关系模式并将数据输入 SQL 开发人员。

我已经标准化为 3NF 并得到了这个:

Customer(Customer_ID, Customer_name) ... 主键 = Customer_ID

Employee(Employee_ID, Employee_name) ... 主键 = Employee_ID

Sales_Order(Sales_order_ID, Employee_ID, Customer_ID, Sale_date, Order_total) ... 主键 = Sales_order_ID ... 外键 = Employee_ID, Customer_ID

Order_Line(Sales_order_ID, Product_ID, Quantity, Line_total) ... 复合键 = Sales_order_ID ... 外键 = Product_ID

Product(Product_ID, Product_name, Product_price, Product_colour) ... 主键 = Product_ID

然后我输入了表格,这是我的 SQL:

CREATE TABLE EMPLOYEE(
    Employee_ID CHAR(3), 
    Employee_name CHAR(20),  
    CONSTRAINT pk_Employee PRIMARY KEY (Employee_name)
);

CREATE TABLE CUSTOMER(
    Customer_ID CHAR(5), 
    Customer_Name CHAR(20),  
    CONSTRAINT pk_Customer PRIMARY KEY (Customer_ID)
);

CREATE TABLE PRODUCT(
    Product_ID CHAR(5),
    Product_Name CHAR(30),
    Product_Colour CHAR(10),
    Product_Price CHAR(5),
    CONSTRAINT pk_Product PRIMARY KEY (Product_ID)
);

CREATE TABLE SALES_ORDER(
    Sales_order_ID CHAR(6),
    Employee_ID CHAR(3),
    Customer_ID CHAR(5),
    Sale_Date CHAR(10),
    Order_total CHAR(7),
    CONSTRAINT pk_Order PRIMARY KEY (Sales_order_ID),
    CONSTRAINT fk_Order FOREIGN KEY (Employee_ID) REFERENCES EMPLOYEE (Employee_ID),
    FOREIGN KEY (Customer_ID) REFERENCES CUSTOMER (Customer_ID)
);

CREATE TABLE ORDER_LINE(
    Sales_order_ID CHAR(6),
    Product_ID CHAR(5),
    Quantity CHAR(3),
    Line_total CHAR(5),
    CONSTRAINT pk_Order_Line PRIMARY KEY (Sales_order_ID),
    FOREIGN KEY (Product_ID) REFERENCES PRODUCT (Product_ID)
);

我可以输入表格Employee, Customer, Product,Sales_order但无法输入Order_line

我被告知该表或视图不存在!

这是什么意思?

我是否错误地标准化了?

我是否错误地设计了关系模式?

任何帮助将不胜感激

标签: oracledatabase-normalization

解决方案


当我在这个 db fiddle中运行您的代码时,创建表SALE_ORDER失败并显示以下消息:

ORA-02270: 此列列表没有匹配的唯一键或主键

这是因为这个外键:

CONSTRAINT fk_Order FOREIGN KEY (Employee_ID) REFERENCES EMPLOYEE (Employee_ID),

根本问题是您已定义Employee_name为 table 的主键EMPLOYEE

CREATE TABLE EMPLOYEE (
    Employee_ID CHAR(3), 
    Employee_name CHAR(20),  
    CONSTRAINT pk_Employee PRIMARY KEY (Employee_ID)
);

这似乎不是一个明智的选择。在现实生活中,两个不同的员工可能有相同的名字。相反,您可能希望Employee_ID用作EMPLOYEE.

考虑 table 的这个定义EMPLOYEE

CREATE TABLE EMPLOYEE (
    Employee_ID CHAR(3), 
    Employee_name CHAR(20),  
    CONSTRAINT pk_Employee PRIMARY KEY (Employee_ID)
);

使用此新设置,所有表都已成功创建。您现在可以插入数据。

DB Fiddle 上的演示


旁注:我预见到 table 的问题ORDER_LINE

  • 主键应该Order_line_ID代替Sales_order_ID

  • Sales_order_ID应该有一个外键约束引用SALE_ORDER(Sales_order_ID)

考虑这个新定义ORDER_LINE

CREATE TABLE ORDER_LINE(
    Order_line_ID CHAR(6),
    Sales_order_ID CHAR(6),
    Product_ID CHAR(5),
    Quantity CHAR(3),
    Line_total CHAR(5),
    CONSTRAINT pk_Order_Line PRIMARY KEY (Order_line_ID),
    FOREIGN KEY (Product_ID) REFERENCES PRODUCT (Product_ID),
    FOREIGN KEY (Sales_order_ID) REFERENCES SALES_ORDER(Sales_order_ID)
);

推荐阅读