将表从UNF归一化到3NF

时间:2017-04-06 22:24:07

标签: sql database-normalization

我对Normalization很新,我只想知道我是否正确地将我的表从UNF转换为3NF。我将展示我的所有步骤。

库存报告

PRODUCT ID:   DESCRIPTION         INVENTORY AISLE#  SUPPLIER
  10        6 foot garden rake       5        1     Sheffield-Gander inc.
  20        7 foot leaf rake         5        1     Sheffield-Gander inc.
  30        Round mouth shovel       4        1     Husky Inc.
  40        Flat-nosed Shovel        2        1     Husky Inc.
  50        Garden pitch-fork        6        1     Husky Inc.
  60        8 inch hand shears       9        2     Sheffield-Gander inc.
  70        12 inch trimming shears 10        2     Sheffield-Gander inc.
  80        10 inch tamper           3        2     Husky Inc.
  90        Cedar sapling            34       5     Northwood Farms inc.
  100       Golden cedar sapling     23       5     Northwood Farms inc.
  110       Mulberry sapling         12       4     Sherwood Nursery
  120       Juniper sapling          15       4     Northwood Farms inc.
  130       Premium lawn fertilizer  4        6     Sherwood Nursery
  140       General grade lawn       12       6     Sherwood Nursery
  150       Premium garden fertilize 14       6     Sherwood Nursery
  160       General grade garden f   12       6     Sherwood Nursery
  170       120 foot watering hose    9       3     Diemar Garden Center
  180       12 inch aluminum sprinkl  5       3     Diemar Garden Center
  190       Rotating sprinkler jet    4       3     Diemar Garden Center


UNF INVENTORY[ProductID(fk), Description, (Aisle#(fk),Inventory,supplier)]

1NF INVENTORY[ProductID(fk), Aisle#(fk), Description,Inventory, Supplier]

2NF INVENTORY_AISLE [ProductID(fk), Aisle#(fk)]
    INVENTORY       [ProductID(fk), Description, inventory]
    AISLE           [Aisle#(fk), supplier]

3NF: INVENTORY_AISLE [ProductID(fk), Aisle#(fk)]
     INVENTORY       [ProductID(fk), Description(fk)]
     AISLE           [Aisle#(fk), supplier]
     DESCRIPTION     [Description(fk), Inventory]

1 个答案:

答案 0 :(得分:1)

你在那里有一个很好的第一次尝试。

在UNF表中,如果产品ID 10位于过道1和3中,则当前表结构将在Aisle列中创建重复值,如下所示:

redirect_template

如果出现这种情况:

1NF

通过构造如下数据来删除重复值:

PRODUCT ID:   DESCRIPTION         INVENTORY AISLE#  SUPPLIER
  10        6 foot garden rake       5        1,3   Sheffield-Gander inc.

2NF

非关键字段将依赖主键。为此,让我们确定主键是什么。

对于产品:产品ID。其他字段不是键,依赖于ID 供应商:供应商ID

让我们看看我们如何确保非键直接依赖于主键。产品的描述通常保持一致。产品有库存(可能会迅速变化)。

<强>产品

PRODUCT ID:   DESCRIPTION         INVENTORY AISLE#  SUPPLIER
  10        6 foot garden rake       3        1     Sheffield-Gander inc.
  10        6 foot garden rake       2        3     Sheffield-Gander inc.

<强>供应商

ProductID
Description
Inventory (stay with me on this one)
AisleID

重要的是要注意评论者对您的问题的评论。理解功能依赖性很重要。这意味着,如何与之相关。我假设您的产品由一个或多个供应商提供。产品可以放在一个或多个过道中。

3NF

非密钥不应该依赖于另一个非密钥

上述设计可能看起来不错,但事实并非如此。产品可以是不同的过道。过道可能有AisleWidth和AisleLength等属性。可能会觉得这两个字段可以在Product表中的AisleID列之后添加。这样做会违反3NF,因为这两个字段与ProductID无关。

  • 让我们创建一个描述Aisle
  • 功能的Aisle表
  • 由于产品的库存可以更改而产品可以放在多个过道中,让我们考虑一下
  • 由于产品可能来自不同的供应商,我们也应该考虑到这一点

<强>产品

SuppierID
Name

<强>过道

ProductID
Description

<强> ProductPlacement

AisleID
AisleWidth
AisleLength (you don't have some of these fields; they are just for illustration)

<强>供应商

ProductID
AisleID
Inventory

<强> ProductSupplier

SuppierID
Name

现在,当库存发生变化时,数据会在一个表中发生变化。库存不仅仅是产品放置;库存可以在仓库中,可以在不同的物理位置等。我们不会涉及到这一点,但您明白ProductPlacement表中的库存仅供说明。

希望能让您在必要时分发表格。这不是规范化的唯一方法。邀请更多答案,希望你能了解除此之外的其他哲学。