لنفترض أن لديك تطبيقًا تم تطويره باستخدام Node.js (أو أي منصة أخرى). يتصل هذا التطبيق بقاعدة بيانات MongoDB (NoSQL) لتخزين تصنيفات للكتب (عدد النجوم المعطاة وتعليق). ولنفترض أن لديك تطبيقًا آخر تم تطويره بلغة Java (أو Python ، C# ، TypeScript… أي شيء). يتصل هذا التطبيق بقاعدة MariaDB (SQL ، علائقية) لإدارة كتالوج للكتب (العنوان ، تاريخ النشر ، عدد الصفحات).
تُطلب منك إنشاء تقرير يظهر العنوان ومعلومات التصنيف لكل كتاب. لاحظ أن قاعدة البيانات MongoDB لا تحتوي على عنوان الكتب ، ولا تحتوي القاعدة العلائقية على التصنيفات. نحتاج إلى مزج بيانات تم إنشاؤها بواسطة تطبيق NoSQL مع بيانات تم إنشاؤها بواسطة تطبيق SQL.
A common approach to this is to query both databases independently (using different data sources) and process the data to match by, for example, ISBN (the id of a book) and put the combined information in a new object. This needs to be done in a programming language like Java, TypeScript, C#, Python, or any other imperative programming language that is able to connect to both databases.
A polyglot application
يعمل هذا الأسلوب. ومع ذلك ، الجمع بين البيانات هو عمل قاعدة البيانات. تم بناءها لهذا النوع من عمليات البيانات. أيضًا ، بهذا الأسلوب ، لم يعد التطبيق العلائقي مجرد تطبيق علائقي فقط ؛ يصبح تطبيقًا متعدد اللغات لقاعدة البيانات ، وهذا يزيد من التعقيد مما يجعله أصعب في الصيانة.
باستخدام وكيل قاعدة البيانات مثل MaxScale ، يمكنك الجمع بين هذه البيانات على مستوى قاعدة البيانات باستخدام أفضل لغة للبيانات – SQL. لا يحتاج تطبيق SQL الخاص بك إلى أن يصبح تطبيقًا متعدد اللغات.
على الرغم من أن هذا يتطلب عنصرًا إضافيًا في البنية التحتية، إلا أنك تستفيد أيضًا من جميع الوظائف التي يقدمها مستخدم القاعدة البيانات. وتشمل أمور مثل الاستجابة التلقائية للفشل، التستر على البيانات بشكل شفاف، عزل التوجيه، الكشف، مرشحات الأمان، وأكثر من ذلك.
MaxScale هو مستخدم قاعدة بيانات قوي وذكي يفهم كل من SQL و NoSQL. كما أنه يفهم كافكا (لـ CDC أو إدخال البيانات)، ولكن هذا موضوع لوقت آخر. باختصار، باستخدام MaxScale، يمكنك توصيل تطبيق NoSQL الخاص بك بقاعدة بيانات على العلاقية مطابقة لـ ACID وتخزين البيانات هناك بجوار الجداول التي تستخدمها تطبيقات SQL أخرى.
يسمح MaxScale لتطبيق SQL باستهلاك بيانات NoSQL.
دعونا نجرب هذا الأسلوب الأخير في تجربة سريعة وسهلة المتابعة مع MaxScale. ستحتاج إلى تثبيت ما يلي على جهاز الكمبيوتر الخاص بك:
إعداد قاعدة بيانات MariaDB
باستخدام محرر نص عادي، قم بإنشاء ملف جديد وحفظه باسم docker-compose.yml. يجب أن يحتوي الملف على ما يلي:
version: "3.9"
services:
mariadb:
image: alejandrodu/mariadb
environment:
- MARIADB_CREATE_DATABASE=demo
- MARIADB_CREATE_USER=user:Password123!
- MARIADB_CREATE_MAXSCALE_USER=maxscale_user:MaxScalePassword123!
maxscale:
image: alejandrodu/mariadb-maxscale
command: --admin_host 0.0.0.0 --admin_secure_gui false
ports:
- "3306:4000"
- "27017:27017"
- "8989:8989"
environment:
- MAXSCALE_USER=maxscale_user:MaxScalePassword123!
- MARIADB_HOST_1=mariadb 3306
- MAXSCALE_CREATE_NOSQL_LISTENER=user:Password123!
هذا ملف Docker Compose. يصف مجموعة من الخدمات التي سيتم إنشاؤها بواسطة Docker. نقوم بإنشاء خدمتين (أو حاويتين) — خادم قاعدة بيانات MariaDB ومستعرض قاعدة بيانات MaxScale. سيعملون بشكل محلي على جهاز الكمبيوتر الخاص بك، ولكن في بيئات الإنتاج، من الشائع نشرهم على آلات مادية منفصلة. تذكر أن تلك الصور Docker ليست مناسبة للإنتاج! كونها مصممة لتكون مناسبة للعروض التوضيحية والاختبارات السريعة. يمكنك العثور على شفرة المصدر لتلك الصور على GitHub. للصور الرسمية من Docker لـ MariaDB، اتجه إلى صفحة MariaDB على Docker Hub.
الملف السابق لـ Docker Compose يقوم بتكوين خادم قاعدة بيانات MariaDB بقاعدة بيانات (أو مخطط؛ هما مرادفان في MariaDB) تسمى demo
. كما يخلق اسم مستخدم user
بكلمة مرور Password123!
. يتمتع هذا المستخدم بالأذونات المناسبة على قاعدة البيانات demo
. هناك مستخدم إضافي باسم maxscale_user
وكلمة مرور MaxScalePassword123!
. هذا هو المستخدم الذي سيستخدمه مروج القاعدة البيانات MaxScale للاتصال بخادم قاعدة البيانات MariaDB.
يقوم ملف Docker Compose أيضًا بتكوين مروج القاعدة البيانات عن طريق تعطيل HTTPS (لا تفعل هذا في الإنتاج!)، وتعريض مجموعة من المنافذ (سنتحدث عن هذا بعد قليل)، وتكوين مستخدم القاعدة البيانات وموقع مروج قاعدة البيانات MariaDB (عادة عنوان IP، ولكن هنا يمكننا استخدام اسم الحاوية التي تم تعريفها سابقًا في ملف Docker). السطر الأخير يخلق مستمع NoSQL الذي سنستخدمه للاتصال كعميل MongoDB على المنفذ الافتراضي (27017).
لبدء الخدمات (الحاويات) باستخدام سطر الأوامر، انتقل إلى الدليل الذي قمت بحفظ ملف Docker Compose فيه وقم بتشغيل ما يلي:
docker compose up -d
بعد تنزيل جميع البرامج وبدء الحاويات، ستحصل على قاعدة بيانات MariaDB ومروج MaxScale، وكلاهما مُعدّين مسبقًا لهذه التجربة.
إنشاء جدول SQL في MariaDB
دعنا نتصل بقاعدة البيانات العلائقية. في سطر الأوامر، قم بتنفيذ ما يلي:
mariadb-shell --dsn mariadb://user:'Password123!'@127.0.0.1
تحقق أنك تستطيع رؤية قاعدة البيانات demo
:
show databases;
التبديل إلى قاعدة البيانات demo
:
use demo;
الاتصال بقاعدة البيانات باستخدام جهاز MariaDB Shell.
إنشاء جدول books
:
CREATE TABLE books(
isbn VARCHAR(20) PRIMARY KEY,
title VARCHAR(256),
year INT
);
إدراج بعض البيانات. سأستخدم الكليشيه الشائع لإدراج كتبي:
INSERT INTO books(title, isbn, year)
VALUES
("Vaadin 7 UI Design By Example", "978-1-78216-226-1", 2013),
("Data-Centric Applications with Vaadin 8", "978-1-78328-884-7", 2018),
("Practical Vaadin", "978-1-4842-7178-0", 2021);
تحقق من تخزين الكتب في قاعدة البيانات عن طريق تشغيل:
SELECT * FROM books;
إدراج البيانات باستخدام جهاز MariaDB Shell.
إنشاء مجموعة JSON في MariaDB
لم نقم بتثبيت MongoDB حتى الآن، ومع ذلك يمكننا استخدام جهاز MongoDB (أو التطبيق) للاتصال به لإنشاء المجموعات والوثائق كما لو كنا نستخدم MongoDB، باستثناء أن البيانات تُخزن في قاعدة بيانات علائقية قوية تمامًا ومُلائمة للـ ACID وقابلة للتوسع. دعونا نجرب ذلك!
في سطر الأوامر، استخدم أداة محرك بحث MongoDB للاتصال بـ MongoDB… انتظر… إنه في الواقع قاعدة بيانات MariaDB! اجر التالي:
mongosh
بشكل افتراضي، تحاول هذه الأداة الاتصال بخادم MongoDB (الذي يحدث أنه MariaDB هذه المرة) يعمل على جهاز الكمبيوتر المحلي (127.0.0.1) باستخدام المنفذ الافتراضي (20017). إذا سارت الأمور على ما يرام، يجب أن تتمكن من رؤية قاعدة البيانات demo
عندما تقوم بتشغيل الأمر التالي:
show databases
التبديل إلى قاعدة البيانات demo
:
use demo
الاتصال بـ MariaDB باستخدام جهاز Mongo Shell.
نحن متصلون بقاعدة بيانات علائقية من عميل غير علائقي! فلنصنع مجموعة ratings
ونضع بعض البيانات فيها:
db.ratings.insertMany([
{
"isbn": "978-1-78216-226-1",
"starts": 5,
"comment": "A good resource for beginners who want to learn Vaadin"
},
{
"isbn": "978-1-78328-884-7",
"starts": 4,
"comment": "Explains Vaadin in the context of other Java technologies"
},
{
"isbn": "978-1-4842-7178-0",
"starts": 5,
"comment": "The best resource to learn web development with Java and Vaadin"
}
])
تحقق من استمرار التصنيفات في قاعدة البيانات:
db.ratings.find()
الاستعلام عن قاعدة بيانات MariaDB باستخدام طاولة مونغو.
استخدام وظائف JSON في MariaDB
عند هذه النقطة، لدينا قاعدة بيانات واحدة تبدو من الخارج مثل قاعدة بيانات NoSQL (مونغودب) وقاعدة بيانات علائقية (ماريادب). نحن قادرون على الاتصال بنفس قاعدة البيانات وكتابة وقراءة البيانات من عملاء مونغودب وعملاء SQL. يتم تخزين جميع البيانات في ماريادب، لذا يمكننا استخدام SQL لربط بيانات من عملاء مونغودب أو تطبيقات مع بيانات من عملاء ماريادب أو تطبيقات. فلنستكشف كيف يستخدم MaxScale ماريادب لتخزين بيانات مونغودب (المجموعات والوثائق).
قم بالاتصال بقاعدة البيانات باستخدام عميل SQL مثل mariadb-shell
، واظهر الجداول في مخطط العرض:
show tables in demo;
يجب أن ترى كل من الجداول books
وratings
المدرجة. تم إنشاء ratings
كمجموعة من MongoDB. ترجم MaxScale الأوامر المرسلة من عميل مونغودب وأنشأ جدولًا لتخزين البيانات في جدول. فلنرى بنية هذا الجدول:
describe demo.ratings;
A NoSQL collection is stored as a MariaDB relational table.
تحتوي جدول ratings
على عمودين:
id
: معرف الكائن.doc
: الوثيقة في شكل JSON.
إذا تفحصنا محتويات الجدول، سنجد أن جميع البيانات حول التصنيفات مخزنة في عمود doc
بتنسيق JSON:
SELECT doc FROM demo.ratings \G
تُخزن الوثائق NoSQL في قاعدة بيانات MariaDB.
فلنعد إلى هدفنا الأصلي—عرض عناوين الكتب مع معلومات تصنيفها. الآن، هذا ليس حالة الأمر، لكن دعونا نفترض للحظة أن جدول ratings
هو جدول عادي بأعمدة stars
و comment
. لو كانت تلك هي الحالة، فإن دمج هذا الجدول مع جدول books
سيكون سهلا، ويكون مهمتنا انتهت:
/* this doesn’t work */
SELECT b.title, r.stars, r.comment
FROM ratings r
JOIN books b USING(isbn)
عودة إلى الواقع. نحتاج إلى تحويل عمود doc
في الجدول الفعلي ratings
إلى تعبير علائقي يمكن استخدامه كجدول جديد في الاستعلام. شيء مثل هذا:
/* this still doesn’t work */
SELECT b.title, r.stars, r.comment
FROM ratings rt
JOIN ...something to convert rt.doc to a table... AS r
JOIN books b USING(isbn)
هذا الشيء هو دالة JSON_TABLE
. تشمل MariaDB مجموعة كاملة من دوال JSON لمعالجة السلاسل JSON. سنستخدم دالة JSON_TABLE
لتحويل عمود doc
إلى شكل علائقي يمكننا استخدامه لإجراء دمج SQL. البناء العام لدالة JSON_TABLE
هو كما يلي:
JSON_TABLE(json_document, context_path COLUMNS (
column_definition_1,
column_definition_2,
...
)
) [AS] the_new_relational_table
حيث:
json_document
: سلسلة أو تعبير يُرجع الوثائق JSON المراد استخدامها.context_path
: تعبير JSON Path يحدد العقد التي سيتم استخدامها كمصدر للصفوف.
وتتبع تعريفات الأعمدة (column_definition_1
, column_definition_2
, الخ…) الجملة التالية:
new_column_name sql_type PATH path_in_the_json_doc [on_empty] [on_error]
بدمج هذه المعرفة، ستبدو الاستعلام SQL لدينا كما يلي:
SELECT b.title, r.stars, r.comment
FROM ratings rt
JOIN JSON_TABLE(rt.doc, '$' COLUMNS(
isbn VARCHAR(20) PATH '$.isbn',
stars INT PATH '$.starts',
comment TEXT PATH '$.comment'
)
) AS r
JOIN books b USING(isbn);
دمج بيانات NoSQL وSQL في استعلام SQL واحد.
كان بإمكاننا استخدام قيمة ISBN ك- ObjectID في MongoDB، وبالتالي كعمود id
في جدول ratings
، لكنني سأترك ذلك لك كتمرين (تلميح: استخدم _id
بدلاً من isbn
عند إدخال البيانات باستخدام عميل MongoDB أو التطبيق).
A Word on Scalability
هناك سوء فهم بأن القواعد العلائقية لا تتوافق على التوسع أفقياً (إضافة المزيد من العقد) بينما تفعل قواعد NoSQL. لكن القواعد العلائقية تتوسع دون التضحية بخصائص ACID. يحتوي MariaDB على محركات تخزين متعددة مصممة لعدة حالات الحمل. على سبيل المثال، يمكنك توسيع قاعدة بيانات MariaDB عن طريق تنفيذ تقسيم البيانات بمساعدة Spider. يمكنك أيضًا استخدام مجموعة متنوعة من محركات التخزين للتعامل مع حالات الحمل المختلفة على أساس لكل جدول. من الممكن إجراء دمج بين محركات التخزين في استعلام SQL واحد.
دمج محركات تخزين متعددة في قاعدة بيانات MariaDB منطقية واحدة.
يوجد بديل أكثر حداثة هو ال SQL الموزع مع MariaDB Xpand. قاعدة بيانات SQL موزعة تظهر كقاعدة بيانات رابطة منطقية واحدة للتطبيقات عبر التجزئة الشفافة. تستخدم هذه البنية التحتية التي لا تشترك في شيء والتي تتسع لكل من القراءة والكتابة.
A distributed SQL database deployment.
الخاتمة
انتهت مهمتنا هنا! الآن، يمكن لأنظمتكم توفير نظرة 360 درجة قابلة للتوسع متوافقة مع ACID لبياناتكم بغض النظر عما إذا كانت أنشأتها تطبيقات SQL أو NoSQL. تقل الحاجة إلى نقل تطبيقاتكم من NoSQL إلى SQL أو جعل تطبيقات SQL تتعامل مع قواعد بيانات متعددة اللغات. إذا كنت ترغب في معرفة المزيد عن الميزات الأخرى في MaxScale، شاهد هذا الفيديو أو زر المستندات.
Source:
https://dzone.com/articles/mixing-sql-and-nosql-with-mariadb-and-mongodb