【发布时间】:2011-08-02 23:47:15
【问题描述】:
对我来说,到目前为止,我发现关于 1NF 最容易理解的描述是“主键是唯一标识每一行的列(或列组)。 ' 在 www.phlonx.com 上 我理解冗余意味着每个键的每行不应超过 1 个值。超过 1 个值将是“冗余的”。对吧?
我仍然设法搞砸了很多次 1 NF。 我为我的在线披萨店发布了一个问题http://foo.com pizzashop here
我对第二范式中的某些东西感到困惑,只是注意到我在 1 NF 中开始出错。 现在我在想我需要 1NF 中的 3 个键来唯一标识每一行。 在这种情况下,我发现 order_id、pizza_id 和 topping_id 会为我做这件事。所以这是3列。因为如果您想知道哪个特定的披萨是哪个,您需要知道它的 order_id 是什么类型的披萨 (pizza_id) 以及上面有什么配料。如果您知道这一点,则可以查找所有其他内容。 然而,从对上一个问题的回答来看,这似乎是错误的,因为 topping_id 转到了另一个我不理解的表。 这是列的列表:
Order_id
订单日期
客户 ID
客户名称
电话
促销
黑名单 Y 或 N
客户地址
邮政编码
城市
电子邮件
Pizza_id
Pizza_name
尺寸
Pizza_price
金额
Topping_id
Topping_name
Topping_prijs
可用
Delivery_id
Delivery_zone
Deliveryguy_id
送货员姓名
交货 Y 或 N
编辑:我将第一个连接键的 id 标记为粗体。它们只是一个未标准化的列列表。它们不是 1 张桌子或 3 张桌子或任何东西
【问题讨论】:
-
您在一个表中拥有所有这些列吗?那肯定会违反 2NF
-
@Gabor Kulcsar 我的问题是:我这样做的方法是否正确?如果不是,为什么不呢? @mar_s:不,这不是第二范式,上面的表格也不是一张大桌子。这是一个关于第一范式及其主键的问题
-
我还是不明白。为什么要将所有东西都挤到一张桌子上?这不是 1NF 的要求……这是完全错误的。
-
@Gabor:上面的列列表不是一个开始的表格。它只是一个列列表。
-
@Jack_Anyway:您还不能拥有 ToppingID 或 Pizza_id 或 Order_id:它们没有任何意义。这是您在 BCNF 时的实施。
标签: sql normalization