Обработка различных структур баз данных часто вносит значительную сложность в архитектуру систем, особенно когда требуется несколько экземпляров баз данных. Эта фрагментация может усложнить операции, увеличить затраты и снизить эффективность. Мультимодельные базы данных, такие как ArangoDB, предоставляют единое решение для решения этих задач. Они упрощают архитектуру и оптимизируют управление данными, поддерживая несколько моделей данных — ключ-значение, документ и граф — в рамках одного экземпляра базы данных.
В отличие от реляционных баз данных, NoSQL базы данных не придерживаются универсального стандарта, такого как SQL. Вместо этого они классифицируются на основе своей структуры хранения. Среди популярных типов:
- Ключ-значение: Похожая на Java
Map
или словарь Python, эта структура извлекает целые значения в виде BLOB с использованием ключа. - Широкий столбец: Похожа на ключ-значение, но разбивает значения на столбцы, предлагая более детализированное извлечение данных.
- Документ: Структурированная как JSON или XML, этот тип предоставляет большую гибкость запросов.
- Граф: Позволяет моделировать и запрашивать сложные отношения, представляя сущности и их связи.
Мультимодельная база данных объединяет эти возможности в одной системе. Например, ArangoDB поддерживает модели ключ-значение, документ и граф, устраняя необходимость в отдельных базах данных.
В этой статье показано, как использовать ArangoDB для изучения моделей ключ-значение и документа в Java-приложениях с использованием Jakarta NoSQL.
Настройка ArangoDB
Для начала работы с ArangoDB Docker предоставляет простой способ управления сторонними службами. Запустив следующую команду, вы сможете легко настроить экземпляр ArangoDB:
docker run -e ARANGO_NO_AUTH=1 -d --name arangodb-instance -p 8529:8529 arangodb/arangodb
Изучение данных ключ-значение
Базы данных ключ-значение идеально подходят для простых моделей данных. Давайте создадим пример приложения для управления данными аэропортов, используя возможности ключ-значение ArangoDB. Сущность Airport
будет включать два поля: code
(ID) и name
.
import jakarta.nosql.Column;
import jakarta.nosql.Entity;
import jakarta.nosql.Id;
import net.datafaker.Faker;
import net.datafaker.providers.base.Aviation;
import java.util.Objects;
public class Airport {
private String code;
private String name;
public String getCode() {
return code;
}
public String getName() {
return name;
}
public boolean equals(Object o) {
if (o == null || getClass() != o.getClass()) {
return false;
}
Airport airport = (Airport) o;
return Objects.equals(code, airport.code);
}
public int hashCode() {
return Objects.hashCode(code);
}
public String toString() {
return "Airport{" +
"code='" + code + '\'' +
", name='" + name + '\'' +
'}';
}
public static Airport of(Faker faker) {
Aviation aviation = faker.aviation();
var airport = new Airport();
airport.code = aviation.airport();
airport.name = aviation.airport();
return airport;
}
}
После определения сущности, вы можете использовать KeyValueTemplate
для взаимодействия с базой данных. В этом руководстве мы рассмотрим больше возможностей Jakarta NoSQL за пределами аннотаций, используя Eclipse JNoSQL; вы можете создать репозиторий, когда Eclipse JNoSQL реализует и поддерживает Jakarta Data.
import jakarta.enterprise.inject.se.SeContainer;
import jakarta.enterprise.inject.se.SeContainerInitializer;
import net.datafaker.Faker;
import org.eclipse.jnosql.mapping.keyvalue.KeyValueTemplate;
public class App {
public static void main(String[] args) {
var faker = new Faker();
try (SeContainer container = SeContainerInitializer.newInstance().initialize()) {
KeyValueTemplate template = container.select(KeyValueTemplate.class).get();
var airport = template.put(Airport.of(faker));
System.out.println(template.get(airport.getCode(), Airport.class));
}
}
}
Эта программа генерирует случайную запись аэропорта, вставляет ее в базу данных и извлекает ее. Если вы работаете локально, вы можете проверить значения в базе данных, используя ваш браузер по адресу:
http://localhost:8529/_db/airport/_admin/aardvark/index.html#collections
Работа с данными документа
Jakarta NoSQL предоставляет обширные возможности для работы с документоориентированными базами данных, включая поддержку наследования и иерархического моделирования данных. Хотя NoSQL-базы данных обычно не поддерживают эти функции, Jakarta NoSQL заполняет этот разрыв с помощью своего API. Давайте использовать Jakarta NoSQL с ArangoDB для управления данными облачного провайдера, включая два специализированных варианта: Amazon Web Services (AWS) и Azure.
Jakarta NoSQL использует аннотации @DiscriminatorColumn
, @DiscriminatorValue
и @Inheritance
для управления наследованием в документоориентированных базах данных.
- Аннотация
@DiscriminatorColumn
указывает поле, используемое для идентификации типа сущности в документе базы данных. - Аннотация
@DiscriminatorValue
определяет конкретное значение для каждого подкласса, гарантируя их правильную идентификацию. - Аннотация
@Inheritance
указывает, что иерархия классов будет отображена в базу данных.
Сначала определим базовый класс для облачных провайдеров:
"type") (
public class CloudProvider {
protected String id;
protected String region;
}
Затем мы представляем специализированные классы облачных провайдеров. Эти примеры показывают, как Jakarta NoSQL использует аннотации @DiscriminatorValue
для различения различных типов документов. Каждая специализация — AWS и Azure — наследует от базового класса CloudProvider
, а также определяет атрибуты, уникальные для каждого провайдера. Кроме того, для целей демонстрации предоставляются фабричные методы (of
) для создания образцовых данных.
AWSCloudProvider
import jakarta.nosql.Column;
import jakarta.nosql.DiscriminatorValue;
import jakarta.nosql.Entity;
import net.datafaker.Faker;
import java.util.UUID;
"AWS") (
public class AWSCloudProvider extends CloudProvider {
private String accountId;
public String getAccountId() {
return accountId;
}
public String toString() {
return "AWSCloudProvider{" +
"accountId='" + accountId + '\'' +
", id='" + id + '\'' +
", region='" + region + '\'' +
'}';
}
public static AWSCloudProvider of(Faker faker) {
var aws = faker.aws();
var cloudProvider = new AWSCloudProvider();
cloudProvider.region = aws.region();
cloudProvider.region = aws.region();
cloudProvider.id = UUID.randomUUID().toString();
cloudProvider.accountId = aws.accountId();
return cloudProvider;
}
}
AzureCloudProvider
package org.soujava.demos.arangodb.document;
import jakarta.nosql.Column;
import jakarta.nosql.DiscriminatorValue;
import jakarta.nosql.Entity;
import net.datafaker.Faker;
import java.util.UUID;
"AZURE") (
public class AzureCloudProvider extends CloudProvider {
private String tenantId;
public String getTenantId() {
return tenantId;
}
public String toString() {
return "AzureCloudProvider{" +
"tenantId='" + tenantId + '\'' +
", id='" + id + '\'' +
", region='" + region + '\'' +
'}';
}
public static AzureCloudProvider of(Faker faker) {
var azure = faker.azure();
var cloudProvider = new AzureCloudProvider();
cloudProvider.region = azure.region();
cloudProvider.region = azure.region();
cloudProvider.id = UUID.randomUUID().toString();
cloudProvider.tenantId = azure.tenantId();
return cloudProvider;
}
}
Наконец, давайте посмотрим, как использовать DocumentTemplate
для взаимодействия с базой данных. Этот код демонстрирует создание экземпляров поставщиков AWS и Azure, их вставку в базу данных и извлечение. Реализация использует API Jakarta NoSQL для обеспечения сохранения данных, гарантируя, что логика наследования и дискриминатора применяются без проблем во время сохранения и извлечения.
import jakarta.enterprise.inject.se.SeContainer;
import jakarta.enterprise.inject.se.SeContainerInitializer;
import net.datafaker.Faker;
import org.eclipse.jnosql.mapping.document.DocumentTemplate;
import java.util.List;
import java.util.logging.Logger;
public class App {
private static final Logger LOGGER = Logger.getLogger(App.class.getName());
public static void main(String[] args) {
var faker = new Faker();
LOGGER.info("Starting the application");
try (SeContainer container = SeContainerInitializer.newInstance().initialize()) {
var template = container.select(DocumentTemplate.class).get();
LOGGER.info("Creating 10 documents");
for (int index = 0; index < 5; index++) {
template.insert(List.of(AWSCloudProvider.of(faker), AzureCloudProvider.of(faker)));
}
System.out.println("The cloud providers here");
template.select(CloudProvider.class).stream().forEach(System.out::println);
System.out.println("The AWS cloud providers here");
template.select(AWSCloudProvider.class).stream().forEach(System.out::println);
System.out.println("The Azure cloud providers here");
template.select(AzureCloudProvider.class).stream().forEach(System.out::println);
}
}
private App() {
}
}
Заключение
Многофункциональные возможности ArangoDB делают его универсальным выбором для современных приложений. Комбинирование моделей ключ-значение и документов в одной базе данных упрощает вашу архитектуру данных, сохраняя гибкость. С Jakarta NoSQL интеграция ArangoDB в приложения Java становится безупречной, используя знакомые аннотации и программные парадигмы.
Для полного кода посетите Репозиторий GitHub.
Source:
https://dzone.com/articles/arangodb-success-through-multivalue-database