2011-10-17 1 views
6

수천 명의 사용자가 테스트를 완료 할 수있는 eLearning MultipleChoice 도구를 구축하고 있습니다. 우리는 이미 다른 세미나에 수천 명의 가입자를 보유하고 있으므로 수천 명이 MC 테스트를 완료 할 가능성이 매우 높습니다. 이제 각 사용자가 대답 한 모든 질문, 그가 걸린 시간, 올바른 경우 (시도 횟수), 그렇지 않은 경우, 잘못된 대답 등을 추적해야합니다. 실제로 많은 데이터가 필요합니다.수천 개의 행이있는 웹 사이트의 모든 사용자 (수천)에 대해 SQL 테이블을 만드시겠습니까?

이제 수천 개의 질문과 수천 명의 사용자가 있습니다. 모든 질문에는 적어도 4 개의 답변이 포함되어 있으며 잘못된 대답을 추적하고 싶습니다. 제 질문은 다음과 같습니다.이 특별한 경우 사용자 당 표를 사용하는 것이 맞습니까?

여기 테이블 (예 : here)에 대한 질문이 이미 있지만 다른 케이스 인 것처럼 느껴집니다.

So : 수천 개의 행이있는 수백만 개의 행 또는 수천 개의 테이블이있는 하나의 테이블?

+3

누가 이것을 표시 했나요? OP가 옵션에 대해 묻고 있습니다. 첫 번째 장소에서 OP가 올바르지 않아 질문을 표시하면 위키가되고 Q & A 포럼이 아닙니다. 쳇. – MatBailie

답변

7

사용자 당 데이터베이스 개체를 갖는 것이 결코 바람직하지 않습니다. 테이블과 데이터베이스 구조를 적절히 설계하면 백만 개의 행이있는 테이블을 쉽게 관리 할 수 ​​있습니다.

사용자 당 테이블은 관리하기가 매우 어려우며 일반적으로 관계형 데이터베이스가 일반적으로 설계되는 방식이 아닙니다.

사용자를위한 하나의 테이블을 만들고 RDBMS 모범 사례를 준수하십시오. 쿼리 조정을 구현하고 업데이트 된 통계뿐만 아니라 테이블에 적절한 인덱스가 있는지 확인하십시오.

+3

+1 : 정규화, 기본 및 외래 키, 인덱스 등을 올바르게 사용하면 사용자 당 테이블이 절대로 필요하지 않습니다. 여기에 결과가 있습니다. OO 언어로 사용자 당 새로운 클래스가 필요하십니까? – MatBailie

1

많은 RDMS를 사용하면 분할 된 테이블을 만들 수 있습니다. 나는 그것이 귀하의 경우에 가장 좋은 선택이 될 것이라고 생각합니다 (모든 사용자를위한 하나의 파티션 된 테이블, 사용중인 RDMS에 따라 파티션 키를 지정하는 옵션이 다릅니다)

+0

우리는 MySql을 사용할 계획이므로 우리 서버에서 가능해야합니다. 나는 그 옵션을 살펴볼 것이다. 모든 사람으로부터 확실한 의견을 듣는 것이 좋습니다. 그렇다면 원탁 솔루션으로 갈 것입니다. 감사! – Jonas

4

일반적으로 "사용자 당 테이블" 는 끔찍한 디자인이며 단순한 솔루션은 소유권을 식별 할 수있는 추가 필드가있는 단일 테이블입니다.

자원의 막대한 낭비

table 
id 
user 
... 

을 갖는 반면,

table_1 table_2 table_3 ...... table_999999999 
id  id   id    id 
...  ...  ...   ... 

을 갖는 것은 대표 훨씬 쉽다.

+0

감사합니다. Marc. 그래서 "하나의 주 테이블"에 "사용자"라는 컬럼을 추가하고 거기에 사용자 ID를 넣은 다음 모든 수백만 개의 올바르다 고 잘못 대답 한 질문을 하나의 테이블에 넣으시겠습니까? 나는 아직 초기 계획 단계 (라텍스 - 변환기로 지난주에 시작됨)에 있으므로 매우 유연합니다!) 감사합니다! – Jonas

+0

