2009-03-27 2 views
5

전자 메일을 보내기 전에 자동 저장하는 응용 프로그램에 가장 적합한 전략은 무엇입니까? 끝나기 전에 또는 공식적으로 저장하기 전에 블로그 게시물을 저장합니까? 임시 초안을 위해 데이터베이스에 별도의 테이블을 사용하거나 게시물을 초안이나 게시로 표시하는 상태 열을 갖는 것이 가장 좋을까요? 초안에 대해 별도의 테이블과 출판 된 논문은 서로 본질적으로 중복 될 것을 고려 등초안 자동 저장 모범 사례?

+0

관련 질문 : [데이터베이스 테이블의 초안 버전] (http://stackoverflow.com/questions/629873/draft-version-of-database-table) –

답변

2

을 나는 코드, 단지 방법을 찾고 아니지만, 기타 관련 조언을 저장하는 방법 종종처럼, 물론 환영받을 것 , 나는 두 테이블을 구별하기 위해 상태 컬럼이있는 테이블 하나에 기대고있다. 내가 첫 번째 버전을 저장하고, 모든 수정의 다음 버전으로 (시간 또는 명시적인 사용자의 명령에 따라) 저장 :

+0

초안이 유효하지 않은 경우 어떻게해야합니까? –

+0

@elchief 모르겠습니까? 삭제 하시겠습니까? –

+0

제약 조건으로 인해 주문이 대부분 기입되었지만 유효한 레코드가 아닌 경우 귀하의 솔루션은 쓸모가 없습니다 –

2

나는 위키 피 디아 길에 제도 않습니다. 그 후. 간행물을 삭제할 수 있습니다 - 또는하지 않을 수 있습니다. 당신이 데이터베이스에 데이터를 저장하는 경우

는 나는 (당신이 스키마 충돌을 피할 수) 동일한 테이블을 사용하는 것이 좋은 생각, 그리고 초안 라이프 사이클을 추적하기 위해 버전/상태를 사용합니다.

1

이 이메일보다 더 많은 적용 ...

나는이 일에 내 마음을 바 꾸었습니다. 가장 좋은 방법은 테이블에서 is_draft 열을 사용하고 동일한 테이블에 초안과 유효한 엔티티를 모두 저장하는 것입니다. 초안 상태로 전환하는 경우에도 동일한 ID를 유지하는 이점이 있습니다 (저장 한 후에 편집해야하지만 일시적으로 필요한 값을 제거 할 수 있습니다). 동일한 문서에서 공동 작업하고 ID가 계속 변경되면 사용자에게 혼란을 겪을 수 있습니다.

당신은 ORM의 유효성 검사 규칙, 트리거 검증을 끄거나 잘못된 개체를 저장할 수 있도록하는 제약 조건을 확인하려면 1을 is_draft = 사용할 수 있습니다. 예, 테이블에 nullable 필드를 허용해야합니다.

과정 : 개체를 저장하려고합니다. 유효성 검사가 실패합니다. is_draft = 1로 설정하고 다시 저장하십시오. 그것 저장합니다. 화면에 큰 "초안"을 넣으세요 :)

사용자가 필수 정보를 입력합니다. 개체를 저장하려고합니다. 유효성 검사가 통과됩니다. is_draft = 0을 설정하십시오. 그것 저장합니다. 사용자가 저장/후 버튼을 명중하지 않는

지금, 이메일과 블로그 게시물에 대해 서버가 보내거나 바로 게시하려고해서는 안하지만 정말 다른 문제입니다.


문제는 초안이 유효하지 않을 수, 실제 테이블에 저장 될 수 없다는 것입니다

OLD 답변. 예를 들어, 귀하의 테이블에 제목이 null이 아니지만 사용자가 아직 입력하지 않았다고 요구한다고 가정 해보십시오.

한 가지 방법은 초안 테이블을 가지고 있고, 그것을 직렬화 된 엔티티의 버전 (및 자녀)를 저장하는 것입니다. PHP의 serialize()는 사용할 것이거나 json을 사용할 수 있습니다.마침내 유효 할 때, 시스템은 이메일 (또는 무엇이든) 테이블에 대신 저장하고 초안을 삭제합니다 :

의사 SQL :

create table draft 
id int primary key auto increment, 
entity varchar(64) not null comment 'this way you can find all drafts of say type Email', 
contents longblob not null, 
modified timestamp comment 'this way you can sort by newer drafts' 
modified_by int not null foreign key to user.id comment 'this way you can filter by the user\'s drafts' 

당신은 또한 첨부 파일을 저장하는 draft_file 테이블을 고려할 수 또는 초안에 대한 사진들, 그리고 개별적으로 액세스 할 수 있습니다 :

create table draft_file 
id int primary key auto increment, 
draft_id int not null foreign key to draft.id on delete cascade, 
size int not null comment 'bytes', 
mime_type varchar(64) not null, 
file_name varchar(255) not null, 
contents longblob, 
thumbnail blob comment 'this could be an icon for files/documents' 

때문에, 사용자가 본문에 어쩌면 그냥 유형, 이메일을 작성할, 일부 첨부 파일을 추가하기 시작합니다. gui는 이메일을 초안에 저장하고 첨부 파일을 업로드하고 초안 파일에 저장 한 다음 초안 ID와 GUI에 표시되는 파일의 다운로드 URL을 반환합니다.

제목에 제목을 입력합니다 (받는 사람은 여전히 ​​비어 있음). gui는 이메일을 초안에 저장하고 이전 단계의 ID를 알고 있으므로 초안 표를 ID로 업데이트합니다.

사용자가받는 사람 필드를 채우고 보내기를 누르십시오. 서버는 전자 메일 테이블에 전자 메일을 저장하고 첨부 파일을 draft_file에서 email_attachment 테이블로 복사 한 다음 트랜잭션 내에서 초안을 삭제합니다.

실제 엔티티 테이블의 무결성을 유지하면서 장기간 임시 보관, Gmail 스타일 첨부 파일 업로드를 허용합니다.