我需要設計一個用於存儲一個人的技能的數據庫,一個人可以沒有,一個或多個技能,當涉及到輕鬆修改技能時,什麼是存儲它的好方法和快速搜索?用於存儲個人技能的數據庫結構
我一直在想 1.使用一個位陣列,每個位的位置表示一個技巧, 2.一個關係表,每個行中的人 3.每個技能中的錶鏈接到一個技能作爲場人
任何其他建議或我應該瞄準?
我需要設計一個用於存儲一個人的技能的數據庫,一個人可以沒有,一個或多個技能,當涉及到輕鬆修改技能時,什麼是存儲它的好方法和快速搜索?用於存儲個人技能的數據庫結構
我一直在想 1.使用一個位陣列,每個位的位置表示一個技巧, 2.一個關係表,每個行中的人 3.每個技能中的錶鏈接到一個技能作爲場人
任何其他建議或我應該瞄準?
首先,我們需要一個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 |
| ......... | ........ |
|-----------|----------|
這個數據表明,李四,尼山和Linus Torvalds的所有有本事「游泳」。本尼希爾和唐納德克努斯都是飛行員。 Linus Torvalds創建了一個內核。唐納德克努特是一位作家。這些人都不是宇航員......
這是多對多的關係,所以我會建議一個人的表,技能表和personToSkill表CLASIC。你其他建議的解決方案起初可能是誘人的,但它們都是地獄。
這被稱爲數據庫規範化。埃德加科德寫了一套很好的規則,你可以(應該)遵循。 70年代初製造,但仍然活着並且踢! https://en.wikipedia.org/wiki/Database_normalization – Roger