繁体   English   中英

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

[英]Best approach to store 100+ columns in one table in MySQL

我正在一个数据模型上,我需要在mysql数据库中存储Employee的基本详细信息和他对技能的评价。

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

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

否。您应该有一个单独的表格,每个员工和每个技能一行:

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)
);

这种类型的表称为“连接表”,在任何适当构造的数据模型中都很常见。

您需要创建两个表来处理每个员工的技能和分配的技能。

这将为您提供适当的数据库顺序,并在将来扩展您的选择范围。 搜索,添加和分配技能给每个员工会更好。 它甚至更有组织,并且可以轻松扩展,例如添加技能类别和子类别。

这两个表的架构应该是这样的:

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,该ID将在单独的表中。 这将使您拥有独特的技能列表,不会有任何冗余。 然后,您将使用EmployeeSkills在每个Employee_ID上保存分配的技能。 以后可以使用它与其他记录联接。

Employee_ID和Skill_ID上的FOREIGN KEY将帮助您监视它们之间的技能。 EmpolyeeSkills的ES_ID主键将是一个额外的优势,将来可能会有所帮助。 例如,如果您想知道已分配的最新技能,则更快的方法是获取最后的ES_ID,因为它是AUTO_INCREMENT。 这只是其他众多优点中的一种。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM