2011-11-23 54 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

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