我需要设计一个数据库来存储一个人的技能,一个人可以没有,一个或几个技能,在轻松修改技能和快速搜索时,什么是存储它的好方法?
我一直在想 1.使用位数组,每个位位代表一个技能, 2.每个行将一个人链接到一个SKILL的关系表 3.每个技能作为人员表中的一个字段
任何其他建议或我应该瞄准什么?
答案 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 |
| .. | ............. |
|----|---------------|
最后,我们需要一个将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;
定义主键,以便任何人不能多次与同一技能相关联,并且两列都是其各自表的外键。
假设以下数据:
|-----------|----------|
| 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表。你其他建议的解决方案起初可能很诱人,但它们都是一种恶意的地狱。