这可能很简单,但我发现解决它很困难。
我有3张桌子;这里的Employee
,manager
,supervisor
manager
和supervisor
是表employee
的特化。现在我有另一张表Project
表,应该有1位经理和3位主管。
如何将它放在我的mysql数据库中?
由于Employee
有Employeeid
,name
,position
和manager
将employeeid
作为pk,fk sme {{1}其中supervisor
为pk和fk。如何将数据放在管理器和管理程序表中?我使用视图吗?
mysql如何知道哪个是经理,哪个是主管?
答案 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
如果Manager
或Supervisor
的特定数据为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