在MySQL的一个表中存储100多列的最佳方法

时间:2018-02-08 02:28:41

标签: mysql sql database

我正在开发一个数据模型,我需要在MySQL数据库中存储员工的基本详细信息和技能组评级。

每位员工的技能组合数量超过100。 所以我需要存储的信息如下: 员工ID,姓名,部门,联系信息,Skillset1,Skillset2,Skillset3,...,Skillset115

创建一个大约120列的表是一种好方法吗? 如果没有,那么处理这种要求的最佳做法是什么。

2 个答案:

答案 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。这只是众多其他人的一个优势。