私は学校でC#アプリケーションで使用するためにAccess DBを作成しています。私はDBの作業に多くの経験がありませんでしたので、これがちょうど無視された場合は無視してください。私はユーザーがすべてを選択できるように、特定の学生がIT部門に持っていたクラスを希望します。私たちは全部で約30人、最高4年間の高校で受けることができる最大人数は15人です。現在、私のDBには、ユーザーが持つことができるクラスごとに15の異なる列があります。これを1列に圧縮するにはどうすればいいですか?データベース内の複数の列を削除するにはどうすればよいですか?
答えて
優秀な質問ルーカス、これは行為掘り下げデータベースの正規化
あなたがクラスを表すために複数の列を持つことがなぜ悪いのかを認識したという事実は、すでに大きな可能性を秘めています。
新しいクラスを追加する場合はどうなりますか?今度は新しい列を追加する必要があります。これには柔軟性がほとんどありません。
何ができるのですか?
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;
これは私たちにこのように、結果セットを与えるだろうデータベースの正規化が簡単に機能する方法です。
学生テーブルのクラス列はありません。学生IDとクラスID列を持つ新しいテーブルを設定します。各行は、学生が取ったクラスを表しています。年/学期、学年などの列を追加することもできます。
あなたはもう少しこれを説明することができ、私は正確に従っていません。 – Kredns
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を目的に合わせて変更することをお勧めします。
15個の列(たとえば、class1、class2、class3 ... class15)がありますか?
古典的なmany-to-many relationshipのように見えます。学生とクラスを関連付ける新しいテーブルを作成する必要があります。
あなたは年々毎にクラスを追跡している場合は、あなたにも関係する年の列を追加することができますstudent { StudentID, StudentName ... }
classes { ClassID, ClassName ... }
student_classes { StudentID, ClassID }
:
student_classes { StudentID, Year, ClassID }
これは、正規化の問題です。実際には間違った質問をしています。代わりに、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) ...
のような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
I aqree ...同じFK *と*を指している複数の列がある場合は、フラグをスローします。その列には名前の後に数字があります。 – dotjoe
- 1. 配列の複数の項目を値で削除するにはどうすればよいですか?
- 2. mongodbデータベースを削除するにはどうすればよいですか?
- 3. セッション内の配列内の項目を削除するにはどうすればよいですか? PHPを
- 4. データセットの列を削除するにはどうすればよいですか?
- 5. データベース内のdatagridviewで選択した行を削除するにはどうすればよいですか?
- 6. Pandasのデータフレームから数列を削除/除外するにはどうすればよいですか?
- 7. データベースから重複を削除するにはどうすればよいですか?
- 8. 配列内のインデックスXにあるアイテムを削除するにはどうすればよいですか?
- 9. salesforceで一度に複数のレコードを削除するにはどうすればよいですか?
- 10. PHPのオブジェクト配列で重複を削除するにはどうすればよいですか?
- 11. データベース内の複数の行から数量を削除する
- 12. phpmyadminの列内の年を削除するにはどうすればよいですか?
- 13. PHP PDOを使用してメモリ内SQLiteデータベースを削除するにはどうすればよいですか?
- 14. マップから複数のキーを削除するにはどうすればよいですか?
- 15. 複数のテーブルからデータを削除するにはどうすればよいですか?
- 16. 複数の末尾のスラッシュを削除するにはどうすればよいですか?
- 17. squerylで複数のエンティティを削除するにはどうすればよいですか?
- 18. 複数の子ノードを再帰的に削除するにはどうすればよいですか?
- 19. 複数のbelongs_toを持つ子レコードを削除するにはどうすればよいですか?
- 20. 配列内の要素を削除するにはどうすればよいですか?
- 21. XML文字列内の要素を削除するにはどうすればよいですか?
- 22. 文字列内のキャレットシンボルを削除するにはどうすればよいですか?
- 23. データベース内の重複レコードの数をカウントするにはどうすればよいですか?
- 24. 複数の行を削除するにはどうすればよいですか?
- 25. CouchDBで複数のドキュメントを削除するにはどうすればいいですか?
- 26. レイアウトのメタタグを削除するにはどうすればよいですか?
- 27. gitのMERGE_MSGを削除するにはどうすればよいですか?
- 28. クライアントサイドのバックボーンモデルを削除するにはどうすればよいですか?
- 29. ページのスクロールバーを削除するにはどうすればよいですか?
- 30. テキストファイルの行を削除するにはどうすればよいですか?
優れた応答。与えられた(貴重な、正しい)情報に加えて、私は、あなたが取ったクラスについての追加データを保存できると付け加えます。あなたがDBを組織に使用している場合、それは後の年に強化されます。この設計は可能です。授業、講師、結果などを追加することができます。 – Karl
礼状に感謝しますが、正直言って私はちょうど15のクラスを通してhoriszontallyをスクロールすることができませんでした。あなたの答えは本当に助けになりました。そして今、私は規範について読むことを始めました。私はあなたのデザインの助けを借りて、私は先生のためのまともなアプリを作ることができると思う(彼女は実際にそれを使用しようとしている)。 – Kredns