我想了解第二个规范化形式。我理解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:
testing.customers的说明:每列都依赖于customer_id值,而只依赖于customer_id值。
testing.items的说明:item_name,item_description和item_price取决于item_id值是什么。
testing.item_orders的说明:多个项目可以出现在同一个订单上。另外,我包含了item_id和customer_id,因此我可以将此表与联接中的其他两个表相关联。 handling_notes和order_date取决于订单,虽然我不知道在哪里可以放置order_date。
编辑#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