Схема БД в Друпале — структурированный массив, представляющий одну или более таблиц, и их связанные ключи и индексы. Схема определяется хуком hook_schema(), который обычно находится в файлеmodulename.install.
Реализовав hook_schema() и описав в нем таблицы, которые должен создавать модуль, можно легко создавать и удалять эти таблицы во всех поддерживаемых СУБД. Отпадает необходимость работать с разными диалектами SQL для создания или изменения таблиц в поддерживаемых СУБД.
Хук hook_schema() должен вернуть ассоциативный массив, ключи которого соответствуют таблицам, которые определяет модуль.
Определены следующие ключи:
'description': Строка, описывающая эту таблицу и ее назначение. Ссылки на другие таблицы должны быть заключены в фигурные скобки. Например, поле описания таблицы node_revisions выглядит так: ‘Хранит информацию о заголовке и теле каждой {node} поревизионно.’
'fields': Ассоциативный массив ('fieldname' => specification), описывающий столбцы таблицы БД. Спецификация также представляет собой массив. Определены следующие параметры спецификации:
'description': Строка, описывающая это поле и его назначение. Ссылки на другие таблицы должны быть заключены в фигурные скобки. Например, описание поля vid таблицы node может выглядеть так: ‘Всегда содержит самое большое (самое релевантное) значение {node_revisions}.vid для данного nid.’
'type': Общий/базовый тип данных: 'varchar', 'int', 'serial' ’float’, 'numeric', 'text', 'blob' или'datetime'. Большинство типов просто «указывают» на соответствующе типы данных СУБД. Для автоинкрементных полей используется спецификатор 'serial', который расширяется до 'int auto_increment' в MySQL.
'size': Размер данных: 'tiny', 'small', 'medium', 'normal', 'big'. Это своеобразная подсказка по поводу того, какое самое большое значение будет хранить данное поле, определяющая также, какой из типов данных СУБД будет использоваться (например, в MySQL — TINYINT, INT или BIGINT). 'normal', значение по умолчанию, определяет базовый тип (например, INT, VARCHAR, BLOB, и т.д. в MySQL).
Не все размеры доступны для различных типов данных. В описании db_type_map() даны возможные комбинации.
'not null': Если true, значения NULL в данном столбце будут запрещены. По умолчанию значение false.
'default': Значение поля по умолчанию. Здесь нужно обратить внимание на следующее: '', '0' и 0 — различные значения. Если для поля типа 'int' значением по умолчанию было задано '0', это не сработает, поскольку '0' есть строка, содержащая символ 0, а не целое число.
'length': Максимальная длина поля типов 'varchar' или 'text'. Для других типов данных игнорируется.
'unsigned': Булевская переменная, показывающая, является ли один из типов 'int', 'float' или'numeric' знаковым или беззнаковым. По умолчанию false. Для остальных типов данных игнорируется.
'precision', 'scale': Для полей типа 'numeric' показывает точность (число значащих цифр) и масштаб (десятичные цифры после запятой). Оба значения обязательны. Для остальных типов данных игнорируются.
Все параметры, кроме 'type', опциональны, не считая того, что для столбцов типа 'numeric' должны быть указаны значения 'precision' и 'scale'.
'primary key': Массив из одного или более спецификаторов ключевых столбцов (см. ниже), которые формируют первичный ключ.
'unique keys': Ассоциативный массив уникальных ключей ('keyname' => specification). Каждая спецификация есть массив из одного или более спецификаторов ключевых столбцов (см. ниже), которые формируют уникальный ключ таблицы.
'indexes': Ассоциативный массив индексов ('indexame' => specification). Каждая спецификация есть массив из одного или более спецификаторов ключевых столбцов (см. ниже), которые формируют индекс таблицы.
Спецификатор ключевого столбца есть либо строка с именем столбца, либо массив из двух элементов — имени столбца и длины, определяющей префикс данного столбца.
В качестве примера приведем подмножество определения схемы таблицы 'node' CMS Drupal. Имеется четыре поля ('nid', 'vid', 'type' и 'title'), первичный ключ — поле 'nid', уникальный ключ 'vid' - поле'vid', и два индекса - 'nid' (поле 'nid') и 'node_title_type' (поле 'title' и 4 первых байта поля 'type'):