2013-06-12 34 views
1

我正在研究數據庫,我遇到了這個問題。如果我有例如包含Invoice_Id(pk),Product_Id(pk),Date_Of_Supply,Quantity和Value_Of_Product的product_supply表。值得正常化嗎?

| Invoice_ID | Product_ID | Date_Of_Supply | Quantity | Value_Of_Product | 
    ------------------------------------------------------------------------- 
    | AA111111111|  5001 | 08-07-2013  |  50 |  200$  | 
    | AA111111111|  5002 | 08-07-2013  |  20 |  300$  | 
    | BB222222222|  5003 | 10-09-2013  |  70 |  50$  | 
    | CC333333333|  5004 | 15-10-2013  |  100 |  40$  | 
    | CC333333333|  5005 | 15-10-2013  |  70 |  25$  | 
    | CC333333333|  5006 | 15-10-2013  |  100 |  30$  | 

我們可以看到該表已經是1NF form.My的問題在這裏is.In正常化而言,如果它是明智的,這表歸一化爲2NF形式,並且具有與INVOICE_ID例如supply_date另一個表(pk)和Date_Of_Supply或者如果有上表是好的?

| Invoice_ID | Date_Of_Supply | 
    ------------------------------- 
    |AA111111111 | 08-07-2013 | 
    |BB222222222 | 10-09-2013 | 
    |CC333333333 | 15-10-2013 | 

回答

2

這絕對值得正常化。如果您需要用1NF修改供應日期,則需要更新多個記錄;與2NF,你只需要更新一個記錄。另外,請注意1NF中的數據冗餘,其中供應日期對於每個發票編號存儲多次。它不僅浪費空間,而且更難處理查詢,如「列出在日期X和Y之間提供的所有發票」。

編輯

正如羅伯特·哈維在他的評論指出,(這我花了一段時間來理解,因爲我被厚厚出於某種原因),如果你已經有了一個爲每種Invoice_ID單行表(比如「發票表」),那麼您應該爲該表添加一列Date_Of_Supply而不是創建一個新表。

+1

我理解你的邏輯,但在我看來,你可以將供應日期填入發票表中,除非每張發票有多個供應日期。您似乎對您的答案非常肯定,但您沒有向OP詢問任何問題,並且從問題中提供的有限信息中看不出這種用法。 –

+0

@RobertHarvey - 發佈的數據顯示每個發票ID具有相同日期的多行。如果第二種正常形式產生OP描述的表格,那麼它必須是每個發票ID有一個日期。 –

+0

這意味着不需要另一個表,正確嗎? –

0

將表格更改爲第二範式包括刪除第一範式表格中的冗餘。第一個問題是確定是否有任何裁員。

如果存在冗餘,那麼我們應該能夠創建第二個不涉及第一個主鍵(Invoice_ID)的表。根據第一個表中的非PK列(即Product_ID,Date_Of_Supply,Quantity和Value_Of_Product),不清楚這些列中的任何列是否相互依賴。

作爲一般的經驗法則,如果您有一張表,其中所有非PK列僅依賴於該表的PK列,則它已經在2NF中。

+0

沒有geek-ese,這意味着什麼?他可以將供應日期放入發票擡頭記錄(假設存在)? –

+0

@RobertHarvey_工作一直在進行中,以便使人們完全想到一種機器的概念,該機器不僅可以提供反向電流用於單向相位反對者,而且還能夠自動同步基本克重。這樣的機器是「Turbo-Encabulator ...」。_ –

+0

@MattBall:太棒了。我完全理解。現在請原諒,我把我的錫紙帽子... ...神聖的廢話,其實有[維基百科文章](http://en.wikipedia.org/wiki/Turboencabulator)。 –