ObjectBox - объектно-ориентированная база данных
ObjectBox был запущен как стартап компанией ObjectBox Ltd., основанной в Мюнхене, Германия, в 2015 году. Создтели Вивиен Доллинджер (Vivien Dollinger) и Маркус Юнгингер (Markus Junginger) стремились создать базу данных, которая была бы идеально адаптирована к потребностям мобильных и IoT-разработчиков.
ObjectBox предоставляет API для языков программирования, таких как Java, Kotlin, Swift, и C++. Также предоставляется веб-инструмент ObjectBox Data Browser для удобного просмотра и управления данными без необходимости написания дополнительного кода.
Преимущества использования ObjectBox с помощью этих инструментов:
- Высокая производительность и малый размер: Особенно важно для мобильных и встраиваемых систем.
- Удобный API и минимальное количество кода: Упрощает работу разработчиков и поддерживает чистоту кода.
- Поддержка реактивных программных паттернов: Упрощает реализацию динамически обновляемых пользовательских интерфейсов.
- Многоплатформенность: Поддерживает разные языки программирования и платформы, что делает его гибким решением для различных типов проектов.
ObjectBox использует собственную разработку базы данных, которая была специально создана для обеспечения высокой производительности на мобильных устройствах и IoT. ObjectBox Storage Engine, так называется этот движок, оптимизирован для быстрой работы с объектами, минимизации задержек и эффективного использования ресурсов.
Основные особенности ObjectBox Storage Engine:
- Object-oriented: Работает напрямую с объектами, что упрощает интеграцию с объектно-ориентированными языками программирования и уменьшает необходимость в ORM (Object-Relational Mapping).
- Indexing: Предоставляет высокооптимизированные индексы для быстрых запросов, которые специально разработаны для мобильных устройств и IoT.
- ACID Transactions: Поддерживает транзакции, соответствующие требованиям ACID, обеспечивая надежность и целостность данных.
- Low Latency: Проектировался с прицелом на минимальные задержки, что критично для приложений, требующих быстрого отклика.
- Data Synchronization: Встроенная поддержка синхронизации данных между устройствами и серверами, что удобно для создания сложных распределенных систем.
-
Object Query Language (OQL): ObjectBox использует собственный Object Query Language, который разработан специально для удобства работы с объектами и их свойствами. Этот язык запросов удовлетворяет потребностям объектно-ориентированных программистов, облегчая запросы к данным на основе их классов и атрибутов.
-
QueryBuilder: Для построения запросов в ObjectBox используется конструктор запросов (QueryBuilder), который позволяет создавать запросы к базе данных с помощью удобного и интуитивно понятного программного интерфейса. Это позволяет программистам формулировать сложные запросы без написания прямого SQL кода.
Повторим Get Started с помощью языка Go. Для этого объявим модели и сгенерируем исходники для работы с бд:
package model
//go:generate go run github.com/objectbox/objectbox-go/cmd/objectbox-gogen
type Task struct {
Id uint64
Title string `objectbox:"index:hash64"`
Text string
DateCreated int64
DateFinished int64
}
А вот так можно выполнить стандартные CRUD запросы:
func main() {
// load objectbox
ob := initObjectBox()
defer ob.Close() // In a server app, you would just keep ob and close on shutdown
box := model.BoxForTask(ob)
// Create
id, _ := box.Put(&model.Task{
Text: "Buy milk",
})
task, _ := box.Get(id) // Read
task.Text += " & some bread"
box.Put(task) // Update
box.Remove(task) // Delete
}
ObjectBox предназначен для использования в сценариях с высокой производительностью для мобильных и IoT-устройств, где часто используется единый физический носитель для хранения данных. Поэтому ObjectBox не предоставляет встроенных инструментов для распределения данных по разным дискам или носителям.
ObjectBox разработана в основном с использованием языка программирования C++, который известен своей высокой производительностью и эффективностью использования ресурсов, а также кроссплатформенностью.
ObjectBox, как современная, высокопроизводительная база данных, предоставляет поддержку индексации для ускорения запросов на чтение. Ниже приведены основные типы индексов, которые поддерживаются в ObjectBox:
Это самый базовый и распространённый тип индексов, который позволяет быстро находить данные на основе значения определённого поля или атрибута объекта. Например, если у вас есть класс Person с полями name и age, вы можете создать индекс по полю name для ускорения поиска по этому полю.
Уникальные индексы гарантируют, что в определённом поле не будет дублирующихся значений. Это полезно, например, для уникальных идентификаторов пользователей или любых других данных, которые должны быть уникальными в пределах таблицы.
Композитные индексы включают в себя несколько полей объекта. Они могут быть полезны, если вы часто выполняете запросы, которые фильтруются по множеству атрибутов. Например, индекс мог бы быть построен на полях firstName и lastName.
Создать индекс, работаю с Go, можно при помощи тегов структур, как это сделано в примере выше:
Title string `objectbox:"index:hash64"`
Процесс начинается с определения запроса с использованием QueryBuilder в ObjectBox
После построения запроса, разработчик может выполнить запрос, который возвращает списки объектов, соответствующих критериям запроса. Запросы могут быть выполнены синхронно или асинхронно, в зависимости от потребностей приложения.
ObjectBox использует оптимизированные индексы для повышения эффективности запросов. Если поля, используемые в запросе, проиндексированы, база данных может быстро найти соответствующие записи без необходимости полного сканирования всех данных. Это критически важно для производительности, особенно на устройствах с ограниченными ресурсами.
При выполнении запроса ObjectBox оптимизирует процесс обработки данных, используя внутренние механизмы кэширования и эффективное управление памятью для минимизации загрузки I/O и использования CPU. Запросы выполняются с учётом текущего состояния индексов и кэша данных, что позволяет достигать максимальной производительности.
Конечные результаты запроса возвращаются в виде коллекций объектов, которые можно непосредственно использовать в приложении. Эти объекты уже готовы к использованию, что ускоряет процесс разработки и повышает надёжность кода.
ObjectBox не предоставляет публично функцию прямого взаимодействия с "планами запросов"
ObjectBox поддерживает транзакции, вот ключевые аспекты их использования:
ObjectBox следует принципам ACID, что гарантирует, что транзакции являются атомарными, консистентными, изолированными и устойчивыми
Транзакции в ObjectBox могут быть как чтения, так и записи:
- Транзакции записи (Write Transactions): Используются для создания, обновления или удаления данных. Транзакции записи блокируются, чтобы гарантировать, что несколько потоков или операций не могут одновременно изменять данные.
- Транзакции чтения (Read Transactions): Предоставляют согласованное представление данных на момент начала транзакции. Обычно они не вызывают блокировок данных и позволяют обеспечить высокую производительность при чтении.
Пример использования транзакции записи на GO:
ob.RunInWriteTx(func() error {
for i := 1000000; i > 0; i-- {
box.Put(&iot.Event{})
}
return nil // return no error so the transaction is not rolled back
})
ObjectBox предлагает различные механизмы для обеспечения устойчивости и восстановления данных. Ниже перечислены некоторые общие стратегии и функции восстановления, которые поддерживает ObjectBox:
ObjectBox гарантирует долговечность данных в соответствии с ACID-свойствами. Это означает, что после завершения транзакции все изменения данных надёжно сохраняются на устройстве. Это базовое свойство долговечности помогает защитить данные даже при внезапных сбоях системы или приложения.
Для управления транзакциями и восстановления после сбоев ObjectBox использует транзакционные журналы. Эти журналы записывают все операции, которые должны быть выполнены или которые были выполнены, что позволяет системе восстанавливаться после сбоя, повторно выполнив необходимые операции для восстановления консистенции базы данных.
Хотя непосредственная информация о встроенных средствах резервного копирования в ObjectBox может быть ограничена, разработчики могут самостоятельно реализовать резервное копирование данных, экспортируя данные из базы данных в файлы или интегрируя с внешними решениями резервного копирования. Некоторые подходы включают периодическое сохранение копий базы данных или её критически важных частей.
ObjectBox использует многоверсионный контроль согласованности, который не только повышает производительность при многопользовательском доступе, но и упрощает процессы восстановления, так как разные версии данных могут сосуществовать параллельно.
ObjectBox Sync позволяет синхронизировать данные между несколькими устройствами или экземплярами базы данных. Это не только облегчает обмен данными и обновления в реальном времени, но и может служить методом непрямого восстановления данных, если локальные данные повреждены или утрачены.
В контексте ObjectBox шардинг как таковой не имеет стандартной реализации в виду специфики этой базы данных - он ориентирован на высокую производительность и минимальные задержки в приложениях, работающих на индивидуальных устройствах, где процесс шардинга может не быть столь актуален, как в больших распределённых системах.
При этом ObjectBox поддерживает работу с несколькими базами данных одновременно, что может использоваться разработчиками для создания некоторой формы логического шардинга.
-
Создание нескольких баз данных: Разработчики могут создавать несколько инстансов баз данных для различных аспектов приложения или разных частей данных. Это позволяет эффективно разделить данные, обеспечивая оптимизацию производительности и управления.
-
Управление несколькими базами данных: Каждый инстанс базы данных управляется отдельно, что позволяет настраивать, оптимизировать и масштабировать каждую базу данных в зависимости от уникальных требований приложения или его компонентов.
-
Синхронизация между базами данных: Если требуется синхронизация между разными базами данных, это может быть реализовано на уровне приложения через логику синхронизации данных или использования API ObjectBox Sync, если нужно синхронизировать данные между устройствами.
ObjectBox не является оптимальным выбором для этих целей из-за его ограничений по назначению и архитектуре. ObjectBox лучше всего подходит для приложений, требующих быстрые, масштабируемые и эффективные операции с данными в ограниченной среде устройства.
ObjectBox предлагает несколько механизмов для защиты данных, которые помогают обеспечить конфиденциальность, целостность и доступность данных, хранящихся в базе. Это включает в себя как шифрование данных на уровне хранения, так и возможности синхронизации данных с учетом безопасности.
ObjectBox поддерживает шифрование базы данных на уровне файла, что позволяет защитить данные, сохраненные на устройстве. Шифрование в ObjectBox осуществляется с помощью библиотеки Themis, которая предоставляет криптографические примитивы для защиты данных.
- Обработка ключей: Key derivation и management используются для генерации и управления ключами шифрования, что обеспечивает дополнительный уровень безопасности.
- Простота включения шифрования: Для активации шифрования разработчикам необходимо просто указать, что база данных должна быть зашифрована, при этом не требуется сложная настройка или обслуживание.
В контексте синхронизации данных между устройствами, ObjectBox предлагает механизмы шифрования трафика. Весь трафик данных шифруется с использованием стандартных криптографических протоколов, таких как TLS.
- Управление доступом: Хотя ObjectBox и предназначен в первую очередь для локального хранения данных, разработчики могут реализовать собственные механизмы контроля доступа на уровне приложения для управления тем, как данные в базе доступны различным пользователям или системам.
- Интеграция с существующими системами авторизации: При использовании ObjectBox Sync можно интегрировать базу данных с системами авторизации, которые контролируют доступ к синхронизации данных, обеспечивая тем самым, что только авторизованные пользователи могут синхронизировать данные.
ObjectBox заботится о конфиденциальности данных, предоставляя разработчикам инструменты для шифрования, что особенно важно в сценариях, где приложения обращаются с чувствительной информацией пользователей.
- Вивьен Доллинджер (Vivien Dollinger): до создания ObjectBox Вивьен работал в области консалтинга и управления продуктами. Он принимал участие в проектах, связанных с разработкой программного обеспечения и управлением продуктами.
- Маркус Юнгингер (Markus Junginger): Маркус имеет опыт в программной инженерии, особенно в разработке на Java и Android. Он также участвовал в создании заметного в прошлом проекта — GreenDAO, что также была ORM библиотека для Android.
Как стартап, ObjectBox изначально разрабатывался небольшой командой, где ключевые роли, такие как разработка кода, тестирование, управление дистрибутивами и поддержка клиентов, вероятно, были сосредоточены в руках основателей и нескольких других разработчиков. С течением времени, по мере роста компании, команда вероятно расширилась.
Как практика показывает, у стартапов, разрабатывающих программное обеспечение, ключевые аспекты управления проектом, включая права на коммит и создание дистрибутивов версий, обычно сосредоточены в руках небольшой группы людей или даже основателей. Это помогает обеспечивать согласованность и качество продукта в ходе его развития.
Хотя ObjectBox и является коммерческим продуктом, компания также вовлекает сообщество разработчиков для улучшения и распространения своих продуктов. Они предлагают документацию, поддержку и инструменты для сообщества разработчиков для работы с их продукцией
В официальном репозитории разработчики предоставили туториал к работе с ObjectBox
Ссылка на официальный сайт с документациям для каждого языка программирования
За актуальной информацией можно следить на официальном сайте или в соц. сетях: About ObjectBox. Также можно мониторить GitHub репозиторий.