概括和专业化

时间:2012-02-25 22:28:46

标签: database-design

这可能很简单,但我发现解决它很困难。

我有3张桌子;这里的Employeemanagersupervisor managersupervisor是表employee的特化。现在我有另一张表Project表,应该有1位经理和3位主管。

如何将它放在我的mysql数据库中?

由于EmployeeEmployeeidnamepositionmanageremployeeid作为pk,fk sme {{1}其中supervisor为pk和fk。如何将数据放在管理器和管理程序表中?我使用视图吗?

mysql如何知道哪个是经理,哪个是主管?

1 个答案:

答案 0 :(得分:2)

如何连接表格:

您可以使用以下列制作附加表ProjectMember

employeeId
projectId
role

角色可以是“经理”或“主管”。

所以,如果这些是你的Employee s:

employeeId    name
1             Mark
2             Steve
3             Simon
4             Stan

这是你的Project

projectId    name
1            Project X 

然后ProjectMember表可以包含以下行:

employeeId projectId role
1          1         manager
2          1         supervisor
3          1         supervisor
4          1         supervisor

要获取Project X的所有成员的名称,您可以使用以下查询:

SELECT emp.name AS name, pm.role AS role
FROM ProjectMember pm
JOIN Employee emp
ON pm.employeeId = emp.employeeId
WHERE pm.projectId = 1

这将返回:

name   role
Mark   manager
Steve  supervisor
Simon  supervisor
Stan   supervisor

添加专业化

如果ManagerSupervisor的特定数据为Employee的特化,则您可以按如下方式检索其他数据。

假设马克是Manager,那么这可以是Manager中的一行:

employeeId clearanceLevel
1          10

编辑:要存储Manager,您首先要存储Employee并获取其(可能已生成)employeeId。如何获取生成的id取决于您使用的数据库系统(请参阅this on MySQL)。然后,您在Manager中使用相同的employeeId存储一行。

要获得这些附加信息,虽然您事先并不知道谁在Manager表中,但您可以使用LEFT JOIN从可选附加表中检索数据(它们可能会也可能不会在那里,但你仍然希望获得基本的查询行:

SELECT emp.name AS name, pm.role AS role, mgr.clearanceLevel AS clearanceLevel
FROM ProjectMember pm
JOIN Employee emp
ON pm.employeeId = emp.employeeId
LEFT JOIN Manager mgr
ON mgr.employeeId = emp.employeeId
WHERE pm.projectId = 1

这将返回:

name   role       clearanceLevel
Mark   manager    10
Steve  supervisor NULL
Simon  supervisor NULL
Stan   supervisor NULL