Как стать автором
Обновить

Онлайн База Данных, сервис структур данных, динамическая объектно-реляционная проекция (Dynamic ORM)

Время на прочтение9 мин
Количество просмотров2.5K
В данной статье речь пойдет о создании рабочего прототипа онлайд БД. И рассмотрены некоторые сервисы аналоги от компаний Google и Yahoo.

Последним временем более активно стали развиваться сервисы для работы с онлайн БД. Такого рода сервисов в себя включают такие платформы как GData (Google Data API) и Yahoo! Query Language (YQL).

Указанные сервисы онлайн доступа к БД позволяют лучше контролировать и оперировать данными, получаемыми из разных сервисов платформ и самое главное это готовые сервисы для использования которых достаточно изучить документацию и примеры.

Google Base API + Google Data Table API


Сервис онлайн доступа к данным от Google позволяет

— запрашивать, вводить и управлять данными программным способом для создания приложений и мэшапов;
— позволяет просматривать и обновлять содержание электронных таблиц в виде каналов данных Google («GData»);
— клиент может запрашивать список таблиц пользователя, а также представлять, редактировать или удалять содержание в существующей таблице;
— применять автофильтрацию и другие функции таблиц в приложении.

Для удобной работы с выше указанными сервисами Google разработал свой SQL подобный язык запросов Google Visualization API Query Language.

Yahoo! Query Language


Язык запросов для получения данных из информационных массивов Yahoo!.. SQL-подобный язык запросов для работы с web-сервисами от Yahoo!.. Результаты запросов можно получить в XML или JSON форматах.
Вот что говорит Джонатан Тревор, руководитель разработки YQL Execute:
«Разработчики могут теперь вызывать множество сервисов одновременно и оперировать со множеством источников данных, что сделает их приложения более мощными и разнообразными. Получаемые от серверов Yahoo! данные могут быть в реальном времени перекодированы из одного формата в другой».

YQL позволяет легко оперировать данными с помощью SQL подобным синтаксисом. Например вы хотите выбрать фотографии в Париже, Франции, которые имеют Creative Commons Attribution(4) лицензию:

select * from flickr.photos.info where photo_id in (select id from flickr.photos.search where woe_id in (select woeid from geo.places where text='paris,france') and license=4)

таблицы данных можно формировать и хранить используя сервис «Open Table». Сервис довольно интересный, но описания пока очень мало.

image

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

Сервис структур Hivext


Документация API www.hivext.ru/index.php/Структуры

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

Общая характеристика сервиса

  • Сервис и данные доступны на любой платформе и устройстве где поддерживаются HTTP запросы (напрямую к БД можно обращаться также из Javascript, Actionscript и других клиентских языков программирования);
  • Объектно реляционная проекция (ORM) создаваемых объектов в таблицы БД;
  • Сервис и данные доступны на любой платформе и устройстве где поддерживаются HTTP запросы;
  • Нелимитированные объемы баз данных для приложений;
  • Работа с базой данных на уровне типов и объектов, гибкое управление данными через методы сервиса.

Сервис структур предназначен для определения типов и создания экземпляров типов (объектов). Подход к созданию своих объектов достаточно прост и привычен. Для создания коллекции, набора каких либо объектов изначально необходимо определить тип будущих объектов. Определить тип означает определить поля, которые должны содержать будущие объекты. В свою очередь, определение поля типа означает указание имени поля и простой базовый тип данного поля. В сервисе структур имеются заранее определенные простые типы, базируясь на которых разработчики могут создавать свои более сложные типы.
Список простых типов, которые заранее определены в сервисе структур
  • string/String – длина 255 символов (тип по умолчанию)
  • string(N)/String(N) – N любое целое число (от 1 до 10240 символов)
  • text/Text – текстовый тип данных, может содержать максимум 65000 символов.
  • mtext/Mtext — текстовый тип данных, может содержать максимум 16000000 символов.
  • short/Short
  • int/Int/integer/Integer
  • long/Long
  • bool/Bool/boolean/ Boolean
  • float/Float
  • double/Double
  • char/Char
  • byte/Byte
Список определенных типов, возможно, будет в дальнейшем расширен еще дополнительными типами.

На базе вышеуказанных типов разработчики могут создавать свои более сложные типы. Давайте рассмотрим на примере. Допустим, нам необходимо создать книжный интернет магазин. Одним из обязательных объектов нашего приложения будет товар-книга, который мы продаем. Определим тип для наших объектов книг. Для определения типа используется метод DefineType(appid, session, type, fields)

