2011-11-14 3 views
0

データのMySQLの列と検索で複数のデータを記憶する:は、私は、個々の学生のマークをスコアするために使用するMySQLのテーブルを持っている個別

studentID int(11) 
studentname varchar(70) 
maths_score int(11) 
science_score int(11) 
english_score int(11) 

このテーブルは、データベースを維持するアトミックルールに比べに、効率的です。数学 - 科学 - 英語のマークを1つの列に保存することは可能ですか?個別に検索することはできますか?不可能な場合は、どのようにアトミシティルールに準拠するのですか?

+0

あなたはなぜそれらをすべて同じ列に入れたいのか説明できますか? –

+0

2つの余分な列を作成しないようにしてください –

+0

モデルを考え直してはいけません。カラムは、この種のデータストレージにとって最も効率的なメカニズムです。それらをいくつかの 'varchar'ブロブの怪獣に組み合わせることは、本の中のほぼすべての正規化ルールに違反します。ストレージ、比較、検索の点では非効率的です。 – Polynomial

答えて

1

はい、可能です。しかし、あなたのテーブルはファーストノーマルフォームでさえありません。

このカスの原子性ルールに従うには、テーブルを3つの異なるテーブルに分ける必要があります。 1つは学生データを格納するもの、もう1つはコース(英語、科学)を格納するもの、そして他のものは各学生/コースの組み合わせのテストスコアを格納するものです。

0

データベース内の列を1つにエンコードしないと、簡単に検索できなくなります。あなたが使用されているスペースについて心配があれば、tinyintを使うことができます。

+0

真実ですが、検索能力を失うことは、最初の正規形の根本的な違反に比べて軽微な問題です。 – Polynomial

2

常には、このようなデータを別々の列に正規化する必要があります。選択された異なるデータを1つの結合された列に配置することは、リレーショナル・データベース・モデルの標準(要件でない場合)である第1正規形の違反です。

ただし、特定のクエリをより効率的に実行できる追加の列にデータを複製することができます。重複は、非正規化よりも悪いことではありません。たとえば、total_score列を保存して、何らかの加重平均を再計算する必要がなくなりますが、スコアを1つの列に縮小することは悪い考えです。

任意の数のスコアを格納する方法を探している場合は、「科目」の表と「スコア」の表を作成し、各生徒が複数のスコアを持つことができるようにリンクします被験者に関する。

0

複数の属性を1つの列に格納してから個別に取得することはできません。 1 NFに準拠するには、すべての属性を別々の列に格納する必要があります。