2011-06-28 148 views
1

我有一個應用程序,收集關於學校,團隊和球員的數據。 可以有學校,團隊和球員級別的定製問題。數據庫結構反饋

我已經想出了2個數據庫設計,我只是對每個設計的優缺點感興趣,然後才走下那條路。

設計1

這種設計具有的一切不同的表。數據庫設計看起來很明確,但我希望代碼中會有很多複製來支持3組基本相同的表。

表:

SchoolQuestions (id, questiontext, length, is_required) 
SchoolAnswers(id, school_id, school_question_id, answer) 

TeamQuestions (id, questiontext, length, is_required) 
TeamAnswers(id, team_id, team_question_id, answer) 

PlayerQuestions (id, questiontext, length, is_required) 
PlayerAnswers(id, player_id, player_question_id, answer) 

設計2

這種設計存儲在兩個表的一切。

的Questions.type字段是ENUM('SCHOOL', 'PLAYER', 'TEAM')

在解答表,僅schoold_id,TEAM_ID或player_id之一可以是不爲空。

這似乎是最簡單的解決方案,但確實有冗餘列,所以看起來有點亂

表:

Questions (id, type, questiontext, length, is_required) 
Answers(id, school_id, team_id, player_id, question_id, answer) 

任何反饋表示讚賞,或者如果你有更好的建議改進設計解。

回答

3

設計2絕對更好。

同樣對於該字段type您可能希望創建一個單獨的表,該表將包含3行,並將外鍵添加到此類表的「問題」表中。

你將有很多問題與設計1:

  • 如果你決定延長多一個領域的問題是什麼?將需要更新多個表的模式
  • 如果需要新類型,該怎麼辦?將導致新的表格創作。
  • 您將無法建立單獨的查詢來查詢,而不必一個
  • 您將需要工會表,如果你想找出很多問題怎麼總

[編輯]錯過player_id不同的表,team_id和school_id列。

您可以創建擁有者表,該擁有者類型(學校,團隊,玩家)將引用類型表。這樣你就只能在Answers表中有一個OwnerId列。

0

我個人比較喜歡Design2。 然而,我的意見是要爲QuestionType設置一個單獨的表格,並且在Questions中有一個外鍵來引用問題的特定問題類型。 只是有助於分離出更多一點。其次,我想,我不是數據庫中ENUM排序類型的忠實粉絲。

只是我最初的想法。

祝你好運。

1

我喜歡第二個。

既然您知道該類型,您還可以刪除三個ID列,並用一個通用ID列替換它們。

這樣,您可以在不更改數據庫的情況下爲培訓師或家長添加問題。

編輯:...和其他人建議的一樣,爲類型添加一個表格。

+0

良好的思想,關於三列到1個通用ID – bumperbox

0

絕對設計-2更好。但我認爲你可以從答案表中刪除school_id,team_id,player_id字段,因爲你有question_id。通過question_id,您可以將問題表的答案聯繫起來。那是我的初始想法。請更正,如果我錯了..

+0

我需要涉及的問題的答案,但我也需要知道答案是還有誰。因爲問題與特定學校/團隊/玩家無關 – bumperbox

+0

問題表中的類型字段可以爲您完成工作。如果你有question_id,你可以得到這個問題的類型。所以你的目的是通過這個來實現的。 –

+0

類型字段確定它是否是學校/團隊/玩家,但它不表示哪個學校團隊或玩家回答了問題。 (這個問題可以由100個不同的學校解答,我需要跟蹤每個答案) – bumperbox