당신은 UserID, TestID, QuestionID, SubmittedAnswerID, TimeSubmitted, ThinkingTime과 같은 필드를 가진 테이블을 가질 수 있습니다. 그런 다음 모든 사용자 정보가 한 테이블에, 다른 테이블에있는 테스트 정보, 다른 테이블에있는 질문 목록, 다른 테이블에있는 가능한 대답 목록 등으로 이동합니다. 데이터 유형을 모두 분리하면 올바른 방향으로 향하고 있습니다. – MatBailie

+0

안녕하세요. 감사! 질문/답변 표는 질문 용 표, 답변 용 표 (questionID 당 여러 번) 및 잘못된 답변이 실제로 틀린 이유 ("answerid"로 연결됨)를 설명하는 표가 있습니다. 그래서 지금 내가 필요로하는 것은 "사용자"표와 나는 당신의 의견에 훌륭합니다. 또한 모든 질문을 하나의 테이블에 넣거나 각 주제에 대한 테이블을 가지고 있습니까? (각각 약 30 개의 테스트 (각각 30 개의 질문) 및 모두 약 20 개의 주제가 있습니다)? 고맙습니다! – Jonas

0

나는 사용자 당 하나의 테이블을 사용하지 않을 것이고, 그것은 유지하기위한 악몽이 될 것입니다.

사용자 테이블 : 모든 사용자 질문을 포함합니다 : 예를 들어 당신이 그래서, 나는 아마 가능한 한 많은 데이터를 파괴하려고 시도합니다 데이터베이스 설계를 시도한다면

는 모든 질문에 포함

결과는 모든 결과를 사용자 ID, test_id, 시간을 포함

테스트 시험 ID, questionid, 답변, time_to_complete

답변 Answer_id, 대답

그래서이 시나리오에서 결과 테이블은 개요이며, 사용자 ID, 테스트 및 완료 시간이 있습니다. 이것은 전체적인 개요입니다. 다음으로 테스트 테이블이 있습니다. 사용자가 질문별로 질문을 한 전체 테스트이므로 질문의 ID, 사용자가 제출 한 각 답변이있는 테이블에 대한 링크 및 완료 할 시간이 표시됩니다. 답변 테이블은 각각 ​​따라서 데이터의 모습

를 제출 한 사용자에 답이 있습니다

Results 
UserID, TestID, Time 
1   1  00:11 

Test 
TestID QuestionID, answers, time_to_complete 
1  1    1   00:10:00 
1  2    2   00:01:00 

Answers 
answer_id, Answers 
    1   A 
    1   B 
    2   A 
    3   A 
    3   B 
    3   C 
이 방법을 사용하면, 각 사용자에 대한 특정 데이터를 선택 그들이 테스트 등을 촬영 횟수를 볼 수 있도록 할

및 수천 개의 테이블보다 관리가 훨씬 쉬울 것입니다.

+0

안녕하세요 purplegoldfish! 이 상세한 답변을 주셔서 감사합니다. 이것은 좋은 길로 생각됩니다. 한가지 질문 : "test"표에서 UserID를 추가하겠습니까? 여기서 nitpicking 아니지만, 모든 사용자가 모든 테스트를 수행 할 때마다 새 테스트 테이블을 만들 것인지 이해할 수는 없습니다. (테스트 1을 수행하면 테이블이 생성되고 새 테이블을 다시 가져온다면 생성 될 것인가 등) 또는 모든 테스트의 모든 사용자가 모든 결과를 해당 테이블에 추가하는 경우. 명확히 해 주시겠습니까? 감사! – Jonas

+0

테스트 테이블이 아마도 가장 좋은 방법은 아닙니다.하지만 아이디어는 결과 테이블에 사용자 ID가 있고 테스트 테이블이 TestID의 결과 테이블에 연결되어 거기에 사용자 ID가 필요 없다는 것입니다. 테이블에 대해 좀 더 적절한 이름을 알아낼 수도 있지만 아이디어는 테스트 결과 링크, 테스트 링크를 답변으로 나타냅니다. 당신이 미리 정의 된 테스트 또는 임의의 질문을 가지고 있는지 확실하지 않지만, 사용자가 하나의 세션에서 취한 모든 질문을 보여주기 위해 테스트라고 부를 것입니다. – Purplegoldfish

관련 문제