הקדמה לPolymorphism עם מסדיות מסדיות NoSQL באמצעות Jakarta NoSQL

פולימורפיזם, תפיסה בסיסית בתכנות האובייקטים, מאפשרת לאובייקטים שונים בסוגים שונים להיטיל את עצמם כמותפים של סופרקלס משותף. הפלטפורמה הזו היא חיונית ליצירת מערכות שיכולות להרחבться ולהיענק בקלות. בעוד מסדי נתונים SQL משולבים עם ג 'קארטה פרסistence (JPA) יכולים להתמודד עם מידע פולימורפי, מסדי נתונים NoSQL מציעים יתרונות מסויימים. בניגוד למסדי נתונים SQL, הם דורשים הגדרות סכמה קשורות, מסדי נתונים NoSQL מקבלים גישה חסרת סכם, מעביר את התמך במבנים נתונים דינמיים ופלטפורמיים. הפלטפורמה הזו נהיית מאד מושכת במיוחד כשמשולבת עם ג' קארטה NoSQL, הכלי שמספק תמיכה חזקה בהגדרה וניהול של שדות פולימורפיים דרך ממתקנים מותאמים אישית.

במיון היישומים העסקיים, קיים צורך רב בניהול אובייקטים מסוגים שונים. לדוגמה, פלטף אקומרציה יכול לטפל בשירותים שונים לתשלום כמו כרטיסי אשראי, מנויי דיגיטליים ועברות בנקים, כ each with specific attributes. באותו אופן, מערכות ניהול הון בחברות גדולות מעסיקות עם סוגים שונים של הון כמו נדל"ן, מכונות ובעלות קניין, כ each with unique properties. מערכות בריאות חייבות לאמץ סוגים מגוונים של מידע, ממפים פרטיים עד תעודות רפואיות ותוצאות בדיקות. שימוש במסדי נתונים NoSQL

המדריך הזה יראה כיצד להשתמש ב-Jakarta NoSQL כדי לנהל שדות פולימורפיים באמצעות ממירים מותאמים אישית. נכלול קוד דוגמה לשילוב שירותי REST באמצעות Helidon ו-Oracle NoSQL. דוגמה זו תדגים את היישום המעשי של פולימורפיזם בניהול יעיל של סוגי נתונים שונים בסביבה של מסד נתונים NoSQL ללא סכימה.

שימוש בפולימורפיזם עם NoSQL ו-Jakarta NoSQL

מדריך זה יחקור את יכולות ה-NoSQL והסכימה-ללא בעולם ה-Java באמצעות Oracle NoSQL, Java Helidon ו- Rest API. ניצור ישות Machine בה נעניק שדה engine אותו נמיר ל-JSON. הודות לגמישות הטבעית של Oracle NoSQL ועיצובו ללא סכימה, גישה זו פועלת בצורה חלקה.

השלב הראשון הוא יצירת פרויקט Helidon, שבו תוכל להשתמש ב-Helidon Starter: Helidon Starter.

לאחר יצירת פרויקט תואם Microprofile, השלב הבא הוא לכלול את מנהל ההתקן של Oracle NoSQL: Oracle NoSQL Driver.

בקובץ ההגדרות, מכיוון שנריץ מקומית, אנו זקוקים לשתי תכונות: אחת להגדיר את חיבור ה-host והשנייה להגדיר את שם מסד הנתונים:

Properties files

 

jnosql.document.database=machines
jnosql.oracle.nosql.host=http://localhost:8080

כמו כן, עדכן את הפורט לשימוש 8181:

Properties files

 

server.port=8181

השלב הבא הוא להגדיר ולהריץ את אורקל נוסקל. בכדי להקל על עצמנו, נשתמש בדוקר, אך חשוב לדעת שאורקל נוסקל גם תומך בהשלמה לגלוד ברשת העל על התשתית אורקל:

Shell

 

docker run -d --name oracle-instance -p 8080:8080 ghcr.io/oracle/nosql:latest-ce

בעזרת דוקר, אנחנו מפשטים את תהליך ההגדרה ואווחרים את המיקום של המקום המאובחן של אורקל נוסקל בסביבה בשל סביבה שבה אנחנו יכולים לשלוט. ההגדרה הזו מעניקה גישה מעשית לפיתוח ובדיקות מוצעת, ומדגישה את הגמישות של הגדלה של אורקל נוסקל בסביבות שונות, כולל ברשת העל על התשתית.

אחרי הגדרה העליונה והבסיס של הבסיס הנתונים, השלב הבא הוא להגדיר את היישום וליצור את היישום של הממהלה. במקרה זה, נדגים את האינטגרציה הבלתי מוסרת בין ג 'קארטה נוסקל וג' קארטה ג' סון-ביי, מראה איך דרכים שונות של התייחסויות של ג' קארטה יכולות לעבוד ביחד באופן יעיל.

השלב הראשון הוא להגדיר את המכונה היישום, שמביא בשדה פולימורפי של מנוע.

Java

 


@Entity
@JsonbVisibility(FieldAccessStrategy.class)
public class Machine {

    @Id
    private String id;

    @Column
    @Convert(EngineConverter.class)
    private Engine engine;

    @Column
    private String manufacturer;

    @Column
    private int year;

    // גיטרים וסטטרס
}

בהמשך, אנחנו מגדירים את המנוע המקום, ומספקים את הסוגים והיישומים בעזרת JsonbTypeInfo כדי להתמודד עם הפולימורפיזם:

Java

 

@JsonbTypeInfo(
        key = "type",
        value = {
                @JsonbSubtype(alias = "gas", type = GasEngine.class),
                @JsonbSubtype(alias = "electric", type = ElectricEngine.class)
        }
)
@JsonbVisibility(FieldAccessStrategy.class)
public abstract class Engine {
    // מאפיינים משותפים של המנוע

