2012-06-29 2 views
0

코스 이름이있는 코스가 10,000 개 있다고 가정 해 보겠습니다. 그리고 100,000 명의 사용자가 다양한 코스에 가입합니다. 내 사용자 데이터 모델은 ... 같은MongoDB 모델링 - 비정규 화 된 모델을 사용하여이를 수행하는 방법은 무엇입니까?

course: [ 
{courseName: 'Programming 101', 
cost: 0 
}, 
{courseName: 'How to use stackoverflow', 
cost: 100 
} 
] 

뭔가를 포함하는 것입니다하지만 코스 이름을 변경하고자한다면, 그 이미 그 과정뿐만 아니라 할당 한 사용자 레코드의 수천을 업데이트하라고 요구한다. 가장 좋은 방법은 무엇입니까? 두 개의 테이블을 가진 두 개의 쿼리? 이것은 nosql 환경의 약점입니까, 아니면 그렇게하는 효율적인 방법은 무엇입니까?

답변

2

을 기본적으로 두 가지 옵션이 있습니다 :

  1. 참조 대신 이름 자체의 사용자 레코드에서 코스 ID를 다음 클라이언트 -을

    내가 할 줄 것입니다 측면 가입.
  2. 학생과 함께 전체 과정 이름을 계속 저장하고 필요할 때 해당 필드를 업데이트하십시오.

실제로 시스템을 최적화하려는 대상에 따라 달라집니다. 매 학기마다 12 가지 정도의 코스 이름을 변경하는 경우에만 옵션 2가 문제가되지 않습니다.

또한이 문제는 nosql 시스템의 약점이라는 질문에 대답하기에는 절대로 약점입니다. 이것은 Mongo와 같은 nosql 시스템이 해결하려고하는 모든 유형의 문제가 아닙니다. 몽고는 특정 문제에 대해서는 훌륭하지만 다른 사람들에게는 매우 나쁘다. 나는 코스와 학생들의 데이터베이스를 유지하는 것이 몽고의 강점이 아니라고 말하고 싶다. 이는 프로토 타입 관계형 데이터 모델이므로 고전적인 RDBMS보다 Mongo에서 관리하기가 더 어렵습니다.

+0

당신 말이 맞습니다. 그러나 두 경우 모두 꽤 끔찍합니다. – Cartesius00

1

사실 저는 그 반대입니다. 사용자 이름은 자주 변경되지 않습니다.

사용자가 해당 수업에 참석하여 "이봐 요! 내 이름이 잘못 되었나요? 변경할 수 있습니까?"라고 대답하는 것이 좋습니다. 다른 클래스 이름을 사용하면 사용자가 클래스를 찾을 수 없습니다.

courses: [ 
    { coursename: 'Programming 101', 
    cost: 0, 
    registered: [ 
     {id: 11, name: 'John Doe'}, 
     {id: 12, name: 'Lumber Jack'} 
    ] 
    } 
] 
+0

이것은 위의 모델보다 우수하지만 사용자 이름이 변경되면 밑줄 표시된 질문과 동일한 시나리오가 적용됩니다. – HelloWorld

+0

그럼에도 불구하고 더 나은 결과를 얻을 수 있습니다. 클래스 수는 사용자 수보다 현저히 낮습니다. 데이터를 비정규화할 때 직면하게되는 문제입니다. MongoDB를 사용하면 find-and-update 기능을 사용할 수있다. 배치 스크립트를 실행하여 매번 데이터를 업데이트해야합니다. –

+0

사용자는 많아야 최대 12 개의 클래스에만 등록 할 수 있습니다. 100,000 명의 사용자를 검사하는 것보다 10,000 개의 클래스를 검사하는 편이 좋을 것 같습니다. –

0

10,000 코스, 100,000 명의 사용자는 RDBMS를 사용할 수 있습니다. 100,000 명의 사용자가있는 100,000 명의 대학 (총 100 억 명의 사용자)이 있다면 아마도 noSql이 필요할 것입니다. 그렇다면 playOrm을 사용하면 대학에서 분할 할 수있는 상황에서 매우 쉽게 조인을 수행 할 수 있습니다 (두 테이블 모두) 그리고 "universityA 파티션"과 "universityA 파티션의 사용자"에 대한 참여를 간단하게 수행 할 수 있습니다. 글쎄, 그건 한 가지 방법입니다.