Модели данных приложения, Классы приложения для работы с СУБД - Многопользовательский проектно-ориентированный планировщик задач

Без установленных модулей приложение предоставляет следующие модели для работы с данными из базы данных:

WorkspacesModel. Предоставляет данные о рабочих пространствах системы, доступных пользователю.

ProjectsModel. Предоставляет данные о проектах в определенном рабочем пространстве.

TasksModel. Предоставляет данные о задачах в определенном проекте.

TagsModel. Предоставляет данные о метках.

StatusesModel. Предоставляет данные о статусах задач.

CommentsModel. Предоставляет данные о комментариях к определенной задаче.

FilesModel. Предоставляет данные о прикрепленных к определенной задаче файлах.

UsersModel. Предоставляет данные об аккаунтах пользователей в рамках заданного рабочего пространства.

Классы приложения для работы с СУБД

Для работы с СУБД в дипломном проекте был предусмотрен специальный набор классов, реализующий логику, связанную с отправкой запросов и получением результатов из базы данных. Это было необходимо для того, чтобы предоставить механизм автоматического обнаружения и устранения ошибок ввода, защиты от взлома, а так же чтобы предоставить удобный интерфейс для работы с СУБД. В классах реализован так называемый принцип "цепочки вызовов" (chaining), то есть при каждом вызове методов объекта возвращается сам объект (если не нужно вернуть какой-то результат работы метода), что позволяет создавать цепочку вызовов, как в приведенном примере. Ниже приведена таблица сравнения кода с использованием прямого обращения к базе и использованием специального класса.

Прямой запрос к базе данных

Интерфейс взаимодействия с базой данных

Mysql_connect('local', 'user', 'pswd');

Mysql_select_db('task_manager');

