480 Часть 11. Типовые решения
этого поля, чтобы по ошибке не извлечь промежуточные данные сеанса. Иногда это не-
удобство можно устранить с помощью представлений и фильтров, однако применение
представлений связано со своими расходами.
Возможной альтернативой является создание отдельного набора таблиц с промежу-
точными данными. Таким образом, если в базе данных есть таблицы для хранения зака-
зов и пунктов заказов, понадобится добавить еще две таблицы для хранения промежу-
точных состояний заказов и промежуточных состояний пунктов заказов. Промежуточные
данные будут сохраняться в промежуточных таблицах, а их окончательные варианты —
в обычных, "настоящих" таблицах. Это позволит избежать многих неудобств, связанных
с разделением данных, однако потребует реализации в слое отображения дополнитель-
ной логики выбора тех или иных таблиц, что, несомненно, усложнит структуру системы.
Зачастую постоянные данные таблиц подчиняются определенным правилам целост-
ности, которые не распространяются на промежуточные данные. В этом случае вы можете
отключить правила целостности в применении к промежуточным таблицам и активи-
зировать их, если они все-таки понадобятся. К промежуточным данным не применяется
и проверка на логическую правильность. Разумеется, на определенных этапах сеанса мо-
жет понадобиться провести ту или иную проверку на правильность, однако это обычно
определяется в логике серверного объекта.
Промежуточные таблицы должны представлять собой точные копии настоящих таб-
лиц. В этом случае логика отображения будет самой простой. Используйте в промежу-
точных таблицах те же имена полей, что и в настоящих таблицах, а затем снабдите их до-
полнительным полем с идентификаторами сеанса, чтобы легко отбирать данные, при-
надлежащие определенному сеансу.
При сохранении промежуточных данных необходимо реализовать механизм, который
будет удалять записи о брошенных или прерванных сеансах. Используя идентификатор
сеанса, вы можете найти и уничтожить все ненужные данные. Если же пользователь мо-
жет покинуть сеанс без уведомления сервера, понадобится организовать некоторую об-
работку времени ожидания. Для этого можно воспользоваться демоном, который будет
запускаться каждые несколько минут и выполнять проверку наличия устаревших дан-
ных. Подобная схема обработки требует наличия в базе данных специальной таблицы,
которая будет фиксировать время последнего взаимодействия с указанным сеансом.
Реализовать откат обновлений гораздо сложнее. Как выполнить откат сеанса, если
в течение этого сеанса была обновлена существующая запись о заказе? Одно из воз-
можных решений — не допускать отмену подобных сеансов. Все обновления сущест-
вующих данных должны фиксироваться в таблице только в конце выполнения запроса.
Эта схема очень проста и вполне соответствует видению процесса обновления самими
пользователями. Все остальные альтернативы менее удобны, независимо от того, что
вы используете — промежуточные поля или промежуточные таблицы. Для реализации
описанной схемы при наличии промежуточных таблиц все обновляемые данные можно
скопировать в промежуточные таблицы, выполнить в них необходимые изменения и пе-
ренести данные обратно в таблицы с постоянными записями по окончании текущего се-
анса. При использовании промежуточных полей подобные действия возможны только
тогда, когда идентификатор сеанса является частью ключа записи. В этом случае в одной
и той же таблице могут одновременно находиться значения старого и нового идентифи-
каторов, что способно крайне затруднить работу с таблицей.