2016-06-07 29 views
0

我正在創建數據庫,我需要一些設計幫助。使用查找數據進行數據庫設計

我的表看起來就像這樣:

id 
request_employee_id 
request_menu 
request_submenu 
request_qty 
send_employee_id 
notify_employee_id 

每個請求有一個添加更多的選擇。例如:

請求菜單

id - 1 | Desc - Pencil 
id - 2 | Desc - Pen 
id - 3 | Desc - Eraser 
id - 4 | Desc - Marker 

根據所選的請求菜單會有不同的子菜單選項。

請求子菜單

id - 1 | Desc - Yellow HB 
id - 1 | Desc - Black HC 
id - 2 | Desc - Blue Ink 
id - 2 | Desc - Black Ink 
id - 2 | Desc - Red Ink 
id - 3 | Desc - NULL 
etc... 

請求者可以從子菜單主菜單和黃HB選擇鉛筆,然後可以在主無子菜單橡皮擦添加其他請求並選擇更多不同的要求。

請求者可以選擇發送給員工的X,並添加更多的員工送樣也發送給員工的Y和員工W.

請求者可以通知員工Z關於請求,並添加更多的員工通知員工ŧ和員工Y.

問題我基本上是如果我必須使用規範化和如何處理。我在考慮如何獲取報告的數據。

如果用戶發佈帶有多個菜單和子菜單的請求,多個用戶發送用戶和不同的通知用戶,如果我有規範化,我將不得不使用大量的JOINS語句,數據將由有多少用戶和我會得到的菜單。

或者使用倍數單獨的數據庫連接來獲取:從每個請求,通過請求另一個連接和查詢所有send_employee,通過請求notify_employee另一個連接所有菜單。最後,我將擁有7個不同的連接和SQL select語句來報告一個請求。

注:本人簡歷表,我也請求將落在同樣的問題,該員工有計量單位。每個請求可以通過菜單具有多個UOM。 Eaches,Bag,Cases等

如何處理這種情況的最佳設計。

謝謝

回答

0

它可以是簡單的像這樣:

CREATE TABLE tbl_Request(
    Request_ID INT IDENTITY(1,1) PRIMARY KEY, 
    Employee_ID INT NOT NULL, 
    Request_DT DATETIME NOT NULL, 
    Closed_Dt DATETIME 
); 
GO 
CREATE TABLE tbl_Category(
    Category_ID INT IDENTITY(1,1) PRIMARY KEY, 
    Category_Name VARCHAR(32) NOT NULL 
); 
GO 
CREATE TABLE tbl_Item(
    Item_ID INT IDENTITY(1,1) PRIMARY KEY, 
    Category_ID INT NOT NULL, 
    Item_Name VARCHAR(32) NOT NULL 
); 
GO 
CREATE TABLE tbl_Request_Details(
    Request_ID INT NOT NULL, 
    Item_ID INT NOT NULL, 
    Quantity DECIMAL NOT NULL 
); 
GO 
+0

你應該解釋一下你爲什麼選擇這種設計。 – Laurel

+0

嗨,斯拉瓦,謝謝你的回答。然後,當我將報告可視化時,我將針對用戶請求進行多次加入,發送用戶並通知用戶這將是員工表的3次加入。是對的嗎 ? – user3216926

+0

這是正確的。這似乎效率低下,但規範化顯着減少了數據量,這減少了獲取這些數據的I/O量。而且,如你所知,I/O比CPU更昂貴。這意味着你的報告將更快。但是,如果您只想從中做報告,那麼您可以創建一個包含「請求詳細信息」表的數據倉庫作爲事實表和請求,類別,項目,僱員作爲維度。 –