2015-05-28 78 views
0

我需要設計一個用於存儲一個人的技能的數據庫,一個人可以沒有,一個或多個技能,當涉及到輕鬆修改技能時,什麼是存儲它的好方法和快速搜索?用於存儲個人技能的數據庫結構

我一直在想 1.使用一個位陣列,每個位的位置表示一個技巧, 2.一個關係表,每個行中的人 3.每個技能中的錶鏈接到一個技能作爲場人

任何其他建議或我應該瞄準?

+1

這被稱爲數據庫規範化。埃德加科德寫了一套很好的規則,你可以(應該)遵循。 70年代初製造,但仍然活着並且踢! https://en.wikipedia.org/wiki/Database_normalization – Roger

回答

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

這個數據表明,李四,尼山和Linus Torvalds的所有有本事「游泳」。本尼希爾和唐納德克努斯都是飛行員。 Linus Torvalds創建了一個內核。唐納德克努特是一位作家。這些人都不是宇航員......

0

這是多對多的關係,所以我會建議一個人的表,技能表和personToSkill表CLASIC。你其他建議的解決方案起初可能是誘人的,但它們都是地獄。