归一化后创建表的问题

问题描述 投票:1回答:1

我被赋予了标准化销售订单,创建关系模式并将数据输入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

产品(产品ID,产品名称,产品价格,产品颜色)...主键=产品ID

然后,我创建了一个关系模式,我将在这篇文章中上传它。This is my relational schema

然后输入表格,这是我的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)
);

我能够输入表EmployeeCustomerProductSales_order,但无法输入Order_line

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

这是什么意思?

我标准化不正确吗?

我是否设计了不正确的关系模式?

任何帮助将不胜感激

oracle database-normalization
1个回答
0
投票

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

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

这是因为有此外键:

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

潜在的问题是您已将Employee_name定义为表EMPLOYEE的主键。

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

这似乎不是一个明智的选择。在现实生活中,两个不同的雇员可能会有相同的名字。相反,您可能想使用Employee_ID作为EMPLOYEE的主键。

考虑表EMPLOYEE的此定义:

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

通过此新设置,所有表均已成功创建。您现在可以插入数据。

Demo on DB Fiddle


旁注:我预见表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)
);
© www.soinside.com 2019 - 2024. All rights reserved.