2011-06-28 19 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

この設計は、2つのテーブルのすべてを格納します。

Questions.typeフィールドには、回答テーブルでENUM('SCHOOL', 'PLAYER', 'TEAM')

ある、唯一schoold_id、TEAM_ID又はplayer_idのがNULLでないことができます。

これは、最も簡単な解決策のように思えるが、冗長列を持っているので、

テーブル少し厄介そうです:あなたはより良いを持っている場合

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

すべてのフィードバックを感謝、または改良されたデザインを提案しています溶液。

答えて

3

デザイン2は間違いなく優れています。

typeのフィールドでは、3つの行を持つ別個のテーブルを作成し、このタイプテーブルに質問テーブルに外部キーを追加することもできます。

あなたはデザイン1の問題点の多くを持つことになります。

  • 使用すると、1つの以上のフィールドでの質問を延長することを決定した場合はどう?複数のテーブルのスキーマを更新する必要があります
  • 新しいタイプが必要な場合はどうなりますか?新しいテーブルの作成につながります。
  • あなたはどのように多くの質問合計

を知りたい場合は、労働組合のテーブルにする必要があります代わりに、1

  • を持つの異なるテーブルを照会するために別のクエリを構築することができません[EDIT]不在player_id 、team_id列とschool_id列。

    所有者タイプ(学校、チーム、プレーヤー)がタイプテーブルを参照する所有者テーブルを作成できます。このように、AnswersテーブルにはOwnerId列が1つしかありません。

  • 0

    私は個人的にデザイン2を好む。 しかし、私の意見は、QuestionTypeのための別のテーブルを持ち、Questionsの特定の質問タイプを参照するために質問に外部キーを持つことです。 もう少し分けるのに役立ちます。 第二に、私はENUMのデータベースの種類の種類のファンではないと思います。

    私の最初の考え。

    幸運。

    1

    私は第2のものが好きです。

    タイプがわかっているので、3つのID列を削除し、1つの汎用ID列に置き換えることもできます。

    このようにして、データベースを変更せずにトレーナーや保護者に質問を追加できます。

    編集:他にも示唆しているように、タイプの表を追加します。

    +0

    3つの列について1つの一般的なID – bumperbox

    0

    明らかにdesign-2が優れています。しかし、あなたはそこにquestion_idを持っているので、あなたはanswerテーブルからschool_id、team_id、player_idフィールドを削除できると思います。 question_idを使用すると、回答を質問表に関連付けることができます。まあ私の初心者の考えです。私が間違っている場合に修正してください。

    +0

    私は質問への答えを関連付ける必要がありますが、私はまた答えが誰であるかを知る必要もあります。質問が特定の学校/チーム/プレーヤーにリンクされていないので、 – bumperbox

    +0

    質問表のタイプフィールドはあなたのために働くことができます。あなたがquestion_idを持っているなら、その質問のタイプを得ることができます。あなたの目的はこれによって達成されます。 –

    +0

    タイプフィールドは、学校/チーム/プレーヤーかどうかを決定します。どのチームチームまたはプレーヤーがその質問に回答したかは示されません。 (質問は100の異なる学校によって答えることができ、私はそれぞれの回答を追跡する必要があります) – bumperbox

    関連する問題