處理不同的資料庫結構通常會給系統架構帶來顯著的複雜性,尤其是在需要多個資料庫實例的情況下。這種碎片化可能會使操作變得複雜,增加成本,並降低效率。像 ArangoDB 這樣的多模型資料庫提供了一個統一的解決方案來應對這些挑戰。它們通過在單個資料庫實例中支持多種數據模型 — 鍵值、文檔和圖形 — 簡化了架構並優化了數據管理。
與關聯式資料庫不同,NoSQL 資料庫並不遵循像 SQL 這樣的通用標準。相反,它們是基於它們的存儲結構進行分類的。其中一些流行的類型有:
- 鍵值:類似於 Java 的
Map
或 Python 字典,這種結構使用一個鍵檢索整個值作為 BLOB。 - 寬列:類似於鍵值,但將值分割為列,提供更細粒度的數據檢索。
- 文檔:結構類似於 JSON 或 XML,這種類型提供了更大的查詢靈活性。
- 圖形:通過表示實體及其連接來實現複雜的關係建模和查詢。
一個多模型資料庫將這些功能結合到一個系統中。例如,ArangoDB 支持鍵值、文檔和圖形模型,消除了需要使用獨立資料庫的必要性。
本文章演示了如何使用 ArangoDB 和 Jakarta NoSQL 在 Java 應用程序中探索鍵值和文檔模型。
設置 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));
}
}
}
此程序會生成一條隨機的機場記錄,將其插入數據庫並檢索它。如果您在本地運行,您可以使用以下 URL 通過瀏覽器檢查數據庫中的值:
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 提供者的實例,將它們插入資料庫並檢索它們。該實作利用 Jakarta NoSQL 的 API 來處理資料持久性,確保在儲存和檢索期間無縫應用繼承和辨識器邏輯。
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