2011-02-24 153 views
0

我不確定完全如何將這個問題說出來,所以我會解釋我在想什麼。我以前有設計數據庫的經驗,但實際上還沒有決定我想如何實現這個或者之前運行過這個。我會解釋我在想什麼作爲一種顯示方式,我已經想到了這一點...數據庫設計:多個相同類型的項目

我創建了一個數據庫,將存儲用戶的信息,像一個簡歷(這是一個副項目爲一羣大學生)。我遇到的問題是如何處理存儲大量技術技能的問題,可能是每個用戶20+以上的順序以及他們的熟練程度

想法一:一個巨大的表格,包含TechSkill1列 - > 20.隨着他們的熟練程度。使用用戶ID作爲FK與所有這些關聯。 優點:最簡單的工具,最簡單的前端。 缺點:限於20個技能,很多潛在的空值,過大的尺寸

想法二:一個大文本輸入的表格,所有技能都在一個文本對象中,用逗號或| |等一些字符分隔。另一個精通專欄也以同樣的方式劃定界限。再次,USERID作爲FK。 優點:易於實現,小桌子大小,易於在前端獲得信息 缺點:浪費大量空白空間的可能性,需要在商店前面進行更多的編碼,然後再進行檢索。

想法三:小桌子的技巧和熟練的專欄。然後創建多個行來關聯每個USERID 優點:最小的表和最乾淨。節省最多的空間 缺點:前端實現將很有趣,因爲在如何處理無限數量的條目的多個領域(不是我的東西,但我不想爲前端傢伙創造太多問題)

這些是我的三個想法,我不完全確定什麼是最好的......我問你們。所有的意見將不勝感激。

謝謝!實現這個數據庫級別

-Jabsy

回答

1

最好的辦法是創建4個表:

  • USERS(你可能有此一)
  • 技能
  • 精通
  • SKILLS_PROFICIENCIES( fk_userid,fk_proficiencyid,fk_skill_id)

這樣你就不會浪費空間,你的架構將更具可擴展性和可維護性。

你解決了前端實現的問題。解決這個問題的最好方法是使用更多的「前端友好」數據視圖來創建數據庫視圖(您使用哪個數據庫引擎?)。將模式非規範化以減輕前端開發並不是一個好主意,主要是因爲數據操作是信息系統中最脆弱的操作。保持架構清潔,並且在擴展和添加新功能時將爲您節省很多麻煩。

+0

所以這個實現我的SQL從我Skill_prof表基於我user_ID的選擇,然後使用從返回映射到我的能力和相應的技能,因爲他們都將在同一個元組? 編輯:另外,我正在使用MYSQL – Jabsy 2011-02-24 08:55:43

+0

您可以使用數據庫加入,並通過1查詢選擇它到數據庫。例如,如果你想具體的用戶和他的技術名稱和熟練的名字,你會用:SELECT users.name,skills.name,prof.name從skill_prof SP內部聯接用戶us.id = fk_userid內部聯接上sp.fk_skill_id =技能技巧.id內部連接熟練prof.id = sp.fk_proficiencyid prof.id其中users.id =您的ID請選擇 – 2011-02-24 09:12:26

+0

非常感謝! – Jabsy 2011-02-24 09:19:59

0

下面是我該怎麼做。

表1:包含列出所有可能技能的單個列。表2:包含三列,一列的用戶ID和第二列的關聯技能。使用複合鍵,第二列僅限於第一個表中的條目。再加上他們的能力水平的第三列(這可能需要引用另一個表,它取決於它只是一個值還是它是一個單詞)。用戶在表格中可能有20個不同的條目。

0

以規範化的方式存儲數據。具有USER_ID主鍵的USER表,具有SKILL_ID主鍵的SKILL表和具有USER_IDSKILL_IDPROFICIENCY列的USER_SKILL表。

我不確定我是否理解這是否是您建議的第三種選擇。如果是這樣,我不太清楚你在前端會遇到什麼問題。據推測,將會有一個用戶添加新技能並輸入熟練程度的界面。這似乎很自然地映射到一個適當規範化的模式。

+0

我認爲我的第三種選擇的意思是有一個table_id,skill,prof和user_id等4列的表。這樣我就可以搜索用戶ID,並一次性獲取所有信息。 – Jabsy 2011-02-24 09:03:14

0

我將創建3個表:

  • USER表與PK USER_ID
  • SKILL表與PK SKILL_ID,列SKILL_DESCRITPION
  • USER_SKILL表具有以下結構:
    • USER_ID,FK參考USER.USER_ID
    • SKILL_ID,FK參考SKILL.SKILL_ID
    • PROFICIENCY

通過這種方式,它可以爲您提供的靈活性,在簡單地插入一個新技能的記錄,包括在未來更多的不同的技術類型SKILL表。

有關如何查詢每個用戶具有哪些技能和熟練度的結果,如果您使用的是oracle,請參閱http://bytes.com/topic/oracle/answers/64603-help-decode-function-crosstab-query。您的問題描述應該與此描述的鏈接相同。

相關問題