何を使うべきですか?文字列または15の整数フィールド?


9

15の試験マークを保存する必要がある学生追跡プログラムを開発しています。

マークを文字列として保存し、算術演算の実行などの目的で、必要に応じて分割できます。しかし、私はできるだけ多くのパフォーマンスが必要です。

どちらが良いですか?単一の文字列フィールド、または15の個々のintフィールド?


「15試験のマーク」-単一の試験を複数選択したり、15のテストのスコアを選択したりできますか?
rfusca 2012

15テストのスコア
マイク、

1
データベースの種類(従来のリレーショナルリレーショナルとの関係)およびデータアクセスと使用パターンの要件に関する詳細情報がないと、どのデザインを使用し、どのように実行するかを判断するのは困難です。
Cade Roux

回答:


27

すでに分割と計算について話しているなら、これを配列として保存しないください

関係理論や従来の正規化ルールやドグマに関係なく、それはあなたに最小限の柔軟性を与える単なるデザインです。

各試験結果を1行にします。

私はすべてを予想するつもりはありませんが、これはより細かく(そして、はい、正規化されています)非常に多くの事柄があり、ほんの少しだけ多くのスペースの高価な設計が今あなたが必要とするかもしれないし必要としないかもしれません将来は必要ないかもしれません:

  • 最高と最低の結果を捨てますか?配列をスライスしてソートする必要があります。

  • 平均化?あなたはそれをスライスして合計する必要があります

  • 学生全体の試験ごとの試験結果の分析?スライスしてピボットする必要があります

  • カウントのための並べ替え(または、インスタンスの7つのAsと2Bの場合は、イギリスのGCSE)?スライスしてソートする必要があります

このすべてのスライスと並べ替えは、インデックス付きの正規化されたデザインで非常に安価に提供されます。


4
私が言おうとしていたのはあなたです 1つの文字列に複数の値を格納することは、どのデータベースにとっても最悪の設計上の選択肢の1つです。
HLGEM 2012

+1私の詳細な説明。簡潔すぎて笑いがちです。
rfusca

12

スコアに関しては、パフォーマンスの面では、明らかに勝者は次のような数値で格納しています。

create table test_scores
(
  student_id int,
  test_id int,
  score int
);

クエリが簡単で、更新と追加が簡単で、集計を非常に簡単かつ高速に実行できます。「分割する必要がある文字列としてこの情報を保存する」または「列に保存する」の選択肢を考えると、RDBMSのほとんどのユースケースでは、勝者はほとんど常に「列に保存する」ことになります。


それが常に同じ15の試験のセットである場合、非正規化(15列)の保存の方が処理が速い可能性があります。質問、意図的に整数データ型を提案しましたか?
エドワードドートランド2012

さらに、1人の学生の15試験ごとに、学生IDとテストIDの15倍が追加で保存されます。
エドワードドートランド、

1
ここでフィドル-sqlfiddle.com/#!1/f7343/10
rfusca

6
@EdwardDortlandになるまでは、常に15になります。
ここから

1
@EdwardDortland:計算は問題ありません。今、あなたはあなたが必要とするかもしれないインデックスのためにそれらをすることができますか?
ypercubeᵀᴹ

1

char(15)または15 tinyintを使用してtiny int(0〜255)を使用する限り、同じです(サイズに関して)。したがって、パフォーマンスの観点からは、抽出と文字列の処理を省くため、15 tinyintsを使用します。

更新

マークが2桁の場合、CHAR(30)が必要です。これは、tinyintの15倍の2倍のサイズです。


9
この非常にシンプルな設計を考えると、15の試験(マーク付き)を受講する学生がこのRDBMSでパフォーマンスの問題を引き起こすのに十分な数の組織がこの惑星にある場合、私は今夜眠るように泣きます。
Philᵀᴹ

1
マークが2桁の場合 ただし、小さなintは、カウント方法に応じて、0〜255または-127〜127のスコアをカバーします。そのため、スコアがめったにマイナスにならないため、1つの試験で250以上のポイントが与えられ、ほとんどの試験は0〜100%のスケールで採点されます。ここではtinyintが絶対に役立つと思います。
jcolebrand

はい、同意します。私は、2桁のマークを1桁のマークに置き換えた場合、charとして格納することはさらに悪くなると簡単に述べました。それ以来、char(15)の代わりにchar(30)が必要になります。2桁の場合もそうでない場合も、15の小さな整数は常に15バイトになります。
エドワードドートランド2012

-1この回答は、他の投稿で提案されているように、各試験結果を独自の行に保存するよりもはるかに劣る行あたりのフィールド設計を推奨するため
miracle173
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.