使用查找数据进行数据库设计
问题描述:
我正在创建数据库,我需要一些设计帮助。使用查找数据进行数据库设计
我的表看起来就像这样:
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
你应该解释一下你为什么选择这种设计。 – Laurel
嗨,斯拉瓦,谢谢你的回答。然后,当我将报告可视化时,我将针对用户请求进行多次加入,发送用户并通知用户这将是员工表的3次加入。是对的吗 ? – user3216926
这是正确的。这似乎效率低下,但规范化显着减少了数据量,这减少了获取这些数据的I/O量。而且,如你所知,I/O比CPU更昂贵。这意味着你的报告将更快。但是,如果您只想从中做报告,那么您可以创建一个包含“请求详细信息”表的数据仓库作为事实表和请求,类别,项目,雇员作为维度。 –