מסדי נתונים NoSQL שונים ממסדי נתונים רלציוניים באפשרותם להשתמש במבנים מורכבים יותר מבלי לדרוש קשרים מסורתיים כגון אחד-לרבים או אחד-לאחד. במקום זאת, מסדי נתונים NoSQL משתמשים בסוגי נתונים גמישים, כגון מערכים או מסמכים משניים, כדי לאחסן נתונים קשורים ביעילות בתוך מסמך יחיד. גמישות זו מאפשרת למפתחים לעצב מודלים שמתאימים לצרכי השאילתות והביצועים של האפליקציה שלהם.
ג'קרטה NoSQL הוא סביבת עבודה ב-Java שמקלה על התקשורת עם מסדי נתונים NoSQL, כולל MongoDB. היא מספקת אונוטציות שמגדירות איך הנתונים ממופים ומאוחסנים, מאפשרת למפתחים לשלוט באם אובייקטים מוטמעים מקובצים או מאוחסנים באופן שטוח.
כאשר מתעסקים עם MongoDB ו-Jakarta NoSQL, אחד השיקולים העיקריים הוא איך למבנה את המסמכים שלך. בחירה בין מבנה שטוח ובין מבנה מקובץ משפיעה על אופן אחסון הנתונים, שאילתות ושחזורם. במאמר זה, אנו מסקרים שתי הגישות אלו באמצעות דוגמה מעשית.
Jakarta NoSQL ויישות המוצר
כדי להבין את המבנים השטוחים והמקובץ, נתחיל עם היכרות ראשונית עם יישות ה-Product
ונראה איך אונוטציות של Jakarta NoSQL עובדות:
public class Product {
ObjectIdConverter.class) (
private String id;
private String name;
private Manufacturer manufacturer;
private List<String> tags;
private Set<Category> categories;
Product(String name, Manufacturer manufacturer, List<String> tags, Set<Category> categories) {
this.name = name;
this.manufacturer = manufacturer;
this.tags = tags;
this.categories = categories;
}
public static ProductBuilder builder() {
return new ProductBuilder();
}
}
עכשיו, נסתכל על איך שדה manufacturer
יכול להיות מאוחסן באופן שונה בהתאם לאונוטציות של Jakarta NoSQL.
הבנת מבנים מקובץ ושטוח
מבנה מקובץ
מבנה מקובץ מקובץ מקובץ מארגן מידע קשור לאובייקטים נפרדים במסמך. גישה זו משפרת קריאות ומאפשרת תרגול דומיין נקי יותר. Jakarta NoSQL משיג זאת באמצעות. @Embeddable (Embeddable.EmbeddableType.GROUPING)
.
דוגמה:
{
"_id": { "$oid": "67b264520abd020ec0eb9a4c" },
"categories": [
{ "name": "Computers", "description": "All computers" },
{ "name": "Electronics", "description": "All electronics" }
],
"manufacturer": {
"address": "One Infinite Loop Cupertino, CA 95014",
"name": "Apple",
"contactNumber": "+1-408-996-1010"
},
"name": "MacBook Pro",
"tags": ["smartphone", "tablet", "laptop"]
}
כאן, הייצורניקות מקובץ לתוך עצם משני נפרד במקום לכלול את המאפיינים שלה ברמת הגובה.
Embeddable.EmbeddableType.GROUPING) (
public record Manufacturer( String name, String address, String contactNumber) {}
מבנה שטוח
מבנה שטוח שומר על מידע קשור באותו מסמך, כולל רשימות מטופשות או שדות מקוננים ישירות. Jakarta NoSQL מאפשר זאת באמצעות @Embeddable (Embeddable.EmbeddableType.FLAT)
. גישה זו מועילה כאשר אתה רוצה גישה מהירה לכל הפרטים בלי צורך בשאילתות מורכבות.
דוגמה:
{
"_id": { "$oid": "67b22d20c921154b0223b27b" },
"address": "One Infinite Loop Cupertino, CA 95014",
"categories": [
{ "name": "Electronics", "description": "All electronics" },
{ "name": "Computers", "description": "All computers" }
],
"contactNumber": "+1-408-996-1010",
"name": "Apple",
"tags": ["smartphone", "tablet", "laptop"]
}
גישה זו מאחסנת פרטי יצרן ישירות במסמך במקום לקיבוץ שלהם בשדות נפרדים.
Embeddable.EmbeddableType.FLAT) (
public record Manufacturer( String name, String address, String contactNumber) {}
שימוש דוגמתי ב-Jakarta NoSQL
קטע הקוד הבא מדגים איך Jakarta NoSQL משלבת בין מבנים אלה:
public class App {
public static void main(String[] args) {
var faker = new Faker();
try (SeContainer container = SeContainerInitializer.newInstance().initialize()) {
var template = container.select(DocumentTemplate.class).get();
var electronicsCategory = new Category("Electronics", "All electronics");
var computerCategory = new Category("Computers", "All computers");
var tags = List.of("smartphone", "tablet", "laptop");
var manufacturer = new Manufacturer("Apple", "One Infinite Loop Cupertino, CA 95014", "+1-408-996-1010");
Product macBookPro = Product.builder().categories(Set.of(electronicsCategory, computerCategory))
.manufacturer(manufacturer)
.name("MacBook Pro")
.tags(tags)
.build();
Product product = template.insert(macBookPro);
System.out.println("Product saved: " + product);
}
}
}
בחירת הגישה הנכונה
- השתמש במבנה שטוח כאשר נדרש תצורת מסמך פשוטה עם כל המאפיינים באותו רמה.
- השתמש במבנה מקובץ כאשר נדרש לארגן נתונים קשורים לצורה מתונה יותר לשם שיפור קריאות וניתוח.
סיכום
Jakarta NoSQL מציע גמישות במבנה מסמכי MongoDB באמצעות @Embeddable(Embeddable.EmbeddableType)
. בחירת מבנים שטוחים או קבוצתיים תלויה בתבניות גישה לנתונים שלך ובהעדפות המידול. הבנת השיטות הללו מאפשרת עיצוב בסיס נתונים יעיל, מפנה לשאילתות יותר אפקטיביות תוך שמירה על ניקיון ומבנה מסמך מסודר.
לקוד השלם, בקר במאגר המידע של GitHub.
סרטון
Source:
https://dzone.com/articles/handling-embedded-data-in-nosql-with-java