数据库设计审查

Database Design review

我有一个旧的数据库设计,我认为我可以简化并使其更加规范化。我希望对此有一些想法。以下是数据库的“规则”:

  1. 组织由三个层级组成:

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

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

    一个。我们有局级人员。他们不属于办公室或部门。监督所有办公室,但不属于他们
    b.我们有 Office 级员工,不属于特定部门,但监督所有部门
    C。属于一个部门的部门级人员

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

    一个。局级项目
    b.跨越多个办公室的项目
    C。一个部门的项目

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

目前,我有以下架构(为简洁起见进行了删减):

使用此架构,我发现了以下问题:

  1. 在此模型中,所有项目都绑定到一个部门。但是,实际上,并不是所有的项目都直接归属于一个部门table。有些可能在办公室或局级。其他人可能跨多个办公室或局(但不跨多个局和办公室)。因此,我通过在每个组织层中提供额外选项来解决这个问题。例如。在 Division Table,我可以选择 Office Wide 或 Bureau Wide。或者我可能有一个选项,例如 Office One/Office 二。

  2. 我看到的另一个问题:每个角色 table 都有很多重复值。例如,如果我们查看 divisionRole table。几乎所有部门都有相同的角色。因此,我多次列出了 DivisionManager、divisonPM、divisionLead(每个部门一次)。有时,一个部门可能有独特的地位,但这种情况很少见。这对于 BureauRole 和 OfficeRole tables

  3. 是正确的

因此,我正在寻求有关如何更好地规范化此数据库并解决上述情况的建议。有人有建议吗?

您可以通过将三个不同的组织级别替换为一个组织 table 来显着简化此数据库设计,该组织具有指示父级的自导向外键。

考虑这样的事情:

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) )
);

现在您的所有组织级别都在一个 table 中,这意味着您所有的多对多交集 table 也可以从三折叠为一,并且您有能够分配其他外键关系,例如来自 project 的关系到组织的任何级别。

请注意,您也可以添加其他约束,以便执行您的业务规则,例如:

4.Every project needs to be managed by at least one employee, having a specific role (project manager) tough the employees table would be made of individuals with other roles, and even multiple roles.

要记住的一件事是,在关系数据库中管理分层数据有点棘手。但是,您可以采取一些措施来简化此操作。例如,有关在 RDBMS 中管理层次结构的更多信息,请参阅 my answer to this question