2009-12-20 3 views
0

예제 사례 시나리오 - 하나의 질문과 여러 개의 대답을 확인란에 포함하는 양식이 있으므로 둘 이상을 선택할 수 있습니다.웹 양식의 여러 확인란을 데이터베이스로 업데이트하는 모범 사례

QuestionAnswers 
(
    UserID int, 
    QuestionID int, 
    AnswerID int 
) 

저장 시저를 사용하여 데이터베이스에 그 답을 업데이트하는 가장 좋은 방법은 무엇입니까 : 답변을 저장하기위한 표는 다음과 같다? 다른 직업에서 나는 이전의 모든 대답을 지우고 새 질문을 삽입하는 것에서부터 대답을 제거하고 대답 목록을 건네 주어 저장 프로 시저에 추가하는 것까지 모든 스펙트럼을 보았습니다.

내 현재 프로젝트의 성능 및 확장 성은 매우 중요하므로 무엇을하는 것이 가장 좋은 방법인지 궁금합니다.

감사합니다. Andrey

답변

0

질문이 항상 같은 경우 아무 것도 삭제하지 않으므로 모든 변경된 답변에 대해 업데이트 쿼리를 실행하면됩니다.

Update QuestionAnswers 
SET AnswerID = @AnswerID 
WHERE UserID = @UserID AND QuestionID = @QuestionID 

어떤 이유로 당신은 여전히 ​​일부 삭제/삽입을 할 필요가있는 경우 - 나는 QuestionIDs 이미 (주어진 사용자 ID에 대한) 존재 그래서 당신은/삭제 삽입의 최소 수행하는 검사 것입니다.

업데이트는 삭제, 삽입보다 훨씬 빠르며, ID 열이 급증하지 않습니다.

페이지를 입력 할 때 DB에서 QuestionAnswers를로드한다고 가정하므로 사용자는 지난 번 응답 한 것을 볼 수 있습니다. 이미 필요한 데이터가 있으면 삭제할 항목을 결정하고, 업데이트.

0

Andrey : 질문 1 (questionid = 1)에 대해 사용자 (userid = 1)가 & b (answerid = 2)를 선택하고 나중에 c (a-id = 3)로 전환하면 & d (a-id = 4)이면 확인하고 오래된 것을 삭제하고 새로운 것을 추가해야합니다. 다른 접근 방법을 선택하면 특정 레코드가 있는지 (업데이트 할 수 있도록) 확인하지 않고 오래된 레코드를 삭제하고 새 레코드를 삽입하면됩니다. 어쨌든, 어떤 ID 열을 저장하지 않으므로 후자의 접근 방식을 사용합니다.

1

나는 테이블 디자인의 선택의 여지가, 다음과 같은 진술에 해당하는 경우 :

  • 당신은
  • 각 선택되지 않은 확인하는 간단한/인/최대 선택이 질문 당 계산 알고있다.
  • 각 답변은 일부 척도로 표시되는 것이 아니라 옳고 그른 것으로 분류됩니다.

    QuestionAnswers 
    (
        UserID int, 
        QuestionID int, 
        Choice1 bool, 
        Choice2 bool, 
        ... 
        ChoiceMax bool 
    ) 
    

    네, 정상화의 관점에서 추악한하지만 비정규 구입합니다. (마찬가지로 70 %의 권리)

그런 생각 성능은 내가 대신 당신이 제시 한 다음의 표는 고려 것이다 성능 및 단순화 - 하나의 질문에 대해 하나의 업데이트/삽입. (그리고 먼저 영향을받는 행이 0 인 경우에만 업데이트하고 삽입합니다.)

또한

대답도 더 간단 할 것이다 정확 여부를 검출 - 다음과 같은 테이블 :

QuestionCorrectAnswers 
(
    QuestionID int, 
    Choice1 bool, 
    Choice2 bool, 
    ... 
    ChoiceMax bool 
) 

당신이해야 할 모든이의 같은 조합으로 QuestionCorrectAnswers의 행에 대해 조회하는 단지입니다 사용자가 대답 할 때 선택.

0

간단한 솔루션입니다. 모든 [응답]은 정수 값 (비트)을 가져야하며이 값은 현재 질문에 고유합니다. 는 예를 들어, Question1 및 네 개의 미리 정의 된 답변이 있습니다

[응답] [비트 값]

answer3 0x00004

answer4 0x00008 ANSWER2 0x00002

0x00001

ANSWER1을 ..

SQL INSERT/UPDATE는 다음과 같습니다.

declare @checkedMask int 
set @checkedMask = 0x00009 -- answer 1 and answer 4 are checked 
declare @questionId int 
set @questionId = 1 

- 내가 그 섭정의 대답은 비정규됩니다 동의

insert QuestionResult (AnswerId, QuestionId) 
    select 
     AnswerId, 
     QuestionId 
    from QuestionAnswer a 
     where a.QuestionId = @questionId 
     and (a.mask & @checkedMask) > 0 
     and not exists(select AnswerId from QuestionResult r 
       where r.QuestionId = @questionId and r.AnswerId = a.AnswerId) 
0

를 삽입 -

delete 
--select r.* 
r 
from QuestionResult r 
    inner join QuestionAnswer a 
     on r.QuestionId = a.QuestionId and r.AnswerId = a.AnswerId 
where r.QuestionId = @questionId 
and (a.mask & @checkedMask) = 0 

은 삭제합니다. 각 응답이 다른 열에 종속적이지 않고 키에만 의존하는 한, 세 번째 정규 형식입니다. 고객 이름에 대해 다음 필드가있는 테이블 다르지 않다 : 정말 이름의 "질문"과 복수 응답 사이에는 차이가 없습니다

CustomerName 
(
    name_prefix 
    name_first 
    name_mi 
    name_last 
    name_suffix 
    city 
    state 
    zip 
) 

같은이

QuestionAnswers 
(
    Q1answer1 
    Q1answer2 
    Q1answerN 
) 

로하는 수도 또는 채워지지 않을 수도 있고 양식의 "질문"과 선택 될 수도 있고 선택되지 않을 수도있는 복수 응답을 포함 할 수 있습니다.

0

오래된 스레드를 유감스럽게 생각합니다. 유일하게 현실적인 해결책은 해당 질문에 대한 모든 응답을 삭제하고 확인란이 선택된 새 행을 만드는 것입니다. 업데이트 당 하나의 열만 있으면 업데이트가 효율적일 수 있지만이 방법의 유연성은 선택 사항이 아닙니다. 데이터베이스를 재 설계 할 필요없이 질문에 옵션을 추가 할 수 있어야합니다.

삭제하고 다시 삽입하십시오. 그게 무슨 데이터베이스가 할 수 있도록 설계되었습니다, 저장 및 많은 데이터 행을 검색 할 수 있습니다.

관련 문제