Относительно наших книг вызовем метод со следующими параметрами

DefineType(appid, session, “book”, {price:”float”, name:”string”, description:”string(500)”, author:”string(100)”})

Таким образом, мы определили тип book, у которого есть поля price – цена книги, name – название книги, description – описание книги, author – автор книги.
Далее можем спокойно создавать экземпляры данного типа, т.е. объекты — книги. Для этого используется метод

CreateObject(appid, session, type, data)

Относительно нашего типа book вызываем метод со следующими параметрами

CreateObject(appid, session, “book”, {price:10.5, name:”Разработка веб-приложений”, description:”о проектирование и разработке сложных одностраничных сайтов-приложений”, author:”Всезнайка И.Н.”})

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

CreateObject(appid, session, “book”, {price:8, name:”Разработка десктоп-приложений”, description:”о проектирование и разработке простых десктоп-приложений”, author:”Весточка Е.В.”})

CreateObject(appid, session, “book”, {price:12, name:”Разработка мобильных приложений”, description:”о проектирование и разработке приложений для мобильных телефонов”, author:”Всезнайка И.Н.”})

И так далее. Все довольно просто!

Далее, необходимо выводить пользователям форматированные списки имеющихся в нашем магазине книг. Это делается еще проще. Для выборки множества объектов используются два метода сервиса структур.

GetObjects(appid, session, type, from, count)
GetObjectsByCriteria(appid, session, type, criteria, from, count)


Метод GetObjects предназначен для прямолинейной последовательной выборки объектов. Он возвращает списки объектов, которые выбираются в соответствии с их последовательностью создания. Другими словами выбираются списки объектов сортированные по возрастанию идентификаторов (id). Параметры from и count указывают, с какого индекса взять и сколько, это не обязательные параметры.
Рассмотрим пример. Вызовем метод со следующими параметрами GetObjects(appid, session, “book”)
В результате получим следующий ответ.

