15の試験マークを保存する必要がある学生追跡プログラムを開発しています。
マークを文字列として保存し、算術演算の実行などの目的で、必要に応じて分割できます。しかし、私はできるだけ多くのパフォーマンスが必要です。
どちらが良いですか?単一の文字列フィールド、または15の個々のintフィールド?
15の試験マークを保存する必要がある学生追跡プログラムを開発しています。
マークを文字列として保存し、算術演算の実行などの目的で、必要に応じて分割できます。しかし、私はできるだけ多くのパフォーマンスが必要です。
どちらが良いですか?単一の文字列フィールド、または15の個々のintフィールド?
回答:
すでに分割と計算について話しているなら、これを配列として保存しないでください。
関係理論や従来の正規化ルールやドグマに関係なく、それはあなたに最小限の柔軟性を与える単なるデザインです。
各試験結果を1行にします。
私はすべてを予想するつもりはありませんが、これはより細かく(そして、はい、正規化されています)非常に多くの事柄があり、ほんの少しだけ多くのスペースの高価な設計が今あなたが必要とするかもしれないし必要としないかもしれません将来は必要ないかもしれません:
最高と最低の結果を捨てますか?配列をスライスしてソートする必要があります。
平均化?あなたはそれをスライスして合計する必要があります
学生全体の試験ごとの試験結果の分析?スライスしてピボットする必要があります
カウントのための並べ替え(または、インスタンスの7つのAsと2Bの場合は、イギリスのGCSE)?スライスしてソートする必要があります
このすべてのスライスと並べ替えは、インデックス付きの正規化されたデザインで非常に安価に提供されます。
スコアに関しては、パフォーマンスの面では、明らかに勝者は次のような数値で格納しています。
create table test_scores
(
student_id int,
test_id int,
score int
);
クエリが簡単で、更新と追加が簡単で、集計を非常に簡単かつ高速に実行できます。「分割する必要がある文字列としてこの情報を保存する」または「列に保存する」の選択肢を考えると、RDBMSのほとんどのユースケースでは、勝者はほとんど常に「列に保存する」ことになります。
char(15)または15 tinyintを使用してtiny int(0〜255)を使用する限り、同じです(サイズに関して)。したがって、パフォーマンスの観点からは、抽出と文字列の処理を省くため、15 tinyintsを使用します。
更新
マークが2桁の場合、CHAR(30)が必要です。これは、tinyintの15倍の2倍のサイズです。