    // גיטרים וסטטרס
}

הממהל

אחרי הגדרת ההגדרות והבסיס הנתונים, השלב הבא הוא יצירת הגישה ליישום ולבסיס הנתונים. Eclipse JNoSQL משלב שתי הגדרות, Jakarta NoSQL וJakarta Data, בעזרת ממשק אחד כדי להשיג את זה. תווים מטפלים בשלבים הנחוצים.

ראשית, אנחנו מגדירים את הממשק MachineRepository:

Java

 

@Repository
public interface MachineRepository extends BasicRepository<Machine, String> {

    @Query("from Machine where engine.type = :type")
    List<Machine> findByType(@Param("type") String type);
}

ממשק זה מאפשר לנו לחפש רכיבים ישירות בתוך הנתונים JSON ללא בעיות, וניתן להרחיב עליו בלי ליצור מבנה נוקשה.

בהמשך, אנחנו מגדירים את השליט כדי לחשוף את המשאב:

Java

 


@Path("/machines")
@ApplicationScoped
public class MachineResource {

    private static final Logger LOGGER = Logger.getLogger(MachineResource.class.getName());

    public static final Order<Machine> ORDER_MANUFACTURER = Order.by(Sort.asc("manufacturer"));

    private final MachineRepository repository;

    @Inject
    public MachineResource(@Database(DatabaseType.DOCUMENT) MachineRepository repository) {
        this.repository = repository;
    }

    @GET
    public List<Machine> getMachines(@QueryParam("page") @DefaultValue("1") int page, @QueryParam("page_size") @DefaultValue("10") int pageSize) {
        LOGGER.info("Get machines from page " + page + " with page size " + pageSize);
        Page<Machine> machines = this.repository.findAll(PageRequest.ofPage(page).size(pageSize), ORDER_MANUFACTURER);
        return machines.content();
    }

    @GET
    @Path("gas")
    public List<Machine> getGasMachines() {
        return this.repository.findByType("gas");
    }

    @GET
    @Path("electric")
    public List<Machine> getElectricMachines() {
        return this.repository.findByType("electric");
    }

    @GET
    @Path("{id}")
    public Machine get(@PathParam("id") String id) {
        LOGGER.info("Get machine by id " + id);
        return this.repository.findById(id)
                .orElseThrow(() -> new WebApplicationException("Machine not found with id: " + id, Response.Status.NOT_FOUND));
    }

    @PUT
    public void save(Machine machine) {
        LOGGER.info("Saving a machine " + machine);
        this.repository.save(machine);
    }
}

שליט זה מפתח קצוות לניהול מכונות, כולל קבלת מכונות על-פי סוג והפיגועה.

סוף סוף, בואו נבצע את היישום ונשלף נתונים בעזרת הפקודות curl הבאות:

Shell

 

curl --location --request PUT 'http://localhost:8181/machines' \
--header 'Content-Type: application/json' \
--data '{
"id": "1",
"model": "Thunderbolt V8",
"engine": {
"type": "gas",
"horsepower": 450
},
"manufacturer": "Mustang",
"year": 2021,
"weight": 1600.0
}'

curl --location --request PUT 'http://localhost:8181/machines' \
--header 'Content-Type: application/json' \
--data '{
    "id": "2",
    "model": "Eagle Eye EV",
    "engine": {
        "type": "electric",
        "horsepower": 300
    },
    "manufacturer": "Tesla",
    "year": 2022,
    "weight": 1400.0
}'

curl --location --request PUT 'http://localhost:8181/machines' \
--header 'Content-Type: application/json' \
--data '{
    "id": "3",
    "model": "Road Runner GT",
    "engine": {
        "type": "gas",
        "horsepower": 400
    },
    "manufacturer": "Chevrolet",
    "year": 2020,
    "weight": 1700.0
}'

curl --location --request PUT 'http://localhost:8181/machines' \
--header 'Content-Type: application/json' \
--data '{
    "id": "4",
    "model": "Solaris X",
    "engine": {
        "type": "electric",
        "horsepower": 350
    },
    "manufacturer": "Nissan",
    "year": 2023,
    "weight": 1350.0
}'

curl --location --request PUT 'http://localhost:8181/machines' \
--header 'Content-Type: application/json' \
--data '{
    "id": "5",
    "model": "Fusion Hybrid 2024",
    "engine": {
        "type": "electric",
        "horsepower": 320
    },
    "manufacturer": "Toyota",
    "year": 2024,
    "weight": 1450.0
}'

הגדרה זו מאפשרת לך לחפש על-פי סוג בתוך הנתונים JSON, והפיגועה ניתנת בקלות. עבור עוד על טכניקות הפיגועה, ראו מאמר זה.

עם חלק מהנתונים שולפים, ניתן לחקור ולהבין איך החיפוש פועל:

  • .ראה מכונות עם הדפסה
  • קבל את כל המכונות
  • קבל מכונות גז

מחשבות אחרונות

שילוב פולימורפיזם עם מסדי נתונים NoSQL באמצעות Jakarta NoSQL ו-Jakarta JSON-B מציע גמישות והתייעלות בניהול סוגי נתונים מגוונים. על ידי ניצול הטבע חסר התרשים של NoSQL, גישה זו מפשטת את הפיתוח ומשפרת את ההתאמה של היישום. לדוגמה השלמה ולקוד המקור, בקר ב-soujava/helidon-oracle-json-types.

Source:
https://dzone.com/articles/intro-to-polymorphism-with-db-engines-in-nosql