Oracle

數據庫規範化,3個錯誤stucked_s噸你C到和dstucked- 在家工作

  • March 3, 2020

我在大學得到了一個家庭作業,上面說我應該用 7 個表創建一個數據庫

$$ see picture below $$. 正如我的導師告訴我的,我制定的方案很好,只是需要一些規範化。(旁注:我已經對 CONTINENTS 和 COUNTRIES 表進行了規範化) 在我與導師聯繫後,他告訴我我在這個模式中缺少兩個規範化,並且存在一個數據庫建模錯誤。然而,這就是我所知道的關於我的錯誤的全部內容。

我對我可能犯的錯誤的想法:

  1. 在 CUSTOMERS 表中,COUNTRY_NAME 應該是一個 FK,引用 COUNTRY 表的 COUNTRY_NAME。

(在這種情況下,我認為不需要 CONTINENT_ID) 2. 在 ORDERS 表中,由於 ITEM 表的 QUANTITY,TOTAL_AMOUNT 是多餘的。這是一個問題,如果是這樣,我該如何擺脫它? 3. 有很多 VARCHAR2 類型的“CITY”列。當 1) 使用者在其他表中拼錯它們或 2) VARCHAR2 佔用太多儲存空間時,這可能會成為問題。我應該使用 zipcode 和 city 列製作 ZIPCODES 表並改用它嗎? 4. 重複記錄:在 WORKERS 表中有一個名為 EMAIL 的列。在我看來,一個工人可以有多個電子郵件地址,所以在這種情況下:這會給我帶來麻煩,即導致重複記錄嗎? 5. CUSTOMER/WORKER 表和 DIVISION/WORKER 表具有 N:M(?,不太確定)關係。那麼有必要在它們之間再做一張桌子嗎?

在此處輸入圖像描述

如果有人能找到缺失的標準化並回答我的問題,我將非常感激。

對澄清請求的回應

關於建模錯誤:我沒有太多關於業務規則的資訊。這是因為這節課是關於標準化的,所以這是蛋糕上的櫻桃。如果我找不到它,這不是什麼大問題。

關於規範化:我很確定,我應該按照評論中提到的那樣分解目前結構。問題是,我在這裡缺少什麼。由於盯著他們看太多,我開始失明。

注意:我的大學時光已經過去很久了——我是從現實世界的角度來看的。並不意味著答案是預期的答案,但可能有助於為您的選擇提供一個論據。一個好的導師會考慮這樣的事情……

  1. 同意 - 從邏輯上講,客戶應該在一個國家,而不是一個大陸。
  2. 雖然 TOTAL_AMOUNT 可能是訂單中所有商品的 QUANTITY_SHIPPED * PRICE 的總和,但我不認為這是一個標準化問題。這是一個儲存的計算。在實際系統中,總金額可能會受到折扣或優惠券的影響,並且(在另一個方向上)會受到銷售稅的影響。所以,可以說是合適的。
  3. 首先,客戶、國家和部門中的 CITY 欄位不一定相互匹配。其次,一個給定的城市可以有多個郵政編碼,一個給定的郵政編碼可以覆蓋多個城市(至少在美國)。如果您在訂單中重複了客戶的地址,則可能會被視為規範化錯誤。(可以說 - 我已經將亞馬遜訂單運送到幾個不同的地址……)
  4. 雖然一個人當然可以有多個電子郵件地址,但除非任務指定您必須考慮多個電子郵件地址,否則我會保留它。
  5. 我假設每個客戶只有一個銷售代表,而每個銷售代表(worker_id)可能有多個客戶;並且,每個工人都屬於一個且只有一個部門。那麼,兩者之間不需要一張桌子。多對多關係通常需要某種映射表來定義連接。

我假設您使用的工具將連接指向每個表格框上的基本隨機點;如果是這樣,則很難確定所有關係確實都以正確的方向建立;如果你沒有,我會仔細檢查。

您在客戶和訂單中都有一個 salesrep_id。再一次,現實世界的經驗告訴我這是明智的(真正的銷售代表經常從一個地區轉移到另一個地區,而且,如果客戶有真正的銷售代表,你可能會對幾年後誰賣給客戶 X 什麼東西*非常感興趣)。*但是,在您分配的上下文中,這可能被視為非規範化。

當我查看圖表時,唯一讓我震驚的另一件事是沒有產品表。我覺得這有點令人驚訝。如果有一個單獨的產品表,那麼項目表中的一些欄位當然會移到那裡。

在 CUSTOMERS 表中,COUNTRY_NAME 應該是一個 FK,引用 COUNTRY 表的 COUNTRY_NAME。

(在這種情況下,我認為不需要 CONTINENT_ID)

這是有道理的,因為您需要先縮小國家/地區範圍,然後才能從國家/地區表中引用該大陸。

在 ORDERS 表中,由於 ITEM 表的 QUANTITY,TOTAL_AMOUNT 是多餘的。這是一個問題,如果是這樣,我該如何擺脫它?

如果 TOTAL_AMOUNT 是對數量求和,那麼這是一個計算值,不應該是一個欄位。

有很多 VARCHAR2 類型的“CITY”列。當 1) 使用者在其他表中拼錯它們或 2) VARCHAR2 佔用太多儲存空間時,這可能會成為問題。我應該使用 zipcode 和 city 列製作 ZIPCODES 表並改用它嗎?

最好的方法是從小到大。如:

  • 郵政編碼 => 城市 => 國家 => 大陸

重複記錄:在 WORKERS 表中有一個名為 EMAIL 的列。在我看來,一個工人可以有多個電子郵件地址,所以在這種情況下:這會給我帶來麻煩,即導致重複記錄嗎?

我可能是錯的,但這似乎更像是一個設計決定。您可以強制執行每個工作人員只需要一個電子郵件地址的策略。但是,如果您想要一個工作人員的多個電子郵件地址,則需要創建一個單獨的表來引用一個工作人員的所有電子郵件地址。

CUSTOMER/WORKER 表和 DIVISION/WORKER 表具有 N:M(?,不太確定)關係。那麼有必要在它們之間再做一張桌子嗎?

是的,需要單獨的表格。

希望這會有所幫助。

引用自:https://dba.stackexchange.com/questions/167191