使用查找数据进行数据库设计

问题描述:

我正在创建数据库,我需要一些设计帮助。使用查找数据进行数据库设计

我的表看起来就像这样:

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等

如何处理这种情况的最佳设计。

谢谢

它可以是简单的像这样:

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更昂贵。这意味着你的报告将更快。但是,如果您只想从中做报告,那么您可以创建一个包含“请求详细信息”表的数据仓库作为事实表和请求,类别,项目,雇员作为维度。 –