суббота, 24 мая 2014 г.

Кто книгу заказал?

Недавно обнаружилась одна особенность в поведении АС-Библиотека-3, при попытке заказа издания. Если пользователь не регистрируется в браузере, то заказ оформляется не на него, а на учетную запись, с которой WWW-Шлюз обращается к базе.
Не критично, но довольно неприятно. Издание блокируется и приходится периодически отменять заказы. В базе появляются мусорные записи, которые непригодны даже для статистики (нет информации о заказчике). Кроме того, если заказчик добросовестный, то процедура выдачи значительно усложняется. Дело в том, что правильно заказанное издание сразу появляется на вкладке "Выдача", модуля "Абонемент". И остаётся лишь нажать кнопку "Выдать издание читателю". В противном случае необходимо вначале отменить заказ с учётной записи доступа к базе, а потом пройти всю процедуру, начиная с поиска. Поэтому этот случай действительно "противный".
Справиться с этой проблемой довольно просто. Нужно создать фиктивную учётную запись пользователя, с которой WWW-Шлюз будет "доступаться" к базе. Причём держать её в "неперерегистрированном" (ужас) состоянии.
Смотрим конкретно. Открываем браузер, находим произвольное издание и заказываем его без регистрации.



Видим, что издание успешно заказано. Чтобы определить на кого, откроем в "Администратор" таблицу All__Delivery.



Поле ReaderID соответствует Администратору. Открываем "Абонемент", ищем Администратора и на вкладке "Выдача" находим заказанное издание.



Настройка шлюза (по умолчанию).



(Для тех, кто интересуется безопасностью напомню, что настройки шлюза хранятся в файле EWww.xml, доступном из Интернет по умолчанию. См. пост "Шлюз" в архиве.)
Теперь, как исправить. Отменим предыдущий заказ. Создадим фиктивного читателя.



Учётные данные произвольны, только даты общей регистрации как можно раньше, чтобы пользователь не попал в статистику. Далее, логин и пароль заносим в настройки WWW-Шлюза.



Пробуем заказать (если прошло немного времени, надо перезапустить веб-сервер, чтобы шлюз перечитал настройки). Получаем ошибку.



Теперь регистрируемся. Всё в порядке.



Смотрим заказ в модуле "Абонемент".



Криво. Но это всё, что можно сделать своими руками.

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



Теперь можно выдать любой свободный экземпляр.
Система заказа мощный инструмент, но, к сожалению, им мало кто пользуется. Согласись, переться через весь город, зная, что книга есть, и экземпляр забронирован тобой, гораздо приятней.
Добавил видео в посты "Транзакции" и "UAC нам в помощь" (см. архив)
Пиши комментарии (регистрация не требуется) или на почту acbib3@yandex.ru

суббота, 17 мая 2014 г.

А что у нас с индексами?


Работать с БД и не затронуть тему индексов невозможно. Однако она настолько обширна, что одним постом её не покрыть. Здесь лишь определимся с терминологией и рассмотрим общее положение дел.
Что мы знаем про индексы? Они ускоряют поиск данных и занимают дополнительное пространство в базе. Если первое видно сразу, то со вторым несколько сложнее.
В  "АС-Библиотека-3", некоторые обычные таблицы (например, Demo_01003 Demo_01003X) также выполняют роль индексов. Будем называть их программными индексами, а обычные - системными. Поскольку программные индексы это обычные таблицы, они, в свою очередь, проиндексированы системными. Так называемые "док" индексы (в терминологии АС-Библиотека-3) содержат данные 090 полей, поэтому это не совсем индексы.
Какова ситуация с индексами в "АС-Библиотека-3"? В случае с SQL, процедура с незатейливым названием sp_spaceused отвечает на этот вопрос:

EXEC sp_spaceused @updateusage = N'TRUE';

Вот скриншот с рабочей базы


Если перевести в проценты, то 33% занимают данные, 66% - индексы и чуть больше 1% свободно. То есть, на каждый байт информации приходится два байта информации о её размещении! Естественно sp_spaceused "замеряет" только системные индексы, так как программные, для неё, это обычные таблицы. Если база небольшая то проблемы нет, а если за гигабайт, то с этим надо что-то  делать.
В случае с базой "Access" подобный запрос мне неизвестен. Однако можно поступить следующим образом. Сжать базу. Сделать копию. И, тупо, поудалять все индексы из копии. Сжать её и сравнить размер с исходным. У меня получилось сокращение на 57%. Результат близкий, хотя не все системные индексы были удалены, а только наиболее "ёмкие". А также удалены все программные (так было проще - с каждым программным индексом удаляется как минимум два системных). Кроме того, очевидно, что в Access и SQL системные индексы организованы по-разному. Если надумаешь поэкспериментировать самостоятельно, вместо Access рекомендую пользоваться менеджером БД вроде DATABASE.NET (http://fishcodelib.com/Database.htm). Кстати он и сжимать умеет.
Почему всё так? Дело в том, что изначально, в АС-3, на всякий случай, проиндексировано ВСЁ! И возиться с индексами ("затачивать") придётся тебе (если ты админ). Так обстоят дела в любой относительно сложной системе на основе СУБД. К сожалению одной "волшебной кнопки" здесь нет. Слишком сильно всё завязано на условия эксплуатации. Хорошая новость в том, что работа с программными индексами в АС-Библиотека-3 организована весьма неплохо. А про системные и говорить нечего. Главное помнить, что индексы это не информация. Это информация о размещении информации. Поэтому они возобновимы после удаления. Создавая и удаляя индексы, мы можем ускорить работу и увеличить размер базы при этом, и наоборот. Главный вопрос состоит в том, какие индексы использует АС-3 в работе, а какие являются балластом.
В SQL базах, система индексирования гораздо более развитая по сравнению с Access и возможностей по анализу и настройке больше.

И в конце. У меня нет никакой информации о том, чтобы кто-то использовал скрипт проверки БД (см. пост выше). Поэтому он не развивается. Всё зависит от твоей активности.

Пиши комментарии (регистрация не требуется) или на почту acbib3@yandex.ru