masterspammer (masterspammer) wrote,
masterspammer
masterspammer

Обёртка для базы

Это не совсем ORM, это не модное слово framework - а просто библиотека, упрощающая работу с базой данных.

Задача номер один - перенос синтаксиса запросов на уровень синтаксиса языка. Ближайшая аналогия - регулярные выражения; в перле и яваскрипте они являются частью синтаксиса языка, а в php, например, просто строки - аргументы функции. Кроме лишних слэшей во втором случае есть и большее зло - проверка корректности производится на этапе выполнения (в первом - на этапе разбора исходного текста). SQL так же чужероден и ошибка, запрятанная где-то в редковыполняемом участке кода может "сыграть" очень поздно.

Задача два - абстракция от базы данных - переименование столбцов (вы не виноваты, что кто-то назвал корявым словом tipizzaciya колонку таблицы vnytrennijeprermennye) для себя, косметический рефакторинг базы (как будто она __уже__ денормализована, например), переименование операторов и функция в зависимости от пристрастий конкретной СУБД, да и работа вообще без базы - созданный запросик записать в файл и порадоваться.

Задача номер три - реализация более высокоуровневых структур базы - автоматическая связь таблиц там, где она предусмотрена структурой (по факту что такое JOIN можно забыть для большинства запросов), наследование таблиц, расширения функциональности (например, версионность данных в виде отдельного модуля).

Задача номер четыре - ограждение от типичных ошибок, например, от извлечения/изменения/удаления всех записей вместо одной, от SQL injection, от попадания результата "не туда" и от сглаза.

Задача номер пять - синтаксические украшательства и удобства.

Естественно, что не всё реализуется просто, в итоге перед каждой фичей можно поставить слово "частичная" - ну да и так неплохо.

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

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

Параметры запроса - таблицы, поля, константы, выражения; по умолчанию то, что передаётся по ссылке - имя (например, поля), а что напрямую - значение (и берётся в кавычки с экранированием подозрительных символов); выражения - массивы массивов - если где скобку попутал - СРАЗУ ЖЕ синтаксическая ошибка. Из этого всего строится SQL-запрос, с проверкой уже на логические ошибки и с эмуляцией требуемой функциональности (people.passport.addres.street.name - уже матёрый JOIN).

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

При создании кода запроса происходит много проверок и преобразований - и поля переименовываются и таблицы соединяются и выражения трактуются как этой базе надо.

На этапе обдумывания следующий подход - в запрос на выборку попадают пары - что выбрать и куда выбрать (ссылка на переменную). Легко уследить чтобы каждое поле попало туда куда нужно - они стоят рядом. При традиционном подходе требуется или синхронизовать два списка - полей и переменных (а они могут быть длинными) или выбирать переменные из хэша по имени, в котором в свою очередь также можно ошибиться.
Tags: БазыДанных, Интерфейс, Синтаксис
Subscribe

  • Power ON!

    Пять дней прошло - и только сегодня скрутил провода в кучу (фильтры пока лежат на полке) и соединил с усилителем. Динамикам не то, чтоб сильно плохо…

  • Заусенец

    Переклеил, ага, но что-то чуйка не даёт считать дело законченным. Магнит купил, определил и подписал полюса, плюсы и минуса. Парный динамик уже…

  • Про мембраны и магниты

    Переклеенное тело заработало как надо ( UPD. - на самом деле - нет). Теперь у меня будет* пара драйверов, играющих (вот сейчас на АЧХ посмотрел)…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 0 comments