如何提高/最大化当前数据库/表结构的效率?

时间:2019-12-16 03:55:52

标签: mysql sql database data-structures database-design

我的数据库表的当前结构如下;我有两个表“用户”和“技能”,并包含以下各列:

用户

user_id   f_name   l_name    biography    password   email          role
_____________________________________________________________________
1         John     Program   Short Bio    Password   johnprogram@   Programmer
2         Jeff     Analyst   Another Bio  Password   jeffanalyst@   Finance Analyst
3         Mister   Manager   My Bio       Password   mrmanager@     Project Manager

技能

user_id   skill_1   skill_1_details      skill_2             skill_2_details     skill_3     skill_3_details
_________________________________________________________________________________
1         PHP       John writes PHP      Python              John writes Python  Perl        John writes Perl
2         Excel     I use Excel daily    SAP                 SAP Reporting       Reporting   Reports created with Excel
3         Billing   Oversee Bill. Team   Workflow Assignment I assign team acc.

每当我查询表中的数据以显示在“配置文件”页面上时,信息就会显示如下:

Name: John Program
Role: Programmer
Short Bio

Skill: PHP
Details: John writes PHP

Skill: Python
Details: John writes Python

Skill: Perl
Details: John writes Perl

问题:

1)鉴于显示要求,应该对表结构进行哪些重新调整/更改以提高效率/灵活性?

2)如果要添加“以前使用技能的项目”列,为了提高效率,是否可以将其添加到第二张表中,如下所示:

user_id   skill_1   skill_1_details      projects_using_skill_1
_________________________________________________________________________________
1         PHP       John writes PHP      8                         Python              John writes Python  Perl        John writes Perl
2         Excel     I use Excel daily    12                        SAP                 SAP Reporting       Reporting   Reports created with Excel
3         Billing   Oversee Bill. Team   3                         Workflow Assignment I assign team acc.

1 个答案:

答案 0 :(得分:1)

对于技能-用户关系,您可以有两种不同的解决方案:如果每个用户都有自己的技能和详细信息,则可以使用技能表来表示它们,每行每位用户只有一项技能(因此,用户具有四个技能,该表将具有四行):

Skills (user_id, skill, detail)

使用主键,一对user_id,技能。

通过这种方式,要查找特定用户的所有技能,您可以将两个表结合在一起并找到所有相关信息。

如果相反,几个用户可以具有相同的技能,则应该使用三个表:

Users (user_id, f_name, ...)
Skills (skill_id, skill_name, skill_detail)
UsersSkills (user_id, skill_id)

或者,如果您希望每个用户都有自己的技能详细信息,但又想分享这些技能,则可以执行以下操作:

Users (user_id, f_name, ...)
Skills (skill_id, skill_name)
UsersSkills (user_id, skill_id,  skill_detail)

对于第二个问题,如果用户已经使用某种技能完成了多个项目,并且假设您选择了上面的第一个解决方案,则可以定义一个新表:

ProjectUsers (user_id, skill, project_id)

具有主键的所有三个属性,以及具有user_id的Skills表的技能外键。