إجراء عملية التهجير وإنشاء علاقة متعدد-إلى-متعدد بين الجداول باستخدام Sequelize
تعد مكتبة Sequelize من الأدوات الأساسية في تطوير تطبيقات Node.js التي تعتمد على قواعد بيانات SQL، حيث توفر واجهة مريحة للتفاعل مع قواعد البيانات عن طريق استخدام الجافاسكربت بدلاً من الكتابة المباشرة للاستعلامات SQL. وهي توفر إمكانيات قوية لإنشاء العلاقات بين الجداول في قاعدة البيانات، بما في ذلك العلاقة متعدد-إلى-متعدد (Many-to-Many) التي تستخدم في حالات معينة حيث يمكن أن يتواجد سجل واحد في جدول مرتبط بعدد غير محدد من السجلات في جدول آخر والعكس.
في هذا المقال، سنتناول كيفية إنشاء علاقات متعدد-إلى-متعدد بين الجداول باستخدام Sequelize، وكيفية إدارة عملية التهجير لتكوين هذه العلاقات بشكل صحيح.
الفهم الأساسي للعلاقة متعدد-إلى-متعدد
قبل التطرق إلى كيفية إنشاء علاقة متعدد-إلى-متعدد باستخدام Sequelize، من المهم فهم طبيعة هذه العلاقة. في هذه العلاقة، يكون لكل سجل في جدول A إمكانية الربط بعدد غير محدود من السجلات في جدول B، وكذلك يمكن لكل سجل في جدول B أن يرتبط بعدد غير محدود من السجلات في جدول A. على سبيل المثال، إذا كان لدينا جدول للطلاب (students) وجدول آخر للدورات الدراسية (courses)، فإن كل طالب قد يسجل في العديد من الدورات الدراسية، وكل دورة قد تضم العديد من الطلاب.
إذن، في قاعدة البيانات العلائقية، يجب أن يتم تمثيل هذه العلاقة عبر جدول وسيط أو جدول ربط (junction table)، حيث يتم تخزين العلاقات بين السجلات في كلا الجدولين.
إعداد Sequelize وتوصيله بقاعدة البيانات
قبل البدء في إنشاء العلاقات بين الجداول، من الضروري أولاً إعداد Sequelize وربطه بقاعدة البيانات. يمكن تحقيق ذلك كما يلي:
-
تثبيت Sequelize مع الحزم المطلوبة:
bashnpm install sequelize pg pg-hstore -
إعداد الاتصال بقاعدة البيانات:
javascriptconst { Sequelize, DataTypes } = require('sequelize'); // إنشاء اتصال بقاعدة بيانات PostgreSQL const sequelize = new Sequelize('postgres://user:password@localhost:5432/database', { dialect: 'postgres', });
إنشاء الجداول الأساسية
قبل إنشاء العلاقة متعدد-إلى-متعدد، نحتاج إلى إنشاء الجداول الأساسية. على سبيل المثال، إذا كنت تعمل مع جداول للطلاب والدورات الدراسية، يمكنك تعريفها كما يلي:
javascriptconst Student = sequelize.define('Student', {
name: {
type: DataTypes.STRING,
allowNull: false
}
});
const Course = sequelize.define('Course', {
title: {
type: DataTypes.STRING,
allowNull: false
}
});
إنشاء العلاقة متعدد-إلى-متعدد
لإنشاء علاقة متعدد-إلى-متعدد بين الجداول، نحتاج إلى استخدام جدول ربط. في Sequelize، يتم ذلك عبر استدعاء الدالة belongsToMany على كل من الجداول المتصلة. لكن قبل القيام بذلك، يجب تحديد جدول الربط الذي سيحتوي على المفاتيح الأجنبية (foreign keys) التي تشير إلى الجداول المرتبطة.
لنفرض أننا نريد إنشاء علاقة بين الطلاب والدورات الدراسية. يمكننا تحديد العلاقة كالتالي:
javascript// إنشاء العلاقة متعدد-إلى-متعدد بين الطلاب والدورات الدراسية
Student.belongsToMany(Course, { through: 'StudentCourses' });
Course.belongsToMany(Student, { through: 'StudentCourses' });
في الكود السابق، StudentCourses هو اسم جدول الربط الذي يحتوي على المفاتيح الأجنبية لكل من Student و Course. جدول الربط هذا سيتم إنشاؤه تلقائيًا عندما نقوم بتشغيل التهجير.
إعداد التهجير (Migration)
التهجير في Sequelize يشير إلى العملية التي يتم من خلالها تحديث قاعدة البيانات بناءً على التعديلات التي تطرأ على هيكل الجداول (أي إضافة جداول جديدة أو تعديل جداول موجودة). لإنشاء التهجير لعلاقة متعدد-إلى-متعدد بين الجداول، يجب أولاً إنشاء ملفات التهجير باستخدام أداة Sequelize CLI.
-
أولاً، تأكد من أنك قمت بتثبيت أداة CLI الخاصة بـ Sequelize:
bashnpm install --save-dev sequelize-cli -
ثم، قم بتهيئة Sequelize CLI باستخدام الأمر:
bashnpx sequelize-cli init -
بعد ذلك، يمكننا إنشاء ملف التهجير للجداول:
bashnpx sequelize-cli model:generate --name Student --attributes name:string npx sequelize-cli model:generate --name Course --attributes title:string -
بعد إنشاء النماذج، سنحتاج إلى إضافة العلاقات بين الجداول في ملف التهجير. في هذا المثال، يمكنك تعديل ملف التهجير الذي تم إنشاؤه ليشمل العلاقة بين الطلاب والدورات الدراسية.
على سبيل المثال، في ملف
create-student-course.jsداخل مجلد التهجير، يمكنك كتابة الكود التالي:javascriptmodule.exports = { up: async (queryInterface, Sequelize) => { await queryInterface.createTable('StudentCourses', { studentId: { type: Sequelize.INTEGER, references: { model: 'Students', key: 'id' }, onDelete: 'CASCADE' }, courseId: { type: Sequelize.INTEGER, references: { model: 'Courses', key: 'id' }, onDelete: 'CASCADE' } }); }, down: async (queryInterface, Sequelize) => { await queryInterface.dropTable('StudentCourses'); } }; -
بعد ذلك، يمكنك تنفيذ التهجير:
bashnpx sequelize-cli db:migrate
إضافة البيانات إلى الجداول
بعد إنشاء العلاقة بين الجداول، يمكننا إضافة بيانات إلى الجداول باستخدام Sequelize. على سبيل المثال، يمكننا إضافة بيانات للطلاب والدورات الدراسية، ثم ربط الطلاب بالدورات الدراسية عبر جدول الربط:
javascriptasync function createData() {
// إنشاء بعض الطلاب
const student1 = await Student.create({ name: 'John Doe' });
const student2 = await Student.create({ name: 'Jane Doe' });
// إنشاء بعض الدورات الدراسية
const course1 = await Course.create({ title: 'Math 101' });
const course2 = await Course.create({ title: 'History 101' });
// ربط الطلاب بالدورات الدراسية
await student1.addCourses([course1, course2]);
await student2.addCourse(course1);
}
createData();
استرجاع البيانات
لاسترجاع البيانات من الجداول التي تحتوي على علاقة متعدد-إلى-متعدد، يمكننا استخدام الدوال المدمجة في Sequelize مثل getCourses لجلب الدورات الدراسية المرتبطة بكل طالب.
javascriptasync function getStudentCourses() {
const student = await Student.findOne({ where: { name: 'John Doe' } });
const courses = await student.getCourses();
console.log(courses);
}
getStudentCourses();
استنتاج
إجراء عملية التهجير وإنشاء علاقة متعدد-إلى-متعدد بين الجداول باستخدام Sequelize يتطلب بعض الخطوات الأساسية لفهم كيفية إنشاء النماذج، تعريف العلاقات، ثم إنشاء الجداول باستخدام التهجير. تعتبر Sequelize أداة قوية لتطوير تطبيقات Node.js التي تعتمد على قواعد البيانات العلائقية، ويوفر طريقة مريحة وآمنة للتفاعل مع قاعدة البيانات عن طريق JavaScript.
لقد تم عرض كيفية إنشاء علاقة متعدد-إلى-متعدد بين الجداول باستخدام Sequelize، بدءًا من إنشاء النماذج، وإنشاء الجداول عبر التهجير، وصولاً إلى كيفية إضافة البيانات واسترجاعها.

