إن التعامل مع هياكل قواعد البيانات المتنوعة غالبًا ما يقدم تعقيدًا كبيرًا في بنية النظام، خاصة عندما تكون هناك حاجة إلى عدة مثيلات من قاعدة البيانات. يمكن أن يؤدي هذا التشتت إلى تعقيد العمليات وزيادة التكاليف وتقليل الكفاءة. توفر قواعد البيانات متعددة النماذج مثل 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 في المفتاح والقيمة. ستتضمن كيان “المطار” حقلين: “الرمز” (المعرف) و”الاسم”.
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;
}
}
بعد تعريف الكيان، يمكنك استخدام “قالب المفتاح والقيمة” للتفاعل مع قاعدة البيانات. في هذا البرنامج التعليمي، سنكتشف مزيدًا من قدرة 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 يسد هذه الفجوة من خلال واجهة برمجة التطبيقات الخاصة به. دعونا نستخدم جاكارتا NoSQL مع ArangoDB لإدارة بيانات موفري الخدمات السحابية، بما في ذلك تخصصين: خدمات الويب من Amazon (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
) لإنشاء بيانات عينية لأغراض العرض.
موفر_سحابة_AWS
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;
}
}
مزود السحابة Azure
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 للتعامل مع استمرارية البيانات، مضمنة التطبيق السلس لمنطق الوراثة والفصل أثناء التخزين والاسترجاع.
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