存储个人技能的数据库结构
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 将 person
与 skill
相关联:
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 的人是宇航员...
我需要设计一个数据库来存储一个人的技能,一个人可以有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 将 person
与 skill
相关联:
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 的人是宇航员...