Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Moodle

Оригинал: Moodle
Автор: Tim Hunt
Перевод: А.Панин

13.5. Абстракция для работы с базой данных

Сценарий "Hello world" был достаточно простым, поэтому у меня не было необходимости в получении доступа к базе данных, но несмотря на это, некоторые используемые библиотечные вызовы приложения Moodle осуществляли запросы к базе данных. Ниже я кратко опишу уровень абстракции для работы с базой данных приложения Moodle.

Приложение Moodle использовало библиотеку ADOdb в качестве основы уровня абстракции для доступа к базе данных, но мы столкнулись с трудностями во время ее использования, кроме того дополнительный уровень кода библиотеки оказывал существенное влияние на производительность. Из-за этого в версии 2.0 приложения Moodle мы перешли к использованию нашего собственного уровня абстракции, являющегося тонкой прослойкой между различными библиотеками для работы с базами данных языка PHP.

Класс moodle_database

Сердцем библиотеки является класс moodle_database. Он описывает интерфейс, предоставляемый глобальной переменной $DB, который позволяет осуществлять доступ к соединению к базой данных. Типичный пример использования:
$course = $DB->get_record('course', array('id' => $courseid));
Этот вызов переводится на язык SQL следующим образом:
SELECT * FROM mdl_course WHERE id = $courseid;

и возвращает данные в форме обычного объекта языка PHP с общедоступными полями, поэтому вы можете получать доступ к ним: $course->id, $course->fullname, и.т.д.

Такие простые методы, как этот, используются для простых запросов и простых обновлений и добавлений данных в базу. Иногда необходимо выполнить более сложные SQL-запросы, например, для формирования отчетов. Для этого случая существуют методы выполнения произвольных SQL-запросов:
$courseswithactivitycounts = $DB->get_records_sql(
   'SELECT c.id, ' . $DB->sql_concat('shortname', "' '", 'fullname') . ' AS coursename,
        COUNT(1) AS activitycount
   FROM {course} c
   JOIN {course_modules} cm ON cm.course = c.id
   WHERE c.category = :categoryid
   GROUP BY c.id, c.shortname, c.fullname ORDER BY c.shortname, c.fullname',
   array('categoryid' => $category));
Некоторые аспекты, которые следует учесть в данном случае:
  • Имена таблиц помещены в {}, таким образом библиотека может найти их и подставить имя таблицы в качестве префикса.
  • Библиотека использует специальные символы для добавления значений в SQL-запрос. В некоторых случаях эта функция использует возможности текущего драйвера базы данных. В других случаях осуществляется замена символов и вставка их в SQL-запрос с помощью функций для работы со строками. Библиотека поддерживает как именованные специальные символы, (как показано выше) так и анонимные, обозначаемые с помощью символа ?.
  • Для выполнения запросов всеми поддерживаемыми базами данных должен использоваться только набор безопасных и стандартных SQL-запросов. Например, вы можете увидеть, что я использовал ключевое слово AS для ссылок на столбцы, но не для ссылок на таблицы. Оба эти условия необходимы.
  • Несмотря на это, возможны и такие ситуации, когда не будет доступен набор стандартных SQL-запросов, которые будут выполняться всеми поддерживаемыми базами данных; например, каждая база данных использует свой способ объединения строк. В этих случаях используются функции совместимости для генерации корректных SQL-запросов.

Описание структуры базы данных

Другой областью, в которой системы управления базами данных значительно отличаются, является синтаксис языка SQL для описания таблиц. Для преодоления этой проблемы каждое расширение приложения Moodle (и ядро Moodle) описывает требуемые таблицы базы данных в файле формата XML. Система установки приложения Moodle производит разбор файлов install.xml и использует информацию из них для создания требуемых таблиц и индексов. Существует встроенный в приложение Moodle инструмент разработчика под названием XMLDB, который может помочь в создании и редактировании этих установочных файлов.

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

Одним спорным моментом, обусловленным тем, что приложение Moodle начало свое развитие с использовании версии 3 MySQL, является то, что база данных приложения Moodle не использует внешние ключи. Такое положение вещей приводит к тому, что ошибки остаются не обнаруженными даже с учетом того, что современные базы данных позволяют обнаружить проблему. Сложностью является то, что люди используют приложение Moodle на своих сайтах без внешних ключей в течение многих лет, поэтому почти наверняка в базах присутствуют несвязанные данные. Добавление ключей на данный момент будет невозможным без очень сложной работы по очистке баз данных. Несмотря на это, с момента включения в состав приложения Moodle версии 1.7 системы XMLDB (в 2006 году!) файлы install.xml содержат описания внешних ключей, которые должны присутствовать в базе, и мы все еще надеемся когда-нибудь выполнить всю необходимую работу для того, чтобы добавлять эти ключи в ходе процесса установки.


Далее: Выученные уроки