스크립트
00:00:00يبدو أن جميع أولئك المطورين الذين يقولون استخدموا بوستغريس لكل شيء هم على حق
00:00:04بشكل أكبر مع الإصدار القادم من بوستغريس 19 والذي يتضمن دعماً مدمجاً لاستعلامات الرسم البياني
00:00:10وهذه ميزة رائعة حقاً. لذا في فيديو اليوم أود تغطية جميع الميزات الرئيسية
00:00:16لبوستغريس 19 وأيضاً إلقاء نظرة أعمق على استعلامات الرسم البياني تحديداً لأني أعتقد أنها
00:00:21يمكن أن تغير بشكل جذري الطريقة التي نصمم بها استعلاماتنا ونستخدم بها بوستغريس.
00:00:30لذا أول ميزة هي شيء يسمى “عند التعارض قم بالبحث” (on conflict do select). إذا كنت تريد إدراج صف فقط إذا كان
00:00:35غير موجود بالفعل وفي كلتا الحالتين تريد إرجاع هذا الصف كنتيجة فستحتاج عادةً إلى
00:00:40استعلامين لهذا: عملية إدراج وعملية بحث، وهذا سير عمل شائع حقاً. لذا هنا في المثال
00:00:45نقول إننا سنقوم بالإدراج في جدول المستخدمين البريد الإلكتروني والاسم ومن ثم نعطي تلك القيم وبعد ذلك في
00:00:50النهاية نقول عند التعارض للبريد الإلكتروني لا تفعل شيئاً مع إرجاع الكل (returning star). عبارة لا تفعل شيئاً لا تعيد لك شيئاً عندما يكون الصف
00:00:56موجوداً بالفعل لذا تتبعها بعملية بحث ولكن معاً هذا ليس تنفيذًا ذرياً (atomic). مع الإصدار 19 يمكنك القيام بذلك
00:01:03باستعلام واحد فقط. إدراج في المستخدمين مع إعطاء البريد الإلكتروني والاسم وبعد ذلك نقول عند التعارض للبريد الإلكتروني قم بالبحث
00:01:11مع إرجاع الكل. وإذا كنت تريد التعديل في نفس الاستعلام يمكننا القول إدراج في جدول المستخدمين ومن ثم نعطي
00:01:16القيم مرة أخرى عند التعارض للبريد الإلكتروني قم بالبحث للتحديث مع إرجاع المعرف والاسم. ولأنه عبارة عن تعليمة
00:01:23واحدة فهي ذرية، فإما أن تقوم بإدراجها أو تبحث عنها في كل مرة، وهذه حالة استخدام شائعة جداً
00:01:29وستكون مفيدة حقاً. لذا التالي هو الرسوم البيانية، ولكن إذا كنت تستمتع بهذا فلماذا لا
00:01:34تشترك في بيتر ستاك (Better Stack) لتبقى على اطلاع بأحدث التقنيات. الآن كما قلت من قبل هذه
00:01:39هي الميزة الرئيسية في رأيي. لذا لنفترض أن لديك المخطط المعتاد لمتجر ما، لديك عملاء
00:01:44وطلبات ومركبات إضافة إلى جدولين ربط يربطانهم ببعضهم البعض، وتريد معرفة أي
00:01:50منتج اشتراه عميل معين بالفعل. في لغة SQL عبارة عن سلسلة من عمليات الانضمام عبر الجداول الخمسة كلها وذلك
00:01:56يبدو قابلاً للإدارة هنا ولكنه يصبح قبيحاً جداً بسرعة مع العلاقات الأكثر تعقيداً. حسناً الآن يمكننا
00:02:02الاستعلام عن كل هذا كرسوم بيانية بحيث تصبح بنية الانضمام المعقدة تلك بنية رسم بياني جديدة بدلاً من ذلك. ومع
00:02:08عمليات الانضمام المعقدة على وجه الخصوص سترى فائدة كبيرة حقاً هنا. لذا نحن داخل عارض قاعدة البيانات
00:02:14الخاص بنا هنا ويمكنك أن ترى أن لدينا كل جداولنا، لدينا منتجات، طلبات، أحداث، ولدينا
00:02:20عملاء أيضاً وبعد ذلك لدينا جداول الربط لربط كل هذه البيانات. لذا لدينا عناصر الطلبات
00:02:25وطلبات العملاء، والآن دعونا نحاول تشغيل استعلام ضد كل هذه الجداول. لذا على سبيل المثال
00:02:30لدي هذا المستخدم هنا يدعى أليس، وأريد معرفة جميع الأشياء التي طلبتها أليس. للقيام
00:02:35بذلك سيتعين علي مرروراً عبر مجموعة من استعلامات الانضمام المختلفة لربط كل تلك الجداول معاً. لذا سأشغل هذا
00:02:41الاستعلام الذي يحتوي على أربع تعبيرات انضمام منفصلة بداخله، وبينما هذا ليس بالضرورة صعباً
00:02:46الكتابة إلا أنه قبيح جداً، ولكن إذا قمنا بتشغيل هذا يمكنك أن ترى أننا نستطيع رؤية كل الأشياء التي طلبتها أليس:
00:02:51لوحة المفاتيح الميكانيكية والفأرة المريحة، ولكن الآن يمكننا استخدام بنية الرسم البياني لتبسيط هذا
00:02:57بشكل هائل. لذا سنقوم باستبدال كل هذا ببنية الرسم البياني الجديدة وسنفعل ذلك مرة أخرى وسترى
00:03:03أننا نحصل على نفس النتائج وإذا قمنا بترتيب كل هذا فيبدأ يصبح أسهل للقراءة بحيث يمكنك أن ترى
00:03:07أننا ننتقل فقط من العملاء إلى طلبات العملاء إلى الطلبات إلى عناصر الطلبات إلى المنتجات. لذا يمكنك
00:03:13ببساطة اتباع هذا التدفق البسيط لتجاوز الرسم البياني بأكمله والذي في رأيي هو أسهل بكثير
00:03:19في القراءة. إذا كنت تريد تحديد أعمدة متعددة أيضاً يمكننا فعل ذلك، لدينا نفس
00:03:23استعلام الرسم البياني في الأعلى هنا ولكن بعد ذلك يمكننا تحديد الأعمدة في الأسفل ومن ثم نختار كل
00:03:27الأعمدة التي نريد عرضها وعند تنفيذ ذلك نحصل على النتائج في الأسفل. الآن لا شيء من هذا
00:03:32سيعمل ما لم نكن قد أنشأنا الرسم البياني في المقام الأول، لذا الاستعلام الذي استخدمته
00:03:37لتوليد هذا الرسم البياني موجود هنا، نقول إنشاء رسم بياني للخصائص ونعطيه اسم متجري وبعد ذلك
00:03:42نحدد جداول العقد (vertices) والتي ستكون العملاء والطلبات والمنتجات، هذه هي
00:03:47الأشياء التي تحتفظ بالبيانات بالفعل وبعد ذلك لدينا جداول الحواف (edges) وهذه هي الأشياء التي
00:03:52تقوم بإجراء الاتصالات بالفعل أي جداول الربط في حالتنا ستكون طلبات العملاء وعناصر
00:03:57الطلبات، وبنية هذا بسيطة للغاية، نقول لطلبات العملاء المصدر هو العملاء و
00:04:02الوجهة هي الطلبات وبالنسبة لعناصر الطلبات المصدر هو الطلبات والوجهة هي المنتجات ومع
00:04:08توفر ذلك، سيكون بوستغريس الآن على دراية في كل مرة نقوم فيها بتشغيل استعلام رسم بياني بكيفية تحديد
00:04:14تلك العلاقات. لكي يعمل هذا تحتاج إلى إنشاء رسم بياني ولكن هذا لا ينشئ جداول جديدة أو أي شيء
00:04:19بل تشير فقط إلى الجداول الخمسة التي لديك بالفعل، الثلاثة التي تحتفظ بالبيانات تصبح
00:04:23عقداً وجدولا الانضمام يصبحان حوافاً، وهو يعمل بشكل أشبه بالعرض (view) بحيث يبقى مخططك السابق
00:04:29دون تغيير تماماً بل تحصل على هذه الوظيفة الإضافية في الأعلى، لذا هنا سنقوم
00:04:35بالقول إنشاء رسم بياني للخصائص سنسميه متجري وبعد ذلك نبدأ في وصف كيف تعمل تلك العلاقة
00:04:40بالفعل وهذا هو المكان الذي نقوم فيه بكل العمل للرسم البياني وهو ما يعني أن الاستعلامات
00:04:45يمكن أن تكون أنحف بكثير من بنية الانضمام الخاصة بها، إذن هل هذا بديل لقاعدة نيو4ج (Neo4j)؟ حسناً إذا كنت تريد قاعدة بيانات
00:04:52رسم بياني لأنك بحاجة إلى تخزين رسوم بيانية وأداء اجتياز فلا، وقاعدة بيانات الرسوم البيانية
00:04:58المخصصة لا تزال على الأرجح الخيار الأفضل، ولكن إذا كنت تريد هذا لأن كتابة انضمامات من 10 جداول في
00:05:03SQL أمر مؤلم وقبيح فسوف يفيدك بالتأكيد وسيكون أجمل بكثير
00:05:09 بالمقارنة. الميزة الجديدة الثالثة هي إعادة الحزم (repack) وهذه تتعلق استعادة مساحة القرص. بوستغريس
00:05:15لا يقوم أبداً بتحديث صف في مكانه بل يكتب نسخة جديدة ويترك القديمة وراءه والتفريغ (vacuum) فقط
00:05:21يميز تلك المساحة الميتة على أنها قابلة لإعادة الاستخدام لذا فإن استخدام القرص الخاص بك لا ينخفض فعلياً أبداً. إعادة الحزم تعيد كتابة الجدول بأكمله
00:05:27إلى ملف جديد بدون أي مساحة مهدرة فيه وهذا هو ما يعيد المساحة إلى
00:05:33نظام التشغيل. يمكنك في الواقع القيام بذلك بالفعل باستخدام تفريغ كامل (vacuum full) ولكن ذلك يقفل الجدول
00:05:38طوال عملية إعادة الكتابة لذا بالنسبة لأي شيء ضخم لا تقوم بتشغيله أبداً، وهذا هو سبب قيام الناس بتثبيت
00:05:42امتدادات مثل بي جي ريباك (pg_repack) ولكن الآن نحصل عليها مدمجة في بوستغريس مباشرة. استخدم كلمة مفتاحية بالتزامن (concurrently) مع
00:05:49هذا وهي تحافظ على الجدول قابلاً للقراءة والكتابة بينما تعمل إعادة الحزم. شيء واحد يجب الانتباه إليه هنا رغم ذلك
00:05:54تحتاج إلى مساحة قرص فارغة كافية لنسخة ثانية من الجدول وجميع فهارسه لذا تحتاج إلى
00:06:00مساحة احتياطية لاستعادة المزيد من المساحة بالفعل، لذا هذا ليس بديلًا دقيقًا لـ pg_repack ولكن بالنسبة
00:06:06لجدول عادي فهو يؤدي المهمة بدون الامتداد. حسناً الآن سنقوم بجولة سريعة
00:06:11للميزات المتبقية في إصدار 19. أولاً هو تلميحات الاستعلام (query hints)، يقرر بوستغريس كيفية تشغيل
00:06:17استعلامك ويمكنه تغيير رأيه بمرور الوقت لذا فإن الاستعلام الذي كان جيداً لمدة عام يصبح فجأة بطيئاً
00:06:22ولم يتغير أي شيء في كودك. وحدة جديدة تسمى نصائح خطة بي جي (pg_plan_advice) تتيح لك التقاط الخطة بينما لا تزال
00:06:28سريعة وتثبيتها لتبقى هكذا دائماً. الترجمة الفورية (JIT) أصبحت الآن متوقفة افتراضياً، يقوم بوستغريس بتجميع الاستعلامات الثقيلة
00:06:36إلى كود الآلة ولكنه يقرر متى يكلف نفسه عناء ذلك من تقدير تكلفة المخطط وملاحظات الإصدار
00:06:41تقول إن تقدير التكلفة هذا لم يكن موثوقاً به في الواقع لذا كان يعمل على الاستعلامات التي لم تكن
00:06:46بحاجة إليها حقاً. أيضاً يمكن للتفريغ (vacuum) الآن تنظيف فهارسك باستخدام عدة عمال بالتوازي لذا هذا وقت أقل
00:06:52يتم قضاؤه في تفريغ جدول كبير، يجب عليك تشغيل هذا بنفسك رغم ذلك. هل تعلم عندما تضيف عموداً
00:06:58للقيام بعملية بحث ومن ثم يتعين عليك إضافة نفس العمود إلى التجميع (group by) أيضاً؟ إنه يفعل كل ذلك من أجلك
00:07:03وكلمة نسخ (copy) الرئيسية يمكنها الآن التصدير مباشرة إلى JSON، لذا إذا كنت تقوم بتفريغ ملفات CSV وتحويلها
00:07:09بعد ذلك فيمكنك التوقف عن فعل ذلك، إذن هذا هو بوستغريس 19 بيتا 2 الذي وصل في يوليو والإصدار النهائي
00:07:15متوقع حول سبتمبر أو أكتوبر لذا إذا كنت تشغل أي شيء أقدم فهو يستحق جلب الإصدار التجريبي
00:07:21والاختبار ضده الآن وإذا كنت تريد رؤية المزيد عن بوستغريس يمكنك في الواقع التحقق من
00:07:25تحليل لـ بي جي ديرابل (pg_durable) فهو يضع سير عمل متين مباشرة داخل بوستغريس. لقد كنت وارن من
00:07:31بيتر ستاك شكراً للمشاهدة وأراك في الفيديو القادم