Лучшие практики автосохранения черновиков?

Какова наилучшая стратегия для приложений, которые автоматически сохраняют электронное письмо перед его отправкой или сохраняют сообщение в блоге до его завершения или официального сохранения? Будет ли лучше использовать отдельную таблицу в базе данных для временных черновиков или иметь столбец статуса, который помечает сообщение как черновик или как опубликованное? Я не ищу код, просто методы, но любые другие связанные советы также будут приветствоваться, например, как часто сохранять и т. д.


person VirtuosiMedia    schedule 27.03.2009    source источник
comment
Связанный вопрос: Черновая версия таблицы базы данных   -  person Assaf Lavie    schedule 27.03.2009


Ответы (3)


Учитывая, что отдельные таблицы для черновиков и опубликованных статей будут дублировать друг друга, я бы склонялся к одной таблице со столбцом статуса, чтобы различать их.

person Bill the Lizard    schedule 27.03.2009
comment
но что, если черновик недействителен? - person Neil McGuigan; 09.02.2012
comment
@elchief Не знаю, удалить? - person Bill the Lizard; 09.02.2012
comment
Если заказ в основном заполнен, но не является действительной записью из-за ограничения, ваше решение бесполезно. - person Neil McGuigan; 09.02.2012
comment
@elchief Не похоже, что ваша ситуация такая же, как вопрос здесь. Может быть, вам следует задать отдельный вопрос от себя. - person Bill the Lizard; 09.02.2012
comment
как это отличается? он говорит о сохранении черновиков. будь то электронная почта, сообщение в блоге или заказ, не имеет значения. если вы код-ковбой и просто используете свою базу данных в качестве дампа данных, тогда делайте все, что хотите. если вы на самом деле используете проверку и ограничения, то вполне вероятно, что черновик не всегда будет проверяться, и нет смысла хранить его в таблице, в которой он не может быть сохранен. - person Neil McGuigan; 09.02.2012
comment
@elchief Если бы у OP были ограничения на таблицы базы данных, ему не нужно было бы спрашивать. Обычно вы проверяете электронное письмо, когда пользователь нажимает «Отправить», и сообщение в блоге, когда пользователь нажимает «Опубликовать». Проверка не обязательно должна производиться в базе данных, и последствия того, чтобы быть кодовым ковбоем, совершенно разные для разных приложений. Но, очевидно, ваш путь единственно правильный, поэтому я не буду вас переубеждать. - person Bill the Lizard; 09.02.2012

Я делаю черчение по методу Википедии: я сохраняю первую версию, а все модификации сохраняются (в зависимости от времени или явной команды пользователя) в качестве следующей версии. После т.е. публикации можно удалить черновик-график - или нет.

Если вы сохраняете данные в базе данных, я думаю, что хорошо использовать одну и ту же таблицу (вы можете избежать конфликтов схемы) и использовать версию/статус для отслеживания жизненного цикла черновиков.

person boj    schedule 27.03.2009

это относится не только к электронной почте...

Я передумал на этот счет. Лучший способ — использовать столбец is_draft в вашей таблице и хранить как черновики, так и действительные объекты в одной таблице. это имеет то преимущество, что объект сохраняет один и тот же идентификатор, даже если он переключается в состояние черновика и выходит из него (вы можете захотеть отредактировать его после сохранения, но временно удалите требуемое значение). это могло бы сбить пользователей с толку, если бы они совместно работали над одним и тем же документом, а идентификатор постоянно менялся, amirite?

вы должны использовать is_draft=1, чтобы отключить правила проверки ORM, активировать проверки или проверить ограничения, чтобы разрешить сохранение недопустимого объекта. да, вам, вероятно, придется разрешить пустые поля в вашей таблице.

процесс: попытаться сохранить объект. проверка не проходит. установите is_draft=1 и повторите попытку сохранения. это спасает. поставить где-нибудь на экране большой "ЧЕРНОВИК" :)

пользователь заполняет необходимую информацию. попробуйте сохранить объект. проверка проходит. установить is_draft=0. это спасает.

теперь, что касается сообщений электронной почты и блогов, ваш сервер не должен пытаться отправить или опубликовать их сразу, если пользователь не нажмет кнопку «Сохранить/опубликовать», но на самом деле это другая проблема.


СТАРЫЙ ОТВЕТ

Проблема в том, что черновик может быть недействительным и не может быть сохранен в реальной таблице. Например, скажем, ваша таблица требует, чтобы тема не была нулевой, но пользователь еще не заполнил ее.

Одним из способов было бы иметь черновую таблицу и хранить в ней сериализованную версию сущности (и ее дочерних элементов). 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' 

Итак, пользователь начинает составлять электронное письмо, возможно, просто набирает текст и добавляет вложения. ваш графический интерфейс сохраняет электронное письмо в черновики и загружает вложения, сохраняет их в файле draft_file и возвращает идентификатор черновика и URL-адреса загрузки для файлов, которые вы отображаете в своем графическом интерфейсе.

он вводит Тему (Кому по-прежнему пусто). Ваш графический интерфейс сохраняет электронное письмо в черновики, обновляя таблицу черновиков по идентификатору, поскольку он знает свой идентификатор из предыдущего шага.

ваши пользователи заполняют поле «Кому» и нажимают «Отправить». Ваш сервер сохраняет электронное письмо в таблице электронной почты, копирует вложения из файла draft_file в таблицу email_attachment и удаляет черновик, желательно в рамках транзакции.

это позволяет создавать долгосрочные черновики, загружать вложения в стиле Gmail, сохраняя при этом целостность вашей реальной таблицы сущностей.

person Neil McGuigan    schedule 09.02.2012