Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #67, ИЮЛЬ 2004 г.

Не MySQL’ом единым!

Никита Кислицин

Xakep, номер #067, стр. 067-094-1

(nikitoz@real.xakep.ru)

Использование нереляционных баз данных в PHP

Они используются повсеместно. В карательных органах, детских садиках, больницах и центрах управления полетами. Они хранят данные. Ценные данные. Хранят, обеспечивают контролируемый доступ, производят сортировку и быстрый поиск. Их роль в современной жизни невозможно переоценить. Они бывают разные. Бывают реляционные, а бывают и нет. Ну что, запрягай уставшие после сессии мозги, поехали! На повестке дня нереляционные базы данных, будем разбираться, что это и с чем жевать.

Базы данных, как, наверное, ясно даже моей шестилетней племяннице, служат для хранения данных. Они представляют информацию наиболее удобным образом с целью обеспечить некоторую структурированность хранимой информации, чтобы по ней удобней было осуществлять поиск необходимых записей. В широком смысле все базы данных можно разделить на две большие группы: реляционные БД, хранящие данные в нескольких таблицах, которые связаны друг с другом через отдельные специальные поля в единую структуру, и нереляционные БД, для работы с которыми не требуется знаний о структурах и внутренних связях информации - поскольку структуры эти, выражаясь поэтически, просты как два байта. PHP поддерживает работу с нереляционными БД через интерфейс DBA (DataBase Abstraction - абстракция базы данных), который сам по себе может работать с несколькими различными форматами - в этом, собственно, и заключается абстракция.

База-недобаза?

Каким же образом нереляционные базы данных хранят информацию? Это делается следующим образом. Каждая запись, сохраняемая в базе, содержит некоторое значение и связанный с ней уникальный ключ, идентификатор, точно указывающий на единственную запись. Таким образом, выражаясь отнюдь не поэтически, такая база задает сюръективную, но не инъективную в общем случае функцию на множестве ключей. Насколько удобно такое представление? Отвечу честно – ни фига это не удобно, кроме того, в ряде случаев это еще и очень медленно в сравнении с реляционными БД (той же mySQL, например). Однако в голову сразу приходит большущий плюс, который ты, наверняка, оценишь - для использования этой БД не нужен специальный хостинг с поддержкой чего-то кроме PHP. Сам понимаешь, нормальных фришных хостингов с поддержкой mySQL или любой другой реляционной БД нет по определению. Поэтому, бедные студенты, которым жалко $50 на нормальный хостинг, слушайте внимательно.

Архитектура

Ты, наверное, уже задался вопросом - если запись в БД может хранить лишь только одно поле с данными, как же быть, если нужно заколбасить в базу несколько разнотиповых величин? Дело в том, что, вопреки ожиданиям, тип поля БД не является массивом символов, поэтому теоретически в каждом таком поле можно хранить произвольные двоичные данные. Также совершенно очевидно, что одна запись может хранить в себе целый массив данных - ведь его можно запросто сериализовать, привести к последовательности байт. Это можно сделать как самостоятельно, создав строку, содержащую все элементы массива, разделенные специальным символом, либо при помощи встроенной функции serialise. Чтобы тебе было проще разобраться со всем этим, я решил как всегда показать все на примере. Мы наколбасим обыкновенную адресную книгу, которая все свои сведения будет хранить в нереляционной базе. Но прежде чем приступать к созданию нашей программы, я бы хотел уделить некоторое внимание самой архитектуре приложения. Задача состоит в том, чтобы позволить пользователю редактировать, удалять и модифицировать имеющиеся записи, а также осуществлять поиск по всей базе данных. Наше приложение не должно зависеть от конкретной реализации БД - как следствие, программа должна использовать интерфейс DBA для доступа к информации. Система также должна обладать известной масштабируемостью - добавление новых полей в БД должно осуществляться как можно проще. Пользовательский интерфейс, само собой, должен быстро адаптироваться к новым требованиям. В нашем учебном примере я не буду выписывать красивые таблички и геморроиться с эффектным оформлением программы - я оставлю все это на твое усмотрение, ты сможешь украсить программу как тебе угодно при помощи CSS. Дополнительной фишкой, которую мы реализуем, будет возможность импортировать данные в формате CSV (comma-separated values), когда несколько полей одной записи разделяются запятой. Это довольно функциональное решение, поскольку большинство СУБД и электронных таблиц умеют экспортировать данные в этом немудреном формате, поэтому не возникнет проблем при переходе от одного продукта к другому. Само собой, выписывать весь этот код на страницах журнала я не буду, поскольку в этом случае статья займет весь "Кодинг". Здесь я приведу лишь выборочные кусочки кода, которые показывают всю подноготную работы с DBA. Поехали.

Содержание  Вперед на стр. 067-094-2
ttfb: 4.0018558502197 ms