我正在为我的公司开发内部网应用程序。公司结构复杂,业务线,部门,部门,单位和团体众多。我必须照顾所有这些事情。有些员工在部门级别下工作,有些员工在单元级别下工作,等等。现在的问题是数据库设计。我对如何设计数据库感到困惑。一开始,我决定将其设计如下:
Employees: Username, Name, Title, OrgCode
Departments: OrgCode, Name
Divisions: OrgCode, Name
Units: OrgCode, Name
但问题正如我之前所说的,有些员工在部门下工作,所以如何在所有这些表之间建立关系。是否可以将Employees表中的OrgCode作为Departments,Divisions和Units表中OrgCode的外键?
能否请您推荐我如何设计?
更新 @wizzardz提出了一个很好的数据库设计。我现在需要的是拥有适合此数据库设计的数据示例 这是我在数据库中使用的一组数据: 让我们假设我们有员工,并提供以下信息: 用户名:JohnA 姓名:约翰 职称:工程师 OrgCode:AA
让我们假设我们有AA部门,我将如何将这些数据分发到数据库设计中?
答案 0 :(得分:3)
你可以做类似这样的设计
而不是为部门,部门等单独的表尝试将它们存储在单个表中,其中TypeId存储到distingush部门,Divisitions等。
你可以尝试这样的设计
在Level表格中,您需要输入“Deparments,Divisions”,Groups等值(通过将其保存在单独的表中,您可以处理组织未来添加的新级别。)
在OrganisationLevels表中,您需要存储部门名称,部门名称,GroupName等。
Employee表具有表组织级别的forigen键引用,该表将存储员工在组织中工作的级别。
如果您想存储特定员工的工作历史/员工可能会移动到另一个级别,我建议您选择此设计
设计中的样本数据
<强>等级强>
Id LevelType
1 Department
2 Division
3 Group
<强> OrganisationLevels 强>
Id Name LevelId Parent*(Give a proper name to this column)*
13 AA 1 NULL
.
.
21 B 2 13 (This column refer to the Id of department it belongs to.)
<强>员工强>
Id UserName Name Title
110 JohnA John Engineer
<强> EmployeeWorkDetails 强>
Id EmployeeId OrganisationLevelId StartDate EndDate IsActive
271 110 13 20/09/2011 NULL true
可以删除员工表中的OrgCode,因为我认为这是该组织员工的员工代码。
我希望这会有所帮助。
答案 1 :(得分:0)
Employees: Username, Name, Title, OrgCode
Departments: OrgCode, Name
Divisions: OrgCode, Name
Units: OrgCode, Name
对于上面提到的数据库设计,还有一个名为Org的表包含OrgCode,另一个列作为类型(我们可以深入了解它是哪种类型的组织,即部门,部门和单位)
然后你可以让员工表的OrgCode引用Org表的OrgCode(父子关系)。
答案 2 :(得分:0)
我建议您了解分析和设计之间的区别。在设计数据库时,您正在发明将影响数据存储和检索方式的表,列和约束。您关心的是更新和查询的简易性,包括您稍后将要了解的操作。
当您分析数据要求时,您不是在发明事物,而是从事发现事物。你发现的东西是关于主题应该代表的“现实世界”的东西。您将主题分解为“实体”和这些实体之间的关系。然后,将数据库中存储的每个值与属性的实例相关联,并将每个属性与实体或关系的某个方面相关联。这导致了一个概念模型。
在您的情况下,员工,部门,单位等之间的关系听起来相当复杂。要想出一个能够准确反映这种复杂现实的模型,我们需要付出相当大的努力。
一旦有了一个好的概念模型,就可以创建充分代表概念模型的SQL表,列和约束。这涉及可以学习的设计技巧。但是如果你有一个糟糕的概念模型,无论你在设计上有多好,你都注定要失败。