可以将复合主键的一部分用作另一个表上的复合主键的一部分吗?

时间:2012-07-15 06:11:06

标签: sql many-to-many

我想弄清楚如何创建这种关系。参加奖励计划的员工。他们可以参加多年,也可以做同样的工作。所以这是一个多对多的关系。我还需要能够获得年度记录。这是最好的方法吗?甚至可能吗?

员工表:

EmpID PK
Year PK

工作表:

JobID PK
Year  PK

2 个答案:

答案 0 :(得分:1)

对于多对多的关系,标准方法是创建一个单独的表(mysql语法):

CREATE TABLE employee_job
( empl_id integer not null,
  job_id integer not null,
  foreign key (empl_id) references employee(empl_id),
  foreign key (job_id) references job(job_id)
)

答案 1 :(得分:0)

如果您只想存储哪位员工参与哪一年的工作,您可以采用更简单的设计:

Employee        
--------
EmpID PK

Job
--------
JobID PK

Year (optional)
--------
Year  PK

Participation        
-------------
EmpID PK, FK1
JobID PK, FK2
Year PK, FK3  (the FK3 is optional)

如果您还想在单独的表格中存储哪些职位在哪一年处于活动/可用状态以及哪些员工在哪一年工作(例如,如果您的雇员已经雇用了几年但没有参加任何工作,或者如果您有那些可用但没有人工作的工作),你可能会有更复杂的设计建议:

Employee        
--------
EmpID PK

Job
--------
JobID PK

Year
--------
Year  PK

Employment
----------
EmpID PK, FK 
Year PK, FK

JobActivity
-----------
JobID PK, FK 
Year PK, FK

Participation        
-------------
EmpID PK, FK1
JobID PK, FK2
Year PK, FK1, FK2 

FK1会引用Employment(EmpID, Year)而FK2会引用JobActivity(JobID, Year)