ניהול מבני נתונים שונים בבסיסי נתונים לעיתים קרובות מביא למורכבות משמעותית בארכיטקטורת המערכת, במיוחד כאשר דרושים מספר מופעי בסיסי נתונים. הפיצול הזה יכול להקשות על הפעולות, להגדיל עלויות ולצמצם יעילות. בסיסי נתונים מרובי מודלים כמו ArangoDB מספקים פתרון מאוחד להתמודד עם אתגרים אלו. הם מפשטים את הארכיטקטורה ומייעלים את ניהול הנתונים על ידי תמיכה במודלי נתונים מרובים — מפתח-ערך, מסמך וגרף — בתוך מופע בסיס נתונים אחד.
בניגוד לבסיסי נתונים רלציוניים, בסיסי נתונים NoSQL אינם מחויבים לסטנדרט אוניברסלי כמו SQL. במקום זאת, הם מסווגים על פי מבנה האחסון שלהם. בין הסוגים הפופולריים נמצאים:
- מפתח-ערך: דומה ל
Map
של Java או למילון של Python, מבנה זה שולף ערכים שלמים כ-BLOBs באמצעות מפתח. - עמודות רחבות: דומה למפתח-ערך אך מחלק את הערכים לעמודות, מה שמציע שליפה מדויקת יותר של נתונים.
- מסמך: מאורגן כמו 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
(זיהוי) ו־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
עבודה עם נתוני מסמך
ג'קרטה NoSQL מספק תכונות עשירות לעבודה עם מסדי נתונים מסמכים, כולל תמיכה בירושה ובדגם נתונים היררכי. בעוד מסדי נתונים NoSQL לרוב לא תומכים באופן בתורתי בתכונות אלה, ג'קרטה NoSQL גשרת על הפער עם ה- API שלה. בואו נשתמש ב-Jakarta NoSQL עם ArangoDB כדי לנהל נתוני ספקי שירותי הענן, כולל שתי התמחויות: Amazon Web Services (AWS) ו-Azure.
ג'קרטה NoSQL משתמשת באונוטציות @DiscriminatorColumn
, @DiscriminatorValue
ו- @Inheritance
כדי לנהל ירושה במסדי נתונים מסמכים.
- האונוטציה
@DiscriminatorColumn
מציינת את השדה שמשמש לזיהוי של סוג ישות במסמך במסד הנתונים. - האונוטציה
@DiscriminatorValue
מגדירה את הערך הספציפי עבור כל מחלקה משנית, מבטיחה שהן יוזהרו באופן נכון. - האונוטציה
@Inheritance
מציינת כי ההיררכיה של המחלקות תתווגג למסד הנתונים.
ראשית, נגדיר את המחלקה הבסיסית עבור ספקי הענן:
"type") (
public class CloudProvider {
protected String id;
protected String region;
}
לאחר מכן, אנו מציגים את המחלקות המתמחות בספקי שירותי הענן. הדוגמאות הללו מדגימות כיצד ג'קרטה 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 Repository.
Source:
https://dzone.com/articles/arangodb-success-through-multivalue-database