2011-11-23 41 views
3

我想了解数据库规范化,特别是3NF。试图了解数据库规范化 - 3NF

我正在建立一个商店数据库,并试图归一化到3NF已经拿出了下面的结构。

结构如下假设

  • 有可能是每个产品多个类别
  • 有每个产品只有永远一个storage_location &制造商
  • 有可能是无限的extra_fields

任何人可以告诉我,如果我在正确的轨道上,3NF中的下面的结构,还是关闭?

Products 
---------------- 
pid (pk) 
title 
desc 
price 
weight_base 
weight_additional 
note 
quantity 
manufacturer_id (fk) 
storage_location_id (fk) 

Categories 
----------------- 
category_id (pk) 
category_name 
parent_id 
description 

Product_categories 
----------------- 
pid (pk) 
category_id (pk) 

Manufacturers 
------------------- 
manufacturer_id (pk) 
name 
description 

Storage_locations 
--------------------- 

storage_location_id (pk) 
storage_ref 
storage_note 

Product_extra_field_values 
----------------------------------- 

PID (pk) 
extra_id (fk) 
value 

Product_extra_fields 
-------------------------------- 

extra_id (pk) 
label 

两件事我不确定:

  1. 是否正确使用复合键Product_categories以适应在表中的多个相同的PID?

  2. 将外键简单添加到制造商和storage_location的主要Products表中是否正确,因为它们只会在每个产品记录中出现一次?还是应该具体的制造商和storage_location ID从初级产品表,新表中删除是这样产生:

    使用三个表
    Product_storage_locations 
    ---------------------------------- 
    PID (pk) 
    storage_location_id (pk) 
    

回答

1

是的,你看起来对我来说是正确的。将产品存储位置和制造商放在Products表中的操作是绝对正确的。如果你把它放在一个单独的表格中(下面),你只需要为你自己创建更多的工作,然后再进行所有的连接。

将产品拆分到新的Product_storage_locations表中的唯一原因是产品可能位于多个位置(根据您所说的,情况并非如此)。但是,对于产品和类别,您想要做的 - 这就是您对Product_categories表所做的操作;而且绝对是正确的做法。

我不确定你的设计唯一的事情是你如何做额外的领域。没有关于你的意图的更多信息,很难说你所做的是否正确。但是,在我看来,你所拥有的是适用于许多产品的特定类型的领域;但是这些产品中的每一种都可能在该领域具有不同的价值。如果这是你的意图,那么设计看起来很好。

+0

感谢您的答案 - 我想使用extra_field动态添加额外的可选产品数据,如条件(新的或使用)。然而,考虑到Product_extra_field_values在上述示例(即'new'或'used')的情况下会充满相同的值,因此可能最好创建第三个extra_field表,例如'Product_extra_field_value_options',其值为value_option_id和value_option_value然后在Product_extra_field_values表中代替'value'具有value_option_id – someuser

1

- 产品,品类,PRODUCT_CATEGORY - 要设置一个多产品和类别之间的一对多关系。即任何一个产品都可以属于多个类别,并且任何一个类别都可以分配给多个产品。如果这不是这个意图,那么这不是正确的设计。

相反,如果你有一对多的关系,那么你只需要两个表。在这个设置中,“许多”表项可以将外键保存到“一个”表中。它看起来像你的设计是正确的,只要一对多是你想要的产品与制造商的关系。如果你想要多对多的话,你需要一个三表设计。

顺便说一下,product_category表中的这两个字段都是外键(fk),而不是您所指出的主键。

+0

你的笔记底部并不完全正确 - 他们是外键到其他表,是的;但他们自己也构成了主钥匙。每个表都需要一个主键;在这种情况下,由于多个类别可以应用于单个产品;并且多种产品可以适用于各个类别,既不是独一无二的,所以您必须将两者一起作为主键。 – Smashery

+0

我看着不同的,但我明白你的意思 –