我正在开发一个数据模型,我需要在MySQL数据库中存储员工的基本详细信息和技能组评级。
每位员工的技能组合数量超过100。 所以我需要存储的信息如下: 员工ID,姓名,部门,联系信息,Skillset1,Skillset2,Skillset3,...,Skillset115
创建一个大约120列的表是一种好方法吗? 如果没有,那么处理这种要求的最佳做法是什么。
答案 0 :(得分:3)
没有。您应该有一个单独的表,每个员工和每个技能一行:
create table employeeSkills (
employeeSkillId int auto_increment primary key,
employeeId int not null,
skill varchar(255),
constraint fk_employeeSkills_employeeid foreign key (employeeId) references employees(employeeId)
);
事实上,你应该有两个额外的表。技能本身应该存储在一个单独的表中,上面应该是:
create table employeeSkills (
employeeSkillId int auto_increment primary key,
employeeId int not null,
skillId int,
constraint fk_employeeSkills_employeeid foreign key (employeeId) references employees(employeeId),
constraint fk_employeeSkills_skillid foreign key (skillId) references skills(skillId)
);
这种类型的表称为“联结表”,在任何正确构造的数据模型中都很常见。
答案 1 :(得分:0)
您需要创建两个表来处理每位员工的技能和分配的技能。
这会在您的数据库中为您提供正确的订单,并且还会在将来扩展您的选项。它会更好地搜索,添加和分配每个员工的技能。它更有条理,并且可以轻松扩展,例如添加技能类别和子类别。
两个表架构应该是这样的:
CREATE TABLE Skills (
Skill_ID INT NOT NULL AUTO_INCREMENT,
Skill_Description VARCHAR(250),
PRIMARY KEY (`Skill_ID`)
);
CREATE TABLE EmpolyeeSkills (
ES_ID INT NOT NULL AUTO_INCREMENT,
Skill_ID INT,
Employee_ID INT,
PRIMARY KEY (`ES_ID`),
CONSTRAINT FK_EMPLOYEEID FOREIGN KEY (Employee_ID) REFERENCES Employees(Employee_ID),
CONSTRAINT FK_SKILLID FOREIGN KEY (Skill_ID) REFERENCES Skills(Skill_ID)
);
技能表将为每项技能指定一个ID,并且它将位于单独的表中。这将使您拥有一个独特的技能列表,不会有任何冗余。然后,您将使用EmployeeSkills在每个Employee_ID上保存指定的技能。您可以在以后使用它将其与其他记录连接起来。
Employee_ID和Skill_ID上的FOREIGN KEY将帮助您监控它们之间的技能。 EmpolyeeSkills的ES_ID主键将是一个额外的优势,可以在将来有所帮助。例如,如果您想知道已分配的最新技能,那么您的更快方法将获得最后一个ES_ID,因为它是AUTO_INCREMENT。这只是众多其他人的一个优势。