$res = mysql_query('

SELECT user. name, comment. body, task. name

FROM comment

INNER JOIN user ON user. uid = comment. uid

INNER JOIN task ON task. tid = comment. tid

WHERE task. name = Новая задача

');

$comments = array();

While ($row = mysql_fetch_assoc($res)) {

$comments[] = $row;

}

$s = new Selector();

$comments = $s -> addEntity('comment')

    -> addRelation(new Relation('comment', 'user', true)) -> addRelation(new Relation('comment', 'task', true)) -> addFields(array('user. name', 'comment. body', 'task. name')) -> addFilter(new Filter('task. name', 'Новая задача')) -> execute();

Как можно заметить, в первом случае все действия производятся в процедурном стиле, запрос к базе данных производится прямой передачей строки с запросом специальной функции. Так же необходим отдельный код для построчного извлечения полученных данных. Во втором случае для выборки используется объект класса Selector, конструирование запроса происходит путем последовательного использования функций этого объекта с последующим его выполнением. Связывание таблиц между собой и открытие соединения с СУБД происходят автоматически.

Всего а приложении предусмотрено 6 классов для работы с СУБД: Selector, Inserter, Updater, Deleter, Filter, Relation используемые для выборки, вставки, изменения и удаления строк в таблицах, для фильтрации, установки отношений между таблицами, соответственно. Ниже приведена UML диаграмма этих классов.

Как видно из диаграммы, объект класса Relation может быть частью объекта класса Selector, объект класса Filter может быть частью объекта любого из классов Selector, Updater, Deleter. Далее приведено более подробное описание каждого класса.

Selector

Класс Selector содержит логику, необходимую для выборки данных.

Поля класса Selector:

    - tables : string[] - закрытое поле, массив имен таблиц, из которых необходимо произвести выборку (FROM); - relations : Relation[] - закрытое поле, массив объектов отношений, задающих правила для соединения таблиц (JOIN); - filters : Filter[] - закрытое поле, массив объектов условий выборки, задающих ограничения выборки (WHERE); - fields : string[] - закрытое поле, массив имен полей, которые необходимо вывести (SELECT); - limit : int[2] - закрытое поле, массив параметров ограничения количества выбираемых элементов (LIMIT); - order : string[] - закрытое поле, массив параметров сортировки выборке (ORDER BY).

Методы класса Selector:

+ Selector() - открытый конструктор, инициализирует объект класса;

+ addEntity(e : string) : this - открытый метод, добавляет имя таблицы в массив таблиц, из которых будет производиться выборка;

+ addFields(f : string[]) : this - открытый метод, задает набор атрибутов, которые необходимо вывести;

+ addRelation(r : Relation) : this - открытый метод, добавляет объект отношения к выборке;

+ addFilter(f : Filter) : this - открытый метод, добавляет объект условия выборки;

+ setLimit(from : int, length: int) : this - открытый метод, задает ограничения количества выбираемых строк;

+ addOrderBy(field : string, asc : bool) : this - открытый метод, добавляет критерий сортировки выборки;

+ __toString() : string - метод преобразования объекта в строку, возвращает строку SQL-запроса, выполняемую в СУБД;

+ execute() - открытый метод, выполняет запрос и возвращает результат.

Inserter

Класс Inserter отвечает за создания новых строк в таблицах базы данных.

Поля класса Inserter:

    - values : string[] - закрытое поле, словарь вставляемых значений, где ключом является название поля, значением - задаваемое этому полю значение; - table : string - закрытое поле, имя таблицы, в которую осуществляется добавление.

Методы класса Inserter:

+ Inserter(table : string) - открытый конструктор, инициализирует объект класса;

+ addValue(field : string, value : string) - открытый метод, добавляет новое значение поля

+ __toString() : string - метод преобразования объекта в строку, возвращает строку SQL-запроса, выполняемую в СУБД;

+ execute() - открытый метод, выполняет запрос и возвращает результат.

Updater

Класс Updater отвечает за выполнение запросов, изменяющих значения полей в строках таблиц базы данных.

Поля класса Updater:

    - values : string[] - закрытое поле, словарь задаваемых значений, где ключом является название поля, значением - задаваемое этому полю значение; - table : string - закрытое поле, имя таблицы, в которой изменяются данные. - filters : Filter[] - закрытое поле, массив объектов условий выборки, задающих ограничения для изменяемых строк таблицы;

Методы класса Updater:

+ Updater(table : string, values : string[], filter : Filter) - открытый конструктор, создает новый объект с заданными таблицей, словарем изменяемых значений и одним объектом условий выборки;

+ addValue(field : string, value : string) - открытый метод, добавляет новое значение поля;

+ addFilter(filter : Filter) - открытый метод, добавляет объект условия выборки;

+ __toString() : string - метод преобразования объекта в строку, возвращает строку SQL-запроса, выполняемую в СУБД;

+ execute() - открытый метод, выполняет запрос и возвращает результат.

Deleter

Класс Deleter выполняет удаление строк из таблиц базы данных.

Поля класса Deleter:

    - table : string - filters : Filter[]

Методы класса Deleter:

+ Deleter(table : string, filter : Filter)

+ addFilter(filter : Filter)

+ __toString() : string

+ execute()

Relation

Класс Relation содержит логику, связанную с соединением таблиц между собой.

Поля класса Relation:

    - source : string - закрытое поле, содержит имя таблицы, к которой происходит соединение; - entity : string - закрытое поле, содержит имя присоединяемой таблицы; - type : string - закрытое поле, содержит тип соединения таблиц (внешнее, внутреннее, левое, правое); - scheme : array - закрытое поле, содержит схему таблиц для автоматического определения полей, по которым будет происходить соединение; - reverse : bool - закрытое поле, указывает, соединять ли таблицы по идентификатору исходной или присоединяемой таблицы (в зависимости от направления связи один-ко-многим), направление соединения.

Методы класса Relation:

+ Relation(s : string, e : string, reverse : bool, t : int) - открытый конструктор, задает исходную таблицу, присоединяемую таблицу, направление соединения и тип соединения;

+ source() : string - открытый метод, возвращает имя исходной таблицы;

+ entity() : string - открытый метод, возвращает имя присоединяемой таблицы

+ applyScheme(scheme : array) - открытый метод, задает схему таблиц базы данных;

+ __toString() : string - метод преобразования объекта в строку, возвращает строку с частью запроса, отвечающую за соединение таблиц.

Filter

Класс Filter отвечает за задание условий выборки в запросах.

Поля класса Filter:

- fields : string[] - закрытое поле, словарь, ключом которого является имя поля, значением - массив, содержащий тип сравнения (точное совпадение, подстрока, вхождение в множество, строгие/нестрогие неравенства).

Методы класса Filter:

+ Filter(field : string, value : string, method : int) - открытый конструктор, задает один элемент в словаре значений - имя поля, значение, тип сравнения;

+ addField(params : array) - добавляет новое значение в словарь значений;

+ __toString() : string - метод преобразования объекта в строку, возвращает строку с частью запроса, отвечающую за задание условий выборки.

Каждая модель, создаваемая системой, должна использовать только эти классы для взаимодействия с базой данных, так как в них при выпуске новых версий приложения может концентрироваться логика защиты от взлома и хакерских атак, а так же добавляться новые возможности. Если возникает необходимость добавления недокументированных функций, то есть возможность унаследовать эти классы с целью расширения их функционала.

Похожие статьи




Модели данных приложения, Классы приложения для работы с СУБД - Многопользовательский проектно-ориентированный планировщик задач

Предыдущая | Следующая