数据库设计审查
Database Design review
我有一个旧的数据库设计,我认为我可以简化并使其更加规范化。我希望对此有一些想法。以下是数据库的“规则”:
组织由三个层级组成:
一个。局-是最高级别
b.办公室 - 每个局可以有多个办公室
C。部门 - 每个办公室可以有多个部门
我们的员工在所有三个层级工作。例如:
一个。我们有局级人员。他们不属于办公室或部门。监督所有办公室,但不属于他们
b.我们有 Office 级员工,不属于特定部门,但监督所有部门
C。属于一个部门的部门级人员
我们也有项目。一个项目可以有多个级别:
一个。局级项目
b.跨越多个办公室的项目
C。一个部门的项目
每个项目都需要由至少一名员工管理,具有特定角色(项目经理),但员工 table 可能由担任其他角色的个人组成,甚至是多个角色。
目前,我有以下架构(为简洁起见进行了删减):
使用此架构,我发现了以下问题:
在此模型中,所有项目都绑定到一个部门。但是,实际上,并不是所有的项目都直接归属于一个部门table。有些可能在办公室或局级。其他人可能跨多个办公室或局(但不跨多个局和办公室)。因此,我通过在每个组织层中提供额外选项来解决这个问题。例如。在 Division Table,我可以选择 Office Wide 或 Bureau Wide。或者我可能有一个选项,例如 Office One/Office 二。
我看到的另一个问题:每个角色 table 都有很多重复值。例如,如果我们查看 divisionRole table。几乎所有部门都有相同的角色。因此,我多次列出了 DivisionManager、divisonPM、divisionLead(每个部门一次)。有时,一个部门可能有独特的地位,但这种情况很少见。这对于 BureauRole 和 OfficeRole tables
是正确的
因此,我正在寻求有关如何更好地规范化此数据库并解决上述情况的建议。有人有建议吗?
您可以通过将三个不同的组织级别替换为一个组织 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。
我有一个旧的数据库设计,我认为我可以简化并使其更加规范化。我希望对此有一些想法。以下是数据库的“规则”:
组织由三个层级组成:
一个。局-是最高级别
b.办公室 - 每个局可以有多个办公室
C。部门 - 每个办公室可以有多个部门我们的员工在所有三个层级工作。例如:
一个。我们有局级人员。他们不属于办公室或部门。监督所有办公室,但不属于他们
b.我们有 Office 级员工,不属于特定部门,但监督所有部门
C。属于一个部门的部门级人员我们也有项目。一个项目可以有多个级别:
一个。局级项目
b.跨越多个办公室的项目
C。一个部门的项目每个项目都需要由至少一名员工管理,具有特定角色(项目经理),但员工 table 可能由担任其他角色的个人组成,甚至是多个角色。
目前,我有以下架构(为简洁起见进行了删减):
使用此架构,我发现了以下问题:
在此模型中,所有项目都绑定到一个部门。但是,实际上,并不是所有的项目都直接归属于一个部门table。有些可能在办公室或局级。其他人可能跨多个办公室或局(但不跨多个局和办公室)。因此,我通过在每个组织层中提供额外选项来解决这个问题。例如。在 Division Table,我可以选择 Office Wide 或 Bureau Wide。或者我可能有一个选项,例如 Office One/Office 二。
我看到的另一个问题:每个角色 table 都有很多重复值。例如,如果我们查看 divisionRole table。几乎所有部门都有相同的角色。因此,我多次列出了 DivisionManager、divisonPM、divisionLead(每个部门一次)。有时,一个部门可能有独特的地位,但这种情况很少见。这对于 BureauRole 和 OfficeRole tables
是正确的
因此,我正在寻求有关如何更好地规范化此数据库并解决上述情况的建议。有人有建议吗?
您可以通过将三个不同的组织级别替换为一个组织 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。