2011-02-28 3 views
1

개체를 가져 와서 저장할 SQL 테이블을 디자인하려고합니다. 개체에는 "Roles"라는 멤버가 있으며이 멤버는 4 개의 값을 갖는 열거 형입니다. 각 객체에는 여러 가지 역할이있을 수 있습니다.Linq to SQL, many to many designs

지금 당장 enum을 가져 와서 이름이 지정된 SQL 테이블을 만들어서 4 가지 역할을 추가했습니다. 이제는 객체 테이블을 디자인하려고하는데 많은 관계를 얻는 방법을 알 수 없습니다. Linq-to-SQL에서도 잘 작동하고 싶습니다. 열거 형을 유지하는 것이 좋겠지 만 문자열이 아닌 경우에도 배열을 사용할 수 있습니다. 요컨대

는 I가있는 테이블이 필요 대다 Object.Roles 역할 및 (또는 Object.Roles [])

감사 사이!

답변

9

일반적으로 Linq2SQL (및 Entity Framework)의 다 대 다 관계는 연결하려는 두 테이블의 기본 키만 사용하여 연결 테이블을 도입하여 만들어지며 각 행은 협회.

RoleObject.Role은 이것을 설명하기 위해 구분하기가 어려울 수 있으므로 다른 예를 들겠습니다. 학교에서 각 교사는 많은 학생을 가질 수 있으며 각 학생은 많은 교사를 가질 수 있습니다. 테이블 구조는 다음

Teachers     Students      StudentTeacherRelations 
********     ********      *********************** 
TeacherId     StudentId     TeacherId 
FirstName     FirstName     StudentId 
etc...      etc... 

지금, Linq2SQL와 EF 둘 다 대다 관계로 인식 할 정도로 똑똑 것 나타내며, 모델의 탐색 속성을 소개합니다. 학생 객체에 적합한 특성을 가진 POCO는 다음과 같이 수 :

public class Student 
{ 
    public int StudentId { get; set; } 
    public string FirstName { get; set; } 
    // etc 
    public IEnumerable<Teacher> Teachers { get; } 
} 

을이 올바르게 설정되어있는 경우, O/R 매퍼가 자동으로 Teachers 속성을 채 웁니다.

업데이트 :

: 의견에 응답, 여기에 내가 각 교사가 질문의 숫자로 구성된 일부 학생들의 숙제를 줄 수있는 시나리오를 포함하기를 원한다면 나는 나머지 데이터베이스의 구조를 거라고 어떻게
HomeworkAssignments   Questions      Answers 
*******************   *********      ******* 
HomeworkAssignmentId (pk) QuestionId (pk)    AnswerId (pk) 
...       HomeworkAssignmentId (fk)  QuestionId (fk) 
          ...       StudentId (fk) 
                  ... 

StudentHomeworkAssignmentRelations TeacherHomeworkAssignmentRelations 
********************************** ********************************** 
StudentId (fk)      Teacherid (fk) 
HomeworkAssignmentId (fk)    HomeworkAssignmentId (fk) 

여기서 알 수 있듯이 상당히 많은 테이블이 있습니다. 그러나이 구조는 각 선생님이 많은 숙제를 작성하게하고 각 과제를 여러 학생에게 넘길 수있게 해줍니다. 학생이 대답해야하는 모든 질문을 찾을 수있는 IEnumerable<HomeworkAssignment> 유형의 탐색 속성 Student.HomeworkAssignments이 있습니다. 게시 된 각 답변에 대해 Answers 테이블에 행을 저장합니다. 행은 일대 다 관계로 질문과 학생과 연결되어 있습니다. 각 답변은 한 질문에만 속할 수 있으며 한 학생 만 제공 할 수 있습니다.

여기에서 중요한 것은 학생이 직접 주어진 각 답변에 액세스 할 필요가 없다는 것입니다. Linq2SQL과 EF에서 다양한 방법으로 한 번에 많은 테이블의 데이터를 요청할 수 있습니다. 그 방법 중 하나는이 코드는 내가 것 말대로 작동하지 않을 수 있습니다 테스트되지 않은 것을

var answersToTheLastExam = context.Students 
        .SelectMany(s => s.HomeworkAssignments) 
        .OrderBy(ha => ha.Date) // this might need modifying to get the last one first 
        .First(ha => ha.Questions.Count() > 0) 
        .SelectMany(ha => ha.Questions) 
        .SelectMany(q => q.Answers) 
        .Where(a => a.StudentId == myId) 

주입니다. 나는 내 머리 꼭대기에서 최선을 다해 노력하고있다. =)

+0

고마워! 후속 질문이 있습니다.이제는 한 걸음 더 나아가서 각 선생님이 각각 25 개의 홈 웍스에 50 개의 '질문'을주고, 이제는 각 학생이 선생님과 m-to-m만이 아니라 각각의 ' HomeWorks'. 그리고 우리는 각 학생들이 각 'HomeWorks'(34/36만이 아니라 질문 당)에 대해 올바른 것을 기록하고 싶다고 말합니다. 이 예제의 경우,'HomeWorks'는 교사 한 명과 '질문'이있는 일대 다 사람과 연관되어 있다고 가정 해 보겠습니다. '홈 웍스 (HomeWorks) ', 교사 (Teachers), 질문 (Question)을 통해 학생을 얻는 가장 좋은 방법은 무엇입니까? –

+0

위의 의견에 대한 자세한 내용. 한 학생에게 3 명의 교사가 있다고 가정 해 보겠습니다. 즉, 한 학생이 그에게 총 3750 개의 '질문'기록을 보유하게됩니다. 이것은 많은 것 같아요,이 상황을 처리하는 더 좋은 방법이 있습니까? –

+1

잘 인덱싱 된 데이터베이스에서 레코드 수는 문제없이 하나의 테이블에서 수천만에 도달 할 수 있으므로 걱정할 필요가 없습니다. (그러나, 수백만 건의 레코드에 접근하기 시작하면 저조도 기간 동안 정기적으로 인덱스를 재구성하는 것을 고려하십시오 ...) 일반적인 숙제 구조에 대해서는 제 편집을보십시오 (지금부터 쓰겠습니다 ...) –