使用具有多对多关系的公用表

时间:2015-04-10 21:06:01

标签: sql sql-server

我有两个SQL表:Job和Employee。我需要比较工作语言的熟练程度和员工语言的熟练程度。语言能力由语言和语言水平组成。

create table dbo.EmployeeLanguageProficiency (
  EmployeeId int not null, 
  LanguageProficiencyId int not null,
    constraint PK_ELP primary key clustered (EmployeeId, LanguageProficiencyId)
)

create table dbo.JobLanguageProficiency (
  JobId int not null, 
  LanguageProficiencyId int not null,
    constraint PK_JLP primary key clustered (JobId, LanguageProficiencyId)
)

create table dbo.LanguageProficiency (
  Id int identity not null
    constraint PK_LanguageProficiency_Id primary key clustered (Id),
  LanguageCode nvarchar (4) not null,
  LanguageLevelId int not null,
    constraint UQ_LP unique (LanguageCode, LanguageLevelId)
)

create table dbo.LanguageLevel ( 
  Id int identity not null
    constraint PK_LanguageLevel_Id primary key clustered (Id),
  Name nvarchar (80) not null
    constraint UQ_LanguageLevel_Name unique (Name)
)

create table dbo.[Language]
( 
  Code nvarchar (4) not null
    constraint PK_Language_Code primary key clustered (Code),
  Name nvarchar (80) not null
)

我的问题是关于LanguageProficiency表。我添加了Id有PK但我不确定这是最好的选择。

您如何看待这个计划?

1 个答案:

答案 0 :(得分:0)

您对EmployeeId,LanguageProficiencyId的约束允许员工每种语言具有多种熟练程度。这听起来违反直觉。

这样会更干净,因为它只允许每种语言输入一个条目:

create table dbo.EmployeeLanguageProficiency (
  EmployeeId int not null, 
  LanguageId int not null,
  LanguageLevelId int not null,
    constraint PK_ELP primary key clustered (EmployeeId, LanguageId)
)

目前我还没有看到表格LanguageProficiency的意思。

同样适用于工作当然。除非你想允许“范围”的熟练程度。但假设“熟练程度太高”没有受到伤害,可以通过查询中的> =语句轻松定义。

RGDS