存储个人技能的数据库结构

时间:2015-05-28 18:23:06

标签: database database-design

我需要设计一个数据库来存储一个人的技能,一个人可以没有,一个或几个技能,在轻松修改技能和快速搜索时,什么是存储它的好方法?

我一直在想 1.使用位数组,每个位位代表一个技能, 2.每个行将一个人链接到一个SKILL的关系表 3.每个技能作为人员表中的一个字段

任何其他建议或我应该瞄准什么?

2 个答案:

答案 0 :(得分:1)

首先,我们需要一个persons表(所有代码示例都使用MySQL语法):

CREATE TABLE IF NOT EXISTS `persons` (
    `id`            int unsigned    NOT NULL AUTOINCREMENT,
    `first_name`    varchar(50)     NOT NULL,
    `last_name`     varchar(50)     NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB Comment='Persons';

并假装这是表格中的数据:

|----|------------|-----------|
| id | first_name | last_name |
|----|------------|-----------|
|  1 | John       | Doe       |
|  2 | Benny      | Hill      |
|  3 | Linus      | Torvalds  |
|  4 | Donald     | Knuth     |
| .. | .......... | ......... |
|----|------------|-----------|

然后我们需要一个skills表来掌握所有已知的技能:

CREATE TABLE IF NOT EXISTS `skills` (
    `id`    int unsigned    NOT NULL AUTOINCREMENT,
    `name`  varchar(50)     NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB Comment='Skills';

|----|---------------|
| id | name          |
|----|---------------|
|  1 | Swimming      |
|  2 | Pilot         |
|  3 | Writing       |
|  4 | Create kernel |
|  5 | Astronaut     |
| .. | ............. |
|----|---------------|

最后,我们需要一个将personskill

相关联的表格
CREATE TABLE IF NOT EXISTS `persons_skills` (
    `person_id`     int unsigned    NOT NULL,
    `skill_id`      int unsigned    NOT NULL,
    PRIMARY KEY (`person_id`, `skill_id`),
    KEY (`person_id`),
    KEY (`skill_id`)
) ENGINE=InnoDB Comment='Skills held by every person';

ALTER TABLE `persons_skills`
    ADD FOREIGN KEY (`person_id`) REFERENCES `persons` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
    ADD FOREIGN KEY (`skill_id`) REFERENCES `skills` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

定义主键,以便任何人不能多次与同一技能相关联,并且两列都是其各自表的外键。

假设以下数据:

|-----------|----------|
| person_id | skill_id |
|-----------|----------|
|         1 |        1 |
|         2 |        1 |
|         2 |        2 |
|         3 |        1 |
|         3 |        4 |
|         4 |        2 |
|         4 |        3 |
| ......... | ........ |
|-----------|----------|

这些数据表明John Doe,Benny Hill和Linus Torvalds都具备这项技能"游泳"。 Benny Hill和Donald Knuth都是飞行员。 Linus Torvalds创建了一个内核。唐纳德克努特是一位作家。这些人都不是宇航员...

答案 1 :(得分:0)

这是一个多对多的关系,所以我会建议一个人员表,技能表和一个人的Toskill表。你其他建议的解决方案起初可能很诱人,但它们都是一种恶意的地狱。