【问题标题】:Database structure for storing personal skills存储个人技能的数据库结构
【发布时间】:2015-05-29 13:11:50
【问题描述】:

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

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

还有什么建议或者我应该追求什么?

【问题讨论】:

标签: database database-design


【解决方案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 创建了一个内核。 Donald Knuth 是一位作家。这些人都不是宇航员......

【讨论】:

    【解决方案2】:

    这是一个经典的多对多关系,所以我建议使用人员表、技能表和 personToSkill 表。您提出的其他解决方案起初可能很诱人,但它们都是维护地狱。

    【讨论】:

      猜你喜欢
      • 2014-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-10
      • 1970-01-01
      • 1970-01-01
      • 2021-02-26
      相关资源
      最近更新 更多