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

Database structure for storing personal skills

我需要设计一个数据库来存储一个人的技能,一个人可以有none,一个或几个技能,在方便修改技能和快速搜索?

我一直在想 1.使用位数组,每个位代表一个技能, 2. 关系 table 每一行 link 一个人到一个技能 3.每个技能作为一个字段在table的人

还有什么建议或者我的目标是什么?

这是一个经典的多对多关系,所以我会建议一个人 table、技能 table 和一个 personToSkill table。您建议的其他解决方案一开始可能很诱人,但它们都是维修地狱。

首先,我们需要一个persons table(所有代码示例都使用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';

并假装这是 table:

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

那么我们需要一个skills table来容纳所有已知的技能:

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     |
| .. | ............. |
|----|---------------|

最后我们需要一个 table 将 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;

定义了主键,因此任何人都不能多次与同一技能相关联,并且两列都是各自 table 的外键。

假设数据如下:

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

这个数据表明 John Doe、Benny Hill 和 Linus Torvalds 都拥有 "Swimming" 的技能。 Benny Hill 和 Donald Knuth 都是飞行员。 Linus Torvalds 创建了一个内核。 Donald Knuth 是一位作家。 None 的人是宇航员...