MyWackoSite: NsuTs/Вам запрещён доступDocumentation/devguide/Неконсистентныеданные ...

Home Page | Каталог | Изменения | НовыеКомментарии | Пользователи | Регистрация | Вход:  Пароль:  

Неконсистентные состояния системы

1) Несоответствие объектов в базе и на файловой системе

Объект В базе На файловой системе
Решение submits (id, userid, taskid, filename,…)solution/<filename> solution/<filename>.md5
Архив тестов tasks (tasked)tests/<taskid>/archive.zip tests/<taskid>/archive.zip.md5
Условие тура files_for_tour (fid, tourid, filename, comment)tours/<tourid>.zip/<filename>
Условия задачtasks (tasked, tourid)tasks/<tourid>/<tasked>.<txt>
Детализированный отчет (ошибка компиляции и тд)submits (id)solution/<solution_id>.zip
Текст на печатьprint (filename) solution/<filename>.txt

Скрипт checkUnusedFiles.pl
  1. Разбор xml скрипта с расположением файлов в базе данных и на файловой системе
  2. Составление списка файлов, найденных в базе данных для данного типа, лексическая сортировка и запись в файл $from_db
  3. Составление списка файлов, найденных на сервере, лексическая сортировка и запись в файл $from_fs
  4. С помощью утилиты unix comm чтение файлов $from_db, $from_fs и генерация вывода, состоящего из трёх колонок текста: строки, найденные только в файле $from_db; строки, найденные только в файле $from_fs; и строки, общие для обоих файлов.
  5. Обработка результата, удаление файлов и записей в базе данных по запросу
  6. Печать отчета
2) Внешний ключ указывает на несуществующий объект (удаленный)

Private key Foreign key
olympiad.id forms.olympiadid log.olympid tour.olympid users.current_olympiad userlist.olympiadid olympiad_freeze.olympiadid
tour.tourid files_for_tour.tourid langs_for_tour.tourid news.tourid qna.tourid virtualtours.tourid users.selected_tourid notifications.tourid tasks.tourid timeshift.tourid
users.userid formvalues.userid online.userid print.userid priv.userid submits.userid virtualtours.userid timeshift.userid notifications.userid qna.userid qna.ansid
forms.id formvalues.formid userlist.formid
langs.langid langs_for_tour.langid submits.langid
tasks.taskid submits.taskid
cities.id universities.cityid users.cityid
universities.id users.univerid

Алгоритм устранения
A.id ->
  1. a_id
1) Пробегаем по всем B, смотрим, что существует соответствующий A.id = B.a_id
Если нет, то удаляем строку В или пишем предупреждение.

2) При удалении A.id удаляем все связные строки B

P.S. Удаление данных нужно не всегда, например
— в таблице userlist есть поля с фиксированными formid (1..6), означающие город, универ, название, т.е. поля по умолчанию. их нет в form.id
— не надо удалять пользователя, если у него несуществующая олимпиада или тур
Такие данные игнорируются

Скрипт checkRefIntegrity.pl
Внимание! Использовать такой скрипт надо осторожно!

3) Существование нескольких записей ссылающихся на одну
Использование вместо отношения 1–1 отношения 1-n.
Пример: каждая запись в таблице priv ссылается на пользователя из таблицы users. Однако, в отсутствии внешних ключей в базе данных, может получиться, что несколько записей в таблице привилегий относятся к одному пользователю, что не верно.
Процесс поиска и удаления таких записей можно осуществить, например, при помощи запросов SQL:


4) Кавычки в БД
Например title = “Evgen'evich”, могут возникать проблемы при сохранении дампа
 
Файлы [Скрыть файлы/форму]
Комментариев нет. [Показать комментарии/форму]