나는 얼마 전에 비슷한 일을해야했고, 다음은 우리가 끝내는 것을 설명합니다.
Item과 UnfinishedItem이라는 두 개의 테이블이 있습니다. 사용자가 마법사를 사용하여 데이터를 입력하면 데이터가 UnfinishedItem 테이블에 저장됩니다. 각 마법사 단계에서 서버는 해당 단계 동안 입력 된 데이터의 유효성을 검사합니다. 사용자가 마법사를 마치면 마법사는 확인 페이지에 숨겨진 / 읽기 전용 양식을 렌더링하여 제출할 모든 데이터를 표시합니다. 사용자는이 페이지를 검토하고 관련 단계로 돌아가 오류를 수정할 수 있습니다. 사용자가 항목에 만족하면 제출을 클릭하면 마법사가 숨겨진 / 읽기 전용 양식 필드의 모든 데이터를 API 서버에 제출합니다. API 서버는이 요청을 처리 할 때 마법사의 각 단계에서 수행 한 모든 유효성 검사를 다시 실행하고 개별 단계에 맞지 않는 추가 유효성 검사 (예 : 전역 유효성 검사, 값 비싼 유효성 검사)를 수행합니다.
두 가지 테이블 접근 방식의 장점 :
데이터베이스에서는 UnfinishedItem 테이블보다 Item 테이블에 더 엄격한 제한 조건을 가질 수 있습니다. 마법사가 완료 될 때 실제로 필요한 선택적 열이 없어도됩니다.
완료되지 않은 항목을 제외하는 것을 기억할 필요가 없으므로 완성 된 항목에 대해보고를위한 집계 쿼리가 더 쉽습니다. 이 경우 Item과 UnfinishedItems간에 집계 쿼리를 수행 할 필요가 없었으므로 문제가되지 않습니다.
단점 :
- 유효성 검사 논리가 복제되기 쉽습니다. 우리가 사용했던 웹 프레임 워크 인 Django는 약간의 메타 마술과 함께 모델 상속을 사용하여 Item과 UnfinishedItem에서 달라야하는 제약 조건을 변경함에 따라 이것을 좀 더 견딜 수있게 만들었습니다. Django는 대부분의 데이터베이스와 양식 유효성 검사를 모델에서 생성하므로 그 위에 몇 가지 추가 유효성 검사 만 해킹하면됩니다.
내가 고려한 다른 가능성과 왜 우리가 그들과 함께 가지 않았습니까?
- 쿠키 또는 로컬 저장소에 데이터 저장 : 사용자는 다른 기기에서 제출을 계속하거나 브라우저 기록을 삭제 한 경우
- UnfinishedItem을 데이터베이스 또는 보조 데이터 저장소에 구조화되지 않은 데이터 (예 : JSON)로 저장합니다. 구문 분석 논리를 정의해야하며 Django의 자동 모델 / 양식 유효성 검사를 사용할 수 없습니다.
- 클라이언트 측에서 단계별 유효성 검사를 수행하십시오 .Python / Django와 JavaScript간에 유효성 검사 논리를 복제해야합니다.