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

    В данной статье речь пойдет о создании рабочего прототипа онлайд БД. И рассмотрены некоторые сервисы аналоги от компаний 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/Структуры
    Поделиться публикацией

    Комментарии 12

      0
      Query… Yahoo! Query Language (YQL).
        +2
        А вообще интересная статья, спасибо.
        А что со стоимостью/производительностью?
          0
          Для каждого сервиса (включая сервис структур) установлены квоты. Все что укладывается в пределах квот — бесплатно для использования. Если по каким то причинам нужно увеличить квоты, то мы можем изменить их по запросу для конкретного идентификатора приложений.

          — Производительность сервиса структур тестировалась на сравнительно небольших массивах данных 10000, 50000, 100000 объектов на один тип данных. Производились тесты на постраничную выборку, постраничную выборку по критериям. Время выборки с учетом проверки идентификатора приложения, сессии пользователя, прав доступа к объектам (а для каждого объекта можно установить уникальные права доступа), и передачи данных по сети до клиента все в сумме составляло то 50 до 100 мс для 100000 разных объектов. Мы сделаем комплексный тест уже с десятками миллионов объектов по сервису структур и покажем результаты.
            0
            Очень интересно, будем ждать результатов. Особенно интресны сложные выборки с условиями, то что обычные постраничные будут хорошо работать я верю.
            У меня пока интерес академический, но возможно и применим для какого-нибудь проетка.
            Спасибо!
        +2
        Можно ли полям присваивать свои (сложные) типы?
          0
          Хороший вопрос.

          Эта возможность почти закончена. Можно использовать оператор точку для доступа к свойствам составных объектов.
          GetProperty(appid, session, «MyComplexType», «propA.propB»);
          или использовать при запросе в критериях
          GetObjectsByCriteria(appid, session, «MyComplexType», «propA.propB = 100», form, count);
            0
            да можно. можно создавать свои простые типы на базе стандартных системных типов, потом создавать типы с полями ранее созданных разработчиком типов. получается ссылочная архитектура. и как сказано выше можно использовать в критериях поиска правила фильтрации по вложенным типам.
              0
              А что используется в качестве значений для таких полей? Айдишники? Поддерживается ли целостность данных на уровне БД (внешние ключи и все такое)?
                +1
                смотря для чего. мы стараемся сделать максимально удобно и интуитивно понятно. к примеру

                DefineType(appid, session, «author», {firstname:«string», lastname:«string»})
                DefineType(appid, session, «book», {price:«float», name:«string», description:«string(500)», author:" author"})

                тут мы создали тип author и тип book который содержит поле автор с ранее определенным типом author

                далее создадим объект author

                CreateObject(appid, session, «author», {firstname:«Yasya», lastname:«Pupkin»}) ---> id = 1

                его ИД = 1

                создадим объект book

                CreateObject(appid, session, «book», {price:10.5, name:«Разработка веб-приложений», description:«о проектирование...», author:1})

                как видно мы ссылаемся на объект типа author с ИД = 1

                а можно и так

                CreateObject(appid, session, «book», {price:10.5, name:«Разработка веб-приложений», description:«о проектирование...», author:"{firstname:«Ivan», lastname:«Petrov»}})

                тогда сперва создастся объект author, а потом создастся объект book c привязкой к только что созданному объекту author

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

            +2
            Для каких целей создавался «Сервис структур Hivext»?
            Какую СУБД для хранения данных использует Ваш сервис?
            На какие объемы данных рассчитываете и как решаются вопросы масштабирования?
            структур позволяет разработчикам создавать свои приложения в стиле ООП, позволяет манипулировать и управлять типами и объектами разрабатываемых приложений

            Судя по API, «сервис структур»…, действительно, всего лишь сервис структур. :) Отличительными признаками ООП являются абстракция, наследование, инкапсуляция и полиморфизм. Т.е., если развитие сервиса планируется именно в направлении ООП, то на данный момент, API покрывает лишь малую часть заявленного функционала.
              +2
              > Для каких целей создавался «Сервис структур Hivext»?
              Хранение, выборка, удаление структурированных данных (с учетом композиции).

              > Какую СУБД для хранения данных использует Ваш сервис?
              MySQL

              > На какие объемы данных рассчитываете и как решаются вопросы масштабирования?
              На достаточно большие, MySQL поддерживает портиции. Разработчикам предоставляется доступ к своей БД. Вопросы масштабирования решаются архитектурно и добавлением серверов. Думаю вам будет достаточно хранить по 100 млн. записей на таблицу? Многим этого за глаза. Понятное дело что все имеет разумные пределы.

              > Судя по API, «сервис структур»…, действительно, всего лишь сервис структур. :)

              Все верно поэтому он и называется Сервис Структур :)

              И для начала не будем мешать все в кучу и отделим понятие ООП (Объектно ориентированное Проектирование) от ООП (Объектно ориентированного Программирования). Это не одно и тоже. Сервис предназначен для объектно ориентированного Проектирования, для закладки объектной структуры в будущее веб — приложение.

              Так как сервис структур работает с базой, то логика программируется на клиенте.

              По поводу абстракции — ее можно использовать с сервисом структур. Абстракция — это упрощенное описание объекта, я могу задать любую структуру, которая опишет объект так как мне нужно.

              Инкапсуляция — это объединение данных и логики (про логику уже сказано выше) и предоставление интерфейса доступа. Интерфейс доступа это методы сервиса структур.

              С наследованием ничего сложного нет, можно создать комплексный (сложный или составной тип данных).
              Можно еще ассоциировать объекты, создавая связи один к одному, один ко многому, многое к одному, многое ко многому.
              +2
              >авторы которых цена которых
              поправьте пожалуйста. В двух местах так написано. пример:
              Получим список книг, авторы которых цена которых Всезнайка и Незнайка. Hibertnate синтаксис следующий

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое