إتقان علاقات Prisma و SQL

تجعل Prisma العمل مع قواعد البيانات بسيطاً إذا فهمت كيفية تعاملها مع الاتصالات. إليك دليل حول المخططات (schemas)، والعلاقات (relations)، والاستعلامات (queries).

المخطط والعلاقات

تحدد العلاقات كيفية اتصال بياناتك.

  • واحد إلى متعدد (One-to-Many): مستخدم واحد لديه العديد من المنشورات. يحتوي نموذج Post على المفتاح الأجنبي (authorId)، بينما يحتوي نموذج User على مرجع فقط.
  • متعدد إلى متعدد (Many-to-Many): ينتمي مستخدم واحد إلى العديد من المشاريع، ويحتوي المشروع الواحد على العديد من المستخدمين. ستحتاج إلى جدول وصل (ProjectMember) ليكون في المنتصف. يحتوي هذا الجدول على مفاتيح أجنبية لكلا الجانبين.
  • العلاقات الذاتية (Self-Relations): يتابع مستخدم مستخدماً آخر. تستخدم علاقات مسماة مثل "Follower" و "Following" لكي تعرف Prisma أي جانب هو أي منهما.

طرق الاستعلام الأساسية

  • findUnique: استخدم هذا للسجلات التي تحتوي على حقل @id أو @unique. يعيد null إذا لم يتم العثور على شيء.
  • findMany: استخدم هذا للحصول على قائمة. يمكنك التصفية، والفرز، والتقسيم إلى صفحات (pagination).
  • findFirst: استخدم هذا عندما تحتاج إلى سجل واحد ولكن عامل التصفية ليس حقلاً فريداً.

التصفية باستخدام where

تترجم جملة "where" مباشرة إلى SQL.

  • المقارنة: استخدم gt (أكبر من)، أو lt (أصغر من)، أو gte (أكبر من أو يساوي).
  • البحث النصي: استخدم "contains" مع "mode: insensitive" لإجراء عمليات بحث غير حساسة لحالة الأحرف.
  • المعاملات المنطقية: استخدم OR أو AND أو NOT لدمج الشروط.
  • فلاتر العلاقات: استخدم "some" أو "every" أو "none" للتصفية بناءً على البيانات المتصلة. تجد "some" السجلات التي يتطابق فيها علاقة واحدة على الأقل.

التحكم في البيانات: select مقابل include

  • select: اختر بالضبط الحقول التي تريد إرجاعها. هذا يحافظ على خفة بياناتك وأمانها.
  • include: دمج البيانات ذات الصلة في نتيجتك. هذا يجلب الكائنات المتداخلة (nested objects).
  • ملاحظة: لا يمكنك استخدام select و include في نفس المستوى. يجب عليك اختيار أحدهما. ومع ذلك، يمكنك استخدام select داخل include لاختيار حقول محددة من علاقة مدمجة.

العمليات والأمان

  • createMany: إنشاء العديد من الصفوف دفعة واحدة. هي سريعة ولكنها لا تدعم الكتابة المتداخلة (nested writes).
  • upsert: تحديث السجل إذا كان موجوداً أو إنشاؤه إذا لم يكن موجوداً. هذا رائع لعربات التسوق.
  • update: استخدم العمليات الذرية (atomic operations) مثل increment أو decrement لتغيير الأرقام دون أخطاء.
  • $transaction: تجميع عمليات كتابة متعددة معاً. إذا فشل جزء واحد، يتم التراجع عن المجموعة بأكملها. هذا يمنع أخطاء البيانات الجزئية.

تقسيم الصفحات

اجمع بين "take" و "skip" لإنشاء الصفحات.

  • take: عدد السجلات التي سيتم عرضها.
  • skip: عدد السجلات التي سيتم تخطيها.

المصدر: https://dev.to/chinwuba_jeffrey/understanding-prisma-and-sql-relationships-schema-and-querying-l7k