{response:0, book:[
{id:1, price:10.5, name:”Разработка веб-приложений”, description:”о проектирование и разработке сложных одностраничных сайтов-приложений”, author:”Всезнайка И.Н.”},
{id:2, price:8, name:”Разработка десктоп-приложений”, description:”о проектирование и разработке простых десктоп-приложений”, author:”Весточка Е.В.”},
{id:3, {price:12, name:”Разработка мобильных приложений”, description:”о проектирование и разработке приложений для мобильных телефонов”, author:”Всезнайка И.Н.”}
]}


Работа метода GetObjects довольно проста и прозрачна.
Рассмотрим работу метода GetObjectsByCriteria. Отличительной особенностью данного метода относительно предыдущего метода является возможность задавать критерии поиска объектов. Данный метод позволяет гибко формировать списки выводимых объектов.
Формировать критерии поиска можно используя два различных синтаксиса. Либо используя SQL подобные команды либо используя JSONQL синтаксис. Вам не надо явно указывать какой синтаксис для формирования критерия вы используете. Метод автоматически определяет, какой синтаксис использует разработчик. Давайте рассмотрим пример одинакового запроса на SQL и JSONQL синтаксисах. К примеру, получим список книг, цена которых меньше 11.
SQL критерий поиска: price < 11

GetObjectsByCriteria(appid, session, “book”, “price < 11”)

JSONQL критерий поиска: {price:{‘<’:11}}

GetObjectsByCriteria(appid, session, “book”, “{price:{‘<’:11}}”)

Получим список книг, авторы которых которых Всезнайка или Незнайка.
SQL критерий поиска: author author like ‘%Всезнайка%’ or author like ‘%Незнайка%’

GetObjectsByCriteria(appid, session, “book”, “author like ‘%Всезнайка%’ or author like ‘%Незнайка%’”)

JSONQL критерий поиска: {author: {like:[‘%Всезнайка%’, ‘%Незнайка%’]}}

GetObjectsByCriteria(appid, session, “book”, {author: {like:[‘%Всезнайка%’, ‘%Незнайка%’]}})

Вы можете использовать как SQL так JSONQL синтаксис. Выбирайте то что вам удобнее. Если с SQL синтаксисом все понятно и привычно, то JSONQL это уникальная разработка, которая изобретена при разработке платформы Hivext. Остановимся немного детальнее на JSONQL. Синтаксис формирования критериев, используя JSONQL очень гибкий и имеет несколько вариаций, которые по своему действию аналогичны. Для более полного понимания синтаксиса таких критериев рассмотри детально принципы формирования этих критериев поиска. Так как сервис структур реализован на основе Hibernate библиотеки, в основу критериев поиска обьектов легли Hibertnate критерии. Давайте реализацию рассмотрим на последнем примере, а именно, получим список книг, авторы которых Всезнайка или Незнайка. В Hibertnate для формирования критерия используется следующий синтаксис
Criterion criterion = Restrictions.or(Restrictions.like(“author”, ” %Всезнайка%”), Restrictions.like(“author”, ” %Незнайка%”));
Трансформируем указанное выражение в JSONQL синтаксис. Операция обьединения по логике OR определяется массивом […,…]. Таким образом

[{like:{author: ‘%Всезнайка%’}},{like:{author: ‘%Незнайка %’}}]

Все довольно просто и прозрачно. Запись практически повторяет Hibernate синтаксис. Давайте рассмотри аналогичные по действию возможные варианты формирования критерия.

{like:[{author: ‘%Всезнайка%’},{author: ‘%Незнайка %’}]}

Еще один вариант

{like: {author: [‘%Всезнайка%’, ‘%Незнайка %’]}}

Как видим последний вариант упрощен по количеству символов и удобочитаем. Однако есть еще один вариант, который, по мнению автора еще более удобочитаем. Просто поменяем местами условие и имя поля

{author:[{like: ‘%Всезнайка%’},{like: ‘%Незнайка %’}]}
{author:[{like:‘%Всезнайка%’},{like: ‘%Незнайка %’}]}
{author:{like: [‘%Всезнайка%’, ‘%Незнайка %’]}}


Последний вариант самый удобочитаемый, однако, все 6 рассмотренных последних вариантов рабочие и выполняют одно и то же действие. Такая свобода в формировании критериев поиска наделяет формирование критерия большой гибкостью. Давайте рассмотрим вариант с операцией AND.
Получим список книг, авторы которых Всезнайка и Незнайка. Hibertnate синтаксис следующий
Criterion criterion = Restrictions.and(Restrictions.like(“author”, ” %Всезнайка%”), Restrictions.like(“author”, ” %Незнайка%”));
В JSONQL операция обьединения AND определяется последовательностью одноуровневых обьектов {…},{…}
Таким образом, получим JSONQL ситаксис:

{author:{like: ‘%Всезнайка%’}}, {author:{like:‘%Незнайка%’}}
{author:{{like: ‘%Всезнайка%’}, {like:‘%Незнайка%’}}}


Имея такой обширный набор возможных вариантов JSONQL, а также возможность запроса, используя стандартный SQL мы получаем очень гибкий метод запроса объектов, используя критерии.
Так же в сервисе структур существуют другие методы для управления типами и объектами.
Все методы сервиса структур можно посмотреть в документации: hivext.ru/index.php/Структуры

Консоль


Для удобной разработки и тестирования методов сервиса, для тестирования критериев запроса имеется консоль разработчика code.hivext.ru/development/APIConsole/#Data.Base

image

В консоли имеется список всех существующих методов сервиса. Консоль можно попробовать в реальной работе при создании своих типов и объектов.

Одним из основных моментов при серверной реализации сервиса структур есть динамический мапинг создаваемых объектов в таблицы БД. При определении типов, при изменении структуры типов на сервер производится автоматическая генерация классов, которые описывают определяемые разработчиком типы. Это позволяет проводить простой мапинг объектов в таблицы, а также проводить взаимное связывание объектов. Все принципы реализации и построения сервиса структур невозможно описать за одну статью. Дополню, что в сервисе имеется также кеширование, транзакции и «ленивая» (lazy) загрузка объектов, и многое другое…

Сервис структур позволят удобно и гибко определить объектно-ориентированную структуру разрабатываемого приложения. Указанный сервис имеет полный набор методов для создания, редактирования, удаления и выборки необходимых типов и экземпляров этих типов (объектов). Также, сервис структур, благодаря используемой ORM, позволяет абстрагироваться от СУБД и удобно работать с объектами. В сочетании с сервисом прав доступа позволяет определить ОО архитектуру приложения и определить четкие права доступа субъектов доступа к объектам.

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

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

Документация по сервису структур hivext.ru/index.php/Структуры
Теги:
Хабы:
+17
Комментарии12

Публикации

Изменить настройки темы

Истории

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн