학교에서 C# 응용 프로그램 용 Access DB를 만들고 있습니다. 나는 DB에 대해 많은 경험을 쌓지 못했다. 그래서 바보 같으면 그냥 무시한다. 사용자가 모두을 선택하면 특정 학생이 IT 부서에 갖고있는 수업을들을 수 있기를 바랍니다. 우리는 모두 약 30 명이며, 고등학교 4 년 동안 받아 들일 수있는 최대 인원은 15 명입니다. 현재 DB에는 사용자가 가질 수있는 각 클래스에 대해 15 개의 서로 다른 열이 있습니다. 이 방법을 압축하면 어떻게 하나의 열로 압축 할 수 있습니까?데이터베이스의 여러 열을 제거하는 방법은 무엇입니까?
답변
우수 질문 루카스, 이것은 행위로 탐구 : 당신은 년 단위로 수업을 추적하는 경우
student { StudentID, StudentName ... }
classes { ClassID, ClassName ... }
student_classes { StudentID, ClassID }
, 당신은뿐만 아니라 관계에 일년에 열을 추가 할 수 있습니다 데이터베이스 정규화
클래스를 나타내는 데 여러 개의 열을 사용하는 것이 왜 큰지는 이미 알고 있다는 사실을 이미 알고 있습니다.
새 수업을 추가하려면 어떻게해야합니까? 이제 완전히 새로운 열을 추가해야합니다. 이것에 대한 융통성은 거의 없습니다.
그래서 무엇을 할 수 있습니까?
세 개의 테이블을 만듭니다.
한 표는 학생들을위한 것입니다 :
Class
------------------------
| ClassID | Class_Name|
------------------------
| 1 | Math |
| 2 | Physics |
------------------------
그리고 마지막으로, 하나 개의 테이블은 학생 및 클래스 사이의 관계 유지 :
Student_Class
-----------------------
| StudentID | ClassID |
-----------------------
을
Student
|-------------------------|
| StudentID | Student_Name|
|-------------------------|
| 1 | John |
| 2 | Sally |
| 3 | Stan |
---------------------------
한 테이블 클래스입니다 John을 Physics에 등록하려면 Student_Class 테이블에 행을 삽입합니다.
INSERT INTO Student_Class (StudentID, ClassID) VALUES (1, 2);
이제 Student # 1 (John)이 Class # 2 (Physics)에 참석 중이라는 기록이 있습니다. Sally가 수학에 참석하도록하고 Stan은 Physics and Math에 참석합니다.
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);
읽을 수있는 방식으로 다시 그 데이터를 가져하려면, 우리는 함께 세 개의 테이블을 조인 :
------------------------------
| 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
한 단어가 액세스 괄호 때를 사용하는 데 필요한입니다 쿼리에 테이블 이상을 참여 시키려면 이러한 쿼리를 조인 할 순서를 지정해야하기 때문입니다. 개인적으로, 나는 디자이너를 사용하지 않고 많은 SQL을 작성하는 데 익숙해 졌을 때 특히 어색했다. Access에서는 디자이너를 사용하여 테이블을 조인 한 다음 생성 된 SQL을 용도에 맞게 수정하는 것이 좋습니다.
그래서 열이 15 개 있습니다 (예 : class1, class2, class3 ... class15)?
고전 many-to-many relationship 인 것처럼 보입니다. 학생과 수업을 연관시키는 새로운 표를 만들어야합니다.
student_classes { StudentID, Year, ClassID }
이것은 정규화 문제입니다. 사실상 잘못된 질문을하고 있습니다. 대신에 0 개 이상의 classes_taken을 어떻게 저장할 수 있는지 질문하십시오. 각 반에 대해 다른 세부 사항을 저장해야합니까? 예 : 취해진 클래스, 또는 취해진 데이터, 결과 등?
예를 들어 당신은 데이터베이스 테이블에 클래스 1, 강좌 2 강좌 3, 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) ...
처럼 뭔가를 고려한다. 당신이 가지고 있어야하는 것은 관련된 테이블입니다. 그런 다음
Course table with the following columns
CourseId
CourseName
그런 다음
StudentCourse Table with the following columns
StudentId
CourseID
CourseDate
지금 그 사람이 당신이 함께 이러한 테이블을 조인했다 어떤 과정을 알아
Student Table with the following columns
StudentID
StudentLastName
StudentFirstName
(and so forth for all the data to describe a student)
: 귀하의 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. 여러 자식 요소의 특성을 제거하는 방법은 무엇입니까?
- 3. Excel에서 여러 열을 비교하는 방법은 무엇입니까?
- 4. MySQL에서 테이블의 여러 열을 검색하는 방법은 무엇입니까?
- 5. 레일 - 데이터베이스의 데이터에서 슬래시 문자를 제거하는 방법은 무엇입니까?
- 6. 데이터베이스의 테이블에서 특정 텍스트의 열을 검색하는 방법
- 7. 나머지 열에 표시해야하는 특정 열을 오른쪽 열에서 제거하는 방법은 무엇입니까?
- 8. beautifulsoup (Python)의 테이블에서 열을 제거하는 방법
- 9. PostgreSQL에서 데이터베이스의 열을 기본값으로 설정하려면
- 10. iTextSharp 테이블에서 열을 제거하는 방법
- 11. 목록보기에서 추가 열을 제거하는 방법
- 12. 창에서보기를 제거하는 방법은 무엇입니까?
- 13. Hadoop을 제거하는 방법은 무엇입니까?
- 14. 루비를 사용하여 반복되는 열을 제거하는 방법 FasterCSV
- 15. 모든 nvarchar 열을 varchar로 변경하는 방법은 무엇입니까?
- 16. 데이터베이스의 여러 테이블
- 17. 데이터베이스의 데이터를 비교하는 방법은 무엇입니까?
- 18. 여러 DataGrid 사이의 간격을 제거하는 방법은 무엇입니까? (flex3)
- 19. 매우 긴 열을 여러 개의 짧은 열로 변환하는 방법은 무엇입니까?
- 20. 여러 열을 사용하여 MySQL 행을 정렬하는 방법은 무엇입니까?
- 21. nhibernate와의 다 대다 관계에 여러 열을 포함시키는 방법은 무엇입니까?
- 22. 열을 단일 테이블로 결합할지 여러 테이블로 분할할지 결정하는 방법은 무엇입니까?
- 23. MySQL 데이터베이스의 TEXT 열을 인덱싱하는 올바른 방법입니까?
- 24. PHP를 사용하여 데이터베이스의 열을 압축 해제하는 방법
- 25. 같은 데이터베이스의 테이블 열을 연결하는 방법
- 26. 인쇄 여러 열을 개별적으로
- 27. 여러 번 열을 매핑하십시오.
- 28. 여러 열을 표시하는 컨트롤
- 29. 애니메이션에서 찢어짐을 제거하는 방법은 무엇입니까?
- 30. 도메인 이름을 제거하는 방법은 무엇입니까?
우수한 응답. 주어진 (귀중한, 정확한) 정보를 추가 할 때, 내가 취한 클래스에 관한 추가 데이터를 저장할 수 있다고 덧붙일 것입니다. 당신이 DB를 Org에 사용한다면 그것은 나중에 개선 될 것입니다. 이 디자인은이를 가능하게합니다. 취학반, 과외 교사, 결과 등을 추가 할 수 있습니다. – Karl
칭찬에 감사하지만 솔직히 나는 15 개 클래스를 통해 horiszontally 스크롤을 참을 수 없었다. 당신의 대답은 정말로 도움이되었습니다. 이제 저는 규범화에 대해 읽었습니다.나는 당신의 디자인 덕분에 선생님을 위해 괜찮은 앱을 만들 수있을 것이라고 생각합니다. (실제로 사용하려고합니다.) – Kredns