理解第二个规范化表格

时间:2018-06-09 19:17:32

标签: mysql database-normalization

我想了解第二个规范化形式。我理解1NF表格和3NF表格,但我不太了解2NF表格。

我将解释我创建的场景,以便在下面尝试和理解,如果不清楚,请告诉我,我会为您澄清。

这是我的1NF表格表格:

create table testing.item_order_1nf (

    call_date date,
    first_name varchar(255),
    last_name varchar(255),
    street_address varchar(255),
    city varchar(255),
    state char(2),
    zip_code char(5),
    home_phone_number char(11),
    mobile_phone_number char(11),
    other_phone_number varchar(255),
    quantity smallint,
    item_name varchar(255),
    item_description varchar(255),
    unit_price decimal(4,2),
    handling_notes varchar(255),
    item_order_id smallint,
    customer_id smallint,
    item_id tinyint,

    primary key(item_order_id, item_id)

)

主键的原因:相同的item_order_id可以多次出现。对于该订单上显示的每个项目,它出现一次。如果一个订单包含3个商品,则order_id将出现3次。

以下是我尝试将1NF格式的1个表格转换为2NF格式的3个表格时的内容:

create table testing.customers (

    customer_id smallint,
    first_name varchar(255),
    last_name varchar(255),
    street_address varchar(255),
    city varchar(255),
    state char(2),
    zip_code char(5),
    home_phone_number char(11),
    mobile_phone_number char(11),
    other_phone_number varchar(25),

    primary key (customer_id)

),


create table testing.items (

    item_id tinyint,
    item_name varchar(255),
    item_description varchar(255),
    item_price decimal(4,2),

    primary key (item_id)

),


create table testing.item_orders (

    item_order_id smallint,
    item_id tinyint,
    customer_id smallint,
    handling_notes varchar(255),
    order_date date,
    quantity smallint,

    primary key (item_order_id),
    foreign key (item_id) references testing.items(item_id),
    foreign key (customer_id) references testing.customers(customer_id)

)

这看起来不错吗?如果没有,我做错了什么?

编辑#1:

  1. testing.customers的说明:每列都依赖于customer_id值,而只依赖于customer_id值。

  2. testing.items的说明:item_name,item_description和item_price取决于item_id值是什么。

  3. testing.item_orders的说明:多个项目可以出现在同一个订单上。另外,我包含了item_id和customer_id,因此我可以将此表与联接中的其他两个表相关联。 handling_notes和order_date取决于订单,虽然我不知道在哪里可以放置order_date。

  4. 编辑#2:

    可以在城市,州和邮政编码不依赖于customer_id的情况下进行争论,因为多个客户可能对所有这三个客户具有相同的值,所以如果我要进行编辑,那么它将是像这样的东西:

    create table testing.customers (
    
            customer_id smallint,
            first_name varchar(255),
            last_name varchar(255),
            street_address varchar(255),
            home_phone_number char(11),
            mobile_phone_number char(11),
            other_phone_number varchar(25),
    
            primary key (customer_id)
    
        )
    
    create table testing.item_orders (
    
        item_order_id smallint,
        item_id tinyint,
        customer_id smallint,
        city varchar(255),
        state char(2),
        zip_code char(5),
        handling_notes varchar(255),
        order_date date,
        quantity smallint,
    
        primary key (item_order_id),
        foreign key (item_id) references testing.items(item_id),
        foreign key (customer_id) references testing.customers(customer_id)
    
    )
    

    编辑#3:添加说明

    当我尝试创建场景时,我的思考过程如下:客户下订单并生成item_order_id值。在此item_order上,item_id值对于所订购的每种类型的项目都会出现一次。

    示例:我下了订单。我的订单号是#123。在我的订单上,我买了1把椅子,1本书,1种植物,3种苏打水。

    我的结果如下:

    item_order_id     item_name     quantity
    
    123     chair     1
    
    123     book     1
    
    123     plant     1
    
    123     soda     3
    

0 个答案:

没有答案