Die Behandlung verschiedener Datenbankstrukturen birgt oft erhebliche Komplexität in die Systemarchitektur, insbesondere wenn mehrere Datenbankinstanzen erforderlich sind. Diese Fragmentierung kann die Betriebsabläufe komplizieren, die Kosten erhöhen und die Effizienz verringern. Multimodell-Datenbanken wie ArangoDB bieten eine einheitliche Lösung, um diesen Herausforderungen zu begegnen. Sie vereinfachen die Architektur und optimieren das Datenmanagement, indem sie mehrere Datenmodelle – Schlüssel-Wert, Dokument und Graph – innerhalb einer einzigen Datenbankinstanz unterstützen.
Im Gegensatz zu relationalen Datenbanken NoSQL-Datenbanken halten sich nicht an einen universellen Standard wie SQL. Stattdessen werden sie nach ihrer Speicherstruktur kategorisiert. Zu den beliebten Typen gehören:
- Schlüssel-Wert: Ähnlich wie eine Java
Map
oder ein Python-Wörterbuch ruft diese Struktur ganze Werte als BLOBs mithilfe eines Schlüssels ab. - Weitkolonne: Ähnlich wie Schlüssel-Wert, aber Werte werden in Spalten aufgeteilt und bieten eine genauere Datenabfrage.
- Dokument: Strukturiert wie JSON oder XML, bietet dieser Typ eine größere Abfrageflexibilität.
- Graph: Ermöglicht die Modellierung und Abfrage komplexer Beziehungen, indem Entitäten und ihre Verbindungen dargestellt werden.
Eine multimodell-Datenbank kombiniert diese Fähigkeiten in einem einzigen System. Zum Beispiel unterstützt ArangoDB Schlüssel-Wert, Dokument und Graph-Modelle und eliminiert so die Notwendigkeit für separate Datenbanken.
Dieser Artikel zeigt, wie man ArangoDB verwendet, um Schlüssel-Wert- und Dokumentmodelle in Java-Anwendungen mithilfe von Jakarta NoSQL zu erkunden.
Einrichten von ArangoDB
Um mit ArangoDB zu beginnen, bietet Docker eine einfache Möglichkeit, Drittanbieterdienste zu verwalten. Mit dem folgenden Befehl können Sie eine ArangoDB-Instanz ganz einfach einrichten:
docker run -e ARANGO_NO_AUTH=1 -d --name arangodb-instance -p 8529:8529 arangodb/arangodb
Erforschen von Schlüssel-Wert-Daten
Schlüssel-Wert-Datenbanken sind ideal für einfache Datenmodelle. Lassen Sie uns eine Beispielanwendung erstellen, um Flughafendaten mithilfe der Schlüssel-Wert-Funktionen von ArangoDB zu verwalten. Die Airport
-Entität wird zwei Felder umfassen: code
(ID) und 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;
}
}
Nachdem die Entität definiert ist, können Sie KeyValueTemplate
verwenden, um mit der Datenbank zu interagieren. In diesem Tutorial werden wir mehr von den Jakarta NoSQL-Funktionen über die Annotationen hinaus erkunden, indem wir Eclipse JNoSQL verwenden; Sie können das Repository erstellen, sobald Eclipse JNoSQL Jakarta Data implementiert und unterstützt.
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));
}
}
}
Dieses Programm generiert einen zufälligen Flughafeneintrag, fügt ihn in die Datenbank ein und ruft ihn ab. Wenn Sie lokal arbeiten, können Sie die Werte in der Datenbank überprüfen, indem Sie Ihren Browser mit der URL verwenden:
http://localhost:8529/_db/airport/_admin/aardvark/index.html#collections
Arbeiten mit Dokumentendaten
Jakarta NoSQL bietet umfangreiche Funktionen für die Arbeit mit Dokumentendatenbanken, einschließlich Unterstützung für Vererbung und hierarchische Datenmodellierung. Während NoSQL-Datenbanken im Allgemeinen diese Funktionen nicht von Natur aus unterstützen, überbrückt Jakarta NoSQL diese Lücke mit seiner API. Lassen Sie uns Jakarta NoSQL mit ArangoDB verwenden, um Daten von Cloud-Anbietern zu verwalten, einschließlich zweier Spezialisierungen: Amazon Web Services (AWS) und Azure.
Jakarta NoSQL verwendet die Annotationen @DiscriminatorColumn
, @DiscriminatorValue
und @Inheritance
, um die Vererbung in Dokumentendatenbanken zu verwalten.
- Die Annotation
@DiscriminatorColumn
legt das Feld fest, das zur Identifizierung eines Entitätstyps im Datenbankdokument verwendet wird. - Die Annotation
@DiscriminatorValue
definiert den spezifischen Wert für jede Unterklasse, um sicherzustellen, dass sie korrekt identifiziert werden. - Die Annotation
@Inheritance
gibt an, dass die Klassenhierarchie in die Datenbank abgebildet wird.
Zuerst definieren wir die Basisklasse für Cloud-Anbieter:
"type") (
public class CloudProvider {
protected String id;
protected String region;
}
Dann führen wir die spezialisierten Cloud-Anbieterklassen ein. Diese Beispiele zeigen, wie Jakarta NoSQL Annotationen wie @DiscriminatorValue
nutzt, um zwischen verschiedenen Dokumententypen zu unterscheiden. Jede Spezialisierung – AWS und Azure – erbt von der Basisklasse CloudProvider
und definiert gleichzeitig Attribute, die für jeden Anbieter einzigartig sind. Darüber hinaus werden Factory-Methoden (of
) bereitgestellt, um Beispieldaten für Demonstrationszwecke zu generieren.
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;
}
}
Schließlich schauen wir uns an, wie man das DocumentTemplate
verwendet, um mit der Datenbank zu interagieren. Dieser Code demonstriert die Erstellung von Instanzen der AWS- und Azure-Anbieter, das Einfügen in die Datenbank und das Abrufen. Die Implementierung nutzt die API von Jakarta NoSQL zur Handhabung der Datenspeicherung und stellt sicher, dass Vererbung und Diskriminatorlogik nahtlos während der Speicherung und des Abrufs angewendet werden.
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() {
}
}
Fazit
Die Multimodellfähigkeiten von ArangoDB machen es zu einer vielseitigen Wahl für moderne Anwendungen. Die Kombination von Schlüssel-Wert- und Dokumentmodellen in einer einzigen Datenbank vereinfacht Ihre Datenarchitektur und bewahrt dabei die Flexibilität. Mit Jakarta NoSQL wird die Integration von ArangoDB in Java-Anwendungen nahtlos, indem vertraute Annotations- und Programmierparadigmen genutzt werden.
Für den vollständigen Code besuchen Sie das GitHub-Repository.
Source:
https://dzone.com/articles/arangodb-success-through-multivalue-database