2009-04-08 8 views
5

私は学校でC#アプリケーションで使用するためにAccess DBを作成しています。私はDBの作業に多くの経験がありませんでしたので、これがちょうど無視された場合は無視してください。私はユーザーがすべてを選択できるように、特定の学生がIT部門に持っていたクラスを希望します。私たちは全部で約30人、最高4年間の高校で受けることができる最大人数は15人です。現在、私のDBには、ユーザーが持つことができるクラスごとに15の異なる列があります。これを1列に圧縮するにはどうすればいいですか?データベース内の複数の列を削除するにはどうすればよいですか?

答えて

18

優秀な質問ルーカス、これは行為掘り下げデータベースの正規化

あなたがクラスを表すために複数の列を持つことがなぜ悪いのかを認識したという事実は、すでに大きな可能性を秘めています。

新しいクラスを追加する場合はどうなりますか?今度は新しい列を追加する必要があります。これには柔軟性がほとんどありません。

何ができるのですか?

3つのテーブルを作成します。

一つのテーブルは、学生のためである:

Student 
    |-------------------------| 
    | StudentID | Student_Name| 
    |-------------------------| 
    |  1  |  John | 
    |  2  |  Sally | 
    |  3  |  Stan | 
    --------------------------- 

一つのテーブルには、クラスのためにある:

Class 
    ------------------------ 
    | ClassID | Class_Name| 
    ------------------------ 
    | 1  | Math | 
    | 2  | Physics | 
    ------------------------ 

そして最後に、一つのテーブルには、学生とクラス間の関係を保持している:

Student_Class 
    ----------------------- 
    | StudentID | ClassID | 
    ----------------------- 

JohnをPhysicsに登録したい場合は、Student_Classテーブルに行を挿入します。

INSERT INTO Student_Class (StudentID, ClassID) VALUES (1, 2); 

ここで、Student#1(John)がClass#2(Physics)に参加しているという記録があります。 Sallyは数学に出席し、Stanは物理学と数学に参加します。

INSERT INTO Student_Class (StudentID, ClassID) VALUES (2, 1); 
    INSERT INTO Student_Class (StudentID, ClassID) VALUES (3, 1); 
    INSERT INTO Student_Class (StudentID, ClassID) VALUES (3, 2); 

読める形に戻ってそのデータを引き出すために、私たちは一緒に3つのテーブルを結合:

------------------------------ 
    | Student_Name | Class_Name | 
    ------------------------------ 
    | John  | Physics | 
    | Sally  | Math  | 
    | Stan  | Physics | 
    | Stan  | Math  | 
    ------------------------------ 

そしてそれ:

SELECT Student.Student_Name, 
     Class.Class_Name 
    FROM Student, 
     Class, 
     Student_Class 
    WHERE Student.StudentID = Student_Class.StudentID 
     AND Class.ClassID = Student_Class.ClassID; 

これは私たちにこのように、結果セットを与えるだろうデータベースの正規化が簡単に機能する方法です。

+0

優れた応答。与えられた(貴重な、正しい)情報に加えて、私は、あなたが取ったクラスについての追加データを保存できると付け加えます。あなたがDBを組織に使用している場合、それは後の年に強化されます。この設計は可能です。授業、講師、結果などを追加することができます。 – Karl

+0

礼状に感謝しますが、正直言って私はちょうど15のクラスを通してhoriszontallyをスクロールすることができませんでした。あなたの答えは本当に助けになりました。そして今、私は規範について読むことを始めました。私はあなたのデザインの助けを借りて、私は先生のためのまともなアプリを作ることができると思う(彼女は実際にそれを使用しようとしている)。 – Kredns

1

学生テーブルのクラス列はありません。学生IDとクラスID列を持つ新しいテーブルを設定します。各行は、学生が取ったクラスを表しています。年/学期、学年などの列を追加することもできます。

+0

あなたはもう少しこれを説明することができ、私は正確に従っていません。 – Kredns

4

normalizingデータベーススキーマについて考える必要があります。

学生とクラスの間にはmany-to-many relationshipがあり、多くの学生が多くのクラスを受講でき、多くの学生が多くのクラスを受講できるようになっています。このシナリオを処理する最も一般的なアプローチはjunction tableです。次に、あなたのクエリは、テーブルに参加するでしょう。この

Student Table 
------------- 
id 
first_name 
last_name 
dob 

Class Table 
----------- 
id 
class_name 
academic_year 

Student_Class Table 
------------------- 
student_id 
class_id 
year_taken 

よう

何かが、例えば、私が言及だろうアドバイスの

SELECT 
    s.last_name + ', ' + s.first_name AS student_name, 
    c.class_name, 
    sc.year_taken 
FROM 
    student s 
INNER JOIN 
    student_class sc 
ON 
    s.id = sc.student_id 
INNER JOIN 
    class c 
ON 
    sc.class_id = class.id 
ORDER BY 
    s.last_name, sc.year_taken 

1ワードがアクセスするとき、括弧を使用する必要がありますということですあなたがそれらを結合する順序を指定する必要があるので、私はこれが信じています。個人的には、特に私がデザイナーなしでたくさんのSQLを書くのに慣れているとき、私はこれを厄介だと思っています。 Accessでは、デザイナを使用してテーブルを結合し、生成されたSQLを目的に合わせて変更することをお勧めします。

4

15個の列(たとえば、class1、class2、class3 ... class15)がありますか?

古典的なmany-to-many relationshipのように見えます。学生とクラスを関連付ける新しいテーブルを作成する必要があります。

あなたは年々毎にクラスを追跡している場合は、あなたにも関係する年の列を追加することができます
student { StudentID, StudentName ... } 
classes { ClassID, ClassName ... } 
student_classes { StudentID, ClassID } 

student_classes { StudentID, Year, ClassID } 
2

これは、正規化の問題です。実際には間違った質問をしています。代わりに、0以上のclasses_takenをどのように格納できるのかという疑問を尋ねますか?どのような他の詳細は、各クラスについて保存する必要がありますか?例えば。撮影されたクラス、または撮影されたデータ、結果など?例えば

はあなたがデータベーステーブルのクラス1、クラス2、Class3に、CLASS4のなどのような列を持つべきではありません、以下

 
table Student 
id int 
name varchar(25) 
... 

table classes 
id int 
name varchar(25) 
... 

table clases_taken 
student_id int (foreign key to student.id) 
class_id int (foreign key to class.id) 
data_started datatime 
result varchar(5) 
tutor_id int (foreign key to tutor.id) 
... 

2

のようなsomethinを検討してください。あなたが持っているべきものは、関連するテーブルです。人はあなたが一緒にこれらのテーブルを結合取っどのコースを見つけるために次に

Student Table with the following columns 
StudentID 
StudentLastName 
StudentFirstName 
(and so forth for all the data to describe a student) 

Course table with the following columns 
CourseId 
CourseName 

その後

StudentCourse Table with the following columns 
StudentId 
CourseID 
CourseDate 

:あなたのstuctureはようなものになるだろう。以下のような 何か:

Select StudentID,StudentLastName,StudentFirstName, CourseName, CourseDate 
from Student 
join StudentCourse on student. studentid = StudentCourse.StudentID 
join Course on Course.courseID = StudentCourse.CourseID 

は、データベースの基礎を学習を開始するには、このリンクをお読みください: http://www.deeptraining.com/litwin/dbdesign/FundamentalsOfRelationalDatabaseDesign.aspx

+0

I aqree ...同じFK *と*を指している複数の列がある場合は、フラグをスローします。その列には名前の後に数字があります。 – dotjoe

関連する問題