2009-04-08 3 views
5

학교에서 C# 응용 프로그램 용 Access DB를 만들고 있습니다. 나는 DB에 대해 많은 경험을 쌓지 못했다. 그래서 바보 같으면 그냥 무시한다. 사용자가 모두을 선택하면 특정 학생이 IT 부서에 갖고있는 수업을들을 수 있기를 바랍니다. 우리는 모두 약 30 명이며, 고등학교 4 년 동안 받아 들일 수있는 최대 인원은 15 명입니다. 현재 DB에는 사용자가 가질 수있는 각 클래스에 대해 15 개의 서로 다른 열이 있습니다. 이 방법을 압축하면 어떻게 하나의 열로 압축 할 수 있습니까?데이터베이스의 여러 열을 제거하는 방법은 무엇입니까?

답변

18

우수 질문 루카스, 이것은 행위로 탐구 : 당신은 년 단위로 수업을 추적하는 경우

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; 

이 우리에게 다음과 같은 결과 집합을 줄 것이다 요컨대 데이터베이스 정규화가 작동하는 방식입니다.

+0

우수한 응답. 주어진 (귀중한, 정확한) 정보를 추가 할 때, 내가 취한 클래스에 관한 추가 데이터를 저장할 수 있다고 덧붙일 것입니다. 당신이 DB를 Org에 사용한다면 그것은 나중에 개선 될 것입니다. 이 디자인은이를 가능하게합니다. 취학반, 과외 교사, 결과 등을 추가 할 수 있습니다. – 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 

한 단어가 액세스 괄호 때를 사용하는 데 필요한입니다 쿼리에 테이블 이상을 참여 시키려면 이러한 쿼리를 조인 할 순서를 지정해야하기 때문입니다. 개인적으로, 나는 디자이너를 사용하지 않고 많은 SQL을 작성하는 데 익숙해 졌을 때 특히 어색했다. Access에서는 디자이너를 사용하여 테이블을 조인 한 다음 생성 된 SQL을 용도에 맞게 수정하는 것이 좋습니다.

4

그래서 열이 15 개 있습니다 (예 : class1, class2, class3 ... class15)?

고전 many-to-many relationship 인 것처럼 보입니다. 학생과 수업을 연관시키는 새로운 표를 만들어야합니다.

student_classes { StudentID, Year, ClassID } 
2

이것은 정규화 문제입니다. 사실상 잘못된 질문을하고 있습니다. 대신에 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) 
... 

2

처럼 뭔가를 고려한다. 당신이 가지고 있어야하는 것은 관련된 테이블입니다. 그런 다음

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

+0

I aqree ... 같은 FK를 가리키는 열이 두 개 이상있는 경우 플래그를 던져 * 및 * 열에 이름 뒤에 숫자가 있습니다. – dotjoe

관련 문제