0

我有一个旧的数据库设计,我认为我可以简化并使其更规范化。我希望对此有所了解。这里是“规则”的数据库:数据库设计审查

  1. 该组织由三个层次:

    一个。局 - 是最高级别
    b。办公室 - 每个局可以有多个办公室
    c。分部 - 每个办公室可以有多个部门

  2. 我们有三个层级的所有员工。例如:

    a。我们有局级职员。他们不属于办公室或部门。监督所有办公室,但不属于他们
    b。我们拥有不属于特定部门的办公室级员工,但监督所有部门
    c。属于分部的部门级人员

  3. 我们也有项目。一个项目可以在不同级别:

    a。 b。全局项目
    b。跨越多个办事处的项目
    c。仅在一个部门的项目

  4. 每个项目都需要由至少一名员工管理,具有特定角色(项目经理)员工表将由具有其他角色的个人组成,甚至是多个角色。

目前,我有以下模式(它删节为了简洁):

enter image description here

有了这个模式,我发现了以下问题:

  1. 所有项目与这个模型中的一个部门联系在一起。但事实上,并非所有项目都直接归属于一个部门。有些可能在办公室或局级。其他人可能跨越多个办公室或局(但不跨越多个局和办公室)。所以,我通过在每个组织层级中有额外的选项来解决这个问题。例如。在分区表中,我可以选择全局或全局。或者我可能有Office One/Office Two等选项。

  2. 我看到的另一个问题:每个角色表都有许多重复的值。例如,如果我们看分割角色表。几乎所有的部门都有相同的作用。所以,我有DivisionManager,divisonPM,divisionLead多次列出(每个分区一次)。有时候,一个部门可能有独特的地位,但这种情况很少见。这是真实的BureauRole和OfficeRole表

所以,我正在寻找建议如何更好地规范化这个数据库,并解决上述情况。任何人都有建议?

+0

'它删节的brevity' ...有多大实际模式呢? –

+0

约25桌。大多数表格都是关于ProjectsTable的一对多表格。例如,有一个名为ProjectType的表格。每个项目都可以是特定的类型。 – jason

回答

1

您也可以用具有自我导向的外键指示父一个单一的组织表替代你的三个不同的组织层次显著简化这个数据库的设计。

考虑这样的事情:

CREATE TABLE ORGANIZATION 
(org_id   int IDENTITY NOT NULL 
, org_level  CHAR(1) NOT NULL 
, [name]   VARCHAR(50) NOT NULL 
, parent_org_id INT 
, constraint pk_org PRIMARY KEY (org_id) 
, constraint fk_org_hierarchy FOREIGN KEY (parent_org_id) 
    REFERENCES ORGANIZATION (org_id) 
, constraint ck_org_level CHECK 
    ( org_level = 'B' -- Bureau 
    OR org_level = 'O' -- Office 
    OR org_level = 'D')-- Division 
, constraint ck_org_root CHECK 
    ( (org_level = 'B' AND parent_org_id IS NULL) 
    OR (org_level <> 'B' AND parent_org_id IS NOT NULL)) 
); 

现在你把所有的组织水平的一个表,这意味着所有的多对多的交叉点表可以从三来一折叠,以及,你有能力将其他外键关系(如project中的外键关系)分配给组织的任何级别。

请注意,您可以添加其他的限制了,所以,你可以执行你的业务规则,如:

4.Every项目需要由至少一个员工进行管理,具有特定作用(项目经理)强硬的员工表将由 组成,具有其他角色的个人,甚至多个角色。

要记住的一件事是管理关系数据库中的分层数据有点棘手。但是,有些事情可以做得更简单。例如,有关管理RDBMS中的层次结构的更多信息,请参见my answer to this question

+0

我喜欢为组织使用递归表的想法。但是,这将如何解决我的第二个担忧:就角色而言,我经常会有重复。例如,每个部门都有一个PM。所以,如果我有5个部门,我现在在角色表中有5个“PM”角色。任何想法如何最好地正常化? – jason

+0

@jason - 我从标准化角度看到的角色真正的问题是名称每个部门都设置一次。如果您有5个“项目经理”实例,则会创建更新异常。如果您的组织决定将此角色名称更改为“六西格玛黑带”,该怎么办?如果这不是你所关心的,那就把它留下。 (续) –

+0

@jason继续...如果它是一个问题,然后进行,只是有角色名的'role'表,无论是从与职工的路口有一个FK(例如'divisionRoleEmployees') - 这会让你放弃'divisionRole'。或者,你可以保留你的'divisionRole'表,并用FK替换'name'到新的'role'表。后一种方法不会减少你的表的数量,但它规范你的角色名称。正如我所说,如果您的业务规则声明角色名称存在于各个组织组(如分部),这只会有所帮助。 –