【问题标题】:Database Design review数据库设计审查
【发布时间】:2017-08-25 23:03:19
【问题描述】:

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

  1. 该组织由三个层次结构组成:

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

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

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

  3. 我们也有项目。一个项目可以有不同的层次:

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

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

目前,我有以下架构(为简洁起见,已被删减):

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

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

  2. 我看到的另一个问题:每个角色表都有许多重复值。例如,如果我们查看 DivisionRole 表。几乎所有部门都有相同的作用。因此,我多次列出了 DivisionManager、divisonPM、divisionLead(每个部门一次)。有时,一个部门可能有一个独特的位置,但这很少见。 BureauRole 和 OfficeRole 表也是如此

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

【问题讨论】:

  • it’s abridged for brevity ... 那么实际架构有多大?
  • 大约 25 张桌子。大多数表是关于 ProjectsTable 的一对多的。例如,有一个名为 ProjectType 的表。每个项目都可以属于特定类型。

标签: database database-design relational-database normalization database-normalization


【解决方案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. 每个项目都需要由至少一名员工管理,拥有一个特定角色(项目经理)很难让员工表 由具有其他角色甚至多个角色的个人组成。

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

【讨论】:

  • 我喜欢为组织使用递归表的想法。但是,这将如何解决我的第二个问题:关于角色,我经常有重复。例如,每个部门都有一个 PM。所以,如果我有 5 个部门,我现在在角色表中有 5 个“PM”角色。关于如何最好地使其正常化的任何想法?
  • @jason - 从规范化的角度来看,我看到的角色的真正问题是每个部门都设置了一次名称。如果您说有 5 个“项目经理”实例,这会导致更新异常。如果您的组织决定将此角色名称更改为“六西格码黑带”怎么办?如果这不是您关心的问题,请保持原样。 (续...)
  • @jason 继续...这将允许您删除divisionRole。或者,您可以保留 divisionRole 表并将 name 替换为新的 role 表的 FK。后一种方法不会减少您的表数,但它会规范您的角色名称。正如我所说,这仅在您的业务规则规定角色名称跨组织组(如部门)存在时才有用。
  • 太好了,感谢您的帮助!我想我会使用你建议的递归设计
猜你喜欢
  • 2011-01-02
  • 2010-12-14
  • 2011-08-09
  • 2012-10-27
  • 1970-01-01
  • 1970-01-01
  • 2011-03-17
  • 2017-12-19
  • 2012-05-30
相关资源
最近更新 更多