0

我需要数据库设计方面的帮助。

到目前为止,我有三个表:

Tbl部门
--------------
部门 ID (PK)
部门名称

TblSection
------------
部分 ID (PK)
部门 ID (FK)
部分名称

TblWorkers
----------
工人ID (PK)
工人姓名

Departments 和 Sections 之间是 1:N 的关系(一个部门可能有几个部门,一个部门属于一个部门)。

现在,工作人员可能在部门级别或部门级别具有角色(即在部门的所有部门中具有相同的角色)。

我不确定应该如何定义 Roles 表。我提出了这个定义:

表角色
--------
工人ID (PK)(FK)
部门 ID (PK)(FK)
SectionID (PK)(FK)
角色描述

但我不喜欢这个解决方案,我觉得它是错误的。(DeptID 或 SectionID 必须为空,并且 SectionID 无论如何都依赖于 DeptID)。

有没有更好的方法来定义角色表?

4

2 回答 2

0

如果 Sections 和 Departments 的结构几乎相同,则可以使用自联接

Create Table Departments 
    ( 
    DeptId ... not null Primary Key
    , ParentDeptId null References Departments ( DeptId )
    , Name ... not null Unique
    )

在此结构中,ParentDeptId 为空的部门是部门,ParentDeptId 为非空的部门是节。那么你的角色表就很简单了:

Create Table Roles
    (
    WorkerId ... not null References Workers ( WorkerId )
    , DeptId ... not null References Departments ( DeptId )
    , Description ... not null
    )

另一种选择是创建一个捕获公司层次结构的表。

Create Table Departments 
    ( 
    DeptId ... not null Primary Key
    , Name ... not null Unique
    )

Create Table Sections
    (
    SectionId ... not null Primary Key
    , Name ... not null Unique
    )

在下表中,SectionId 为 null 的地方代表一个部门,SectionId 不为 null 的地方显然代表一个 Section。

Create Table CompanyAreas
    (
    Id ... not null Primary Key
    , DeptId ... not null References Departments ( DeptId )
    , SectionId ... null References Sections ( SectionId )
    , Unique ( DeptId, SectionId )
    )

Create Table WorkerRoles
    (
    CompanyAreaId ... not null References CompanyAreas ( Id )
    , WorkerId ... not null References Workers ( WorkerId )
    , Description ... not null
    )
于 2013-06-04T15:03:46.033 回答
0

首先,您需要一个仅包含角色的表,因为您不能有重复数据。

roles
-----
roleId
name

工人可以担任多个角色吗?

workerRole
----------
workerId
roleId

如果一个工作人员只有一个角色,只需将其添加到您的工作人员表中

worker
------
workerId
name
roleId

如果一个角色可以属于一个部门和部门,那么每个角色一个表:

departmentRole        sectionRole
--------------        -----------
departmentId          sectionId
roleId                roleId

不要在表格前加上tbl

于 2013-06-04T14:54:23.573 回答