如何设计工作者角色表

时间:2013-06-04 14:50:22

标签: sql-server-2008 database-design

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

到目前为止,我有三张桌子:

TblDepartments
--------------
DeptID (PK)
DeptName

TblSections
-----------
SectionID (PK)
DeptID (FK)
SectionName

TblWorkers
----------
WorkerID (PK)
WorkerName

部门和部门之间存在1:N关系(部门可能有多个部分,部分属于一个部门)。

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

我不确定如何定义Roles表。我带来了这个定义:

TblRoles
--------
WorkerID  (PK)(FK)
DeptID    (PK)(FK)
SectionID (PK)(FK)
RoleDesc

但我不喜欢这个解决方案而且我觉得它错了。 (DeptID或SectionID必须为null,而且SectionID依赖于DeptID)。

有更好的方法来定义Roles表吗?

2 个答案:

答案 0 :(得分:0)

首先,您需要一个只有角色的表,因为您无法获得重复数据。

roles
-----
roleId
name

工人可以有多个角色吗?

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

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

worker
------
workerId
name
roleId

如果角色可以属于某个部门和部门,则每个角色都有一个表格:

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

Don't prefix your tables with tbl

答案 1 :(得分:0)

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

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

在此结构中,具有null ParentDeptId的Department是Department,而具有非null ParentDeptId的Department是section。然后你的角色表是直截了当的:

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
    )