DBX: محاولة التخلص من تجميع استعلامات MySQL

منذ وقت طويل ، عندما كنت قد بدأت للتو في تعلم PHP وتعقيدات تجميع استعلامات MySQL (2011) ، كان لدي فكرة كتابة مجمّع لـ MySQLi مثل Doctrine لتبسيط بناء جملة الوصول إلى قاعدة البيانات. إنه بالفعل 2019 بالفعل وقررت مشاركة دراجتي على موضوع ORM.

وهكذا ، هذا هو DBX - محرك قاعدة بيانات MySQL لـ PHP استنادًا إلى مكتبة MySQLi استنادًا إلى استعلامات الوصف الهيكلي للجداول وحقول قاعدة البيانات في شكل صفيف منتظم مع وظيفة التخزين المؤقت للاستعلام الثابت والتحديث التلقائي للتجزئة الساكنة.

على عكس الحب العام لشركة PDO ، تم اختيار وظيفة MySQLi خفيفة الوزن ، والتي هي أكثر ليونة وأسهل للبرمجة وتناسبها بشكل أكثر دقة مع واجهة برمجة تطبيقات DBX المقترحة. حتى أنني لم أستخدم الملحن ، لأنني لا أملك أي مشاريع أستخدم فيها تبعيات الجهات الخارجية بخلاف الكتابة الذاتية.

في الواقع ، خذ بعين الاعتبار مثال التصريح بنية قاعدة بيانات اختبار بسيط وجداوله. أولاً ، سنقوم بتوصيل المكتبة نفسها بالفصل وإرسال بيانات التفويض مع مضيف قاعدة البيانات:

require_once './DBX.php'; $dbx_data = ['localhost', 'root', 'root', 'dbx_test', '8889']; 

الآن تخيل أننا بحاجة إلى وصف وإنشاء جدول في قاعدة البيانات باستخدام بناء جملة صفيف PHP منتظم:

 <?php /** * CREATE TABLE EXAMPLE */ $table_1 = 'example'; // table name $query_1 = 'c'; // create table sql $fields_1 = [ 'field_id' => [ 'type' => 'num', // int 'auto' => true, // auto increment 'length' => 255, 'fill' => true // not null ], 'field_text' => [ 'type' => 'text', // varchar 'length' => 255, 'fill' => true ], 'field_date' => [ 'type' => 'time', // TIMESTAMP 'value' => date('Ym-d') ] ]; ?> 

بناء الجملة بسيط هنا. لم أستخدم الكتابة القوية واخترت فقط القيم TEXT و NUMBER و TYMESTAMP. بالطبع ، من أجل بنية جدول "توجيهية" أكثر ، يتم استخدام حقل معرّف رئيسي مع زيادة تلقائية (لم أر حالات في مشاريع حقيقية عند تعيين زيادة تلقائية ويتداخل المفتاح مع تصميم الاستعلامات وعلاقات الجدول). للإشارة إلى ما إذا كان يمكن أن يكون الحقل فارغًا ، يتم تحديد fill => true.

تعد أنواع استعلام DataBaseX بسيطة جدًا وتحتوي على طرق أساسية مثل التحديد والإدراج والحذف والتحديث والإسقاط والاقتطاع وما إلى ذلك.

على سبيل المثال ، استعلام لإنشاء جدول:

 // perform queries $dbx::query("c", $table_1, $fields_1); 

أو قد يبدو استعلام لإضافة بيانات وهيكل عمود كما يلي:

 // fields values for table_1 example $fields_2 = [ 'field_id' => [ 'value' => 456 ], 'field_text' => [ 'value' => 'I have to add into my table' ], 'field_date' => [ 'value' => date('Ym-d') ] ]; // perform queries $dbx::query('i', $table_1, $fields_2); 

تسمح بنية الصفيف ليوم واحد لوصف قاعدة البيانات ثم التعامل مع حقول القيمة فقط لتعديل البيانات المستخدمة في استعلامات النموذج.

فيما يلي مثال لتحديث البيان ، والذي سأقوم بحذفه في المثال التالي:

 // fields values for table_1 example $fields_3 = [ 'field_id' => [ 'value' => 456 ], 'field_text' => [ 'new_value' => 'I was updated', 'criterion_field' => 'field_id', 'criterion_value' => 456 ], 'field_date' => [ 'value' => date('Ym-d') ] ]; // perform queries $dbx::query('u', $table_1, $fields_3); 

يبدو لي أن استخدام حقول standardion_field و standardion_value يعقد النظام ، لذلك قمت بإنشاء استعلام يضيف تلقائيًا البيانات إلى قاعدة البيانات إذا لم يتم إنشاؤه بعد أو يقوم بتحديث البيانات الموجودة. دعوت هذا الاستعلام INJECT QUERY ويطلق عليه البادئة "في":

 // fields values for table_1 example $fields_2 = [ 'field_id' => [ 'value' => 0 ], 'field_text' => [ 'value' => 'Yo if field_id = 0 it\'s an insert or if id exists it\'s an update' ], 'field_date' => [ 'value' => date('Ym-d') ] ]; // perform queries $dbx::query('in', $table_1, $fields_2); 

هذا يعمل على مستوى منخفض مثل هذا:

 INSERT INTO `revolver__comments` (`field_id`, `field_content`) VALUES ('5', 'TEST UPDATE') ON DUPLICATE KEY UPDATE `field_id`='5', `field_content`='TEST UPDATE'; 

جميع الاستعلامات الأخرى هي أبسط وليس من المنطقي وصفها (انظر الأمثلة في ملف اختبار index.php) ، لكن لا يسعني إلا أن أظهر كيف يعمل استعلام SELECT:

 <?php // perform queries $dbx::query('s|field_id|asc|100|0', $table_1, $fields_1); ?> <?php // print structure print '<h2>DBX STRUCTURE</h2>'; print '<pre><code>'; print_r( $fields_1 ); print '</code></pre>'; // print result print '<h2>DBX QUERY RESULT</h2>'; print '<pre><code>'; print_r( $dbx::$result ); print '</code><pre><hr />'; ?> 

هنا ، باستخدام البادئة "s" ، يمكنك تجميع معلمات الاستعلام s | field_id ( ترتيب ) | asc ( direction ) | 100 ( حد ) | 0 ( إزاحة ) .

من بين أمور أخرى ، DBX لديه ميزة مميزة مثل ذاكرة التخزين المؤقت للملفات المضمنة على أساس احصائيات JSON. كل طلب تغيير (INSERT ، UPDATE ، DELETE ، TRUNCATE) يؤدي إلى حساب التجزئة في جدول تجزئة ذاكرة التخزين المؤقت وتحديث ذاكرة التخزين المؤقت الثابتة تلقائيًا ، مما يسمح لك بعدم التفكير في التحميل على استعلامات SELECT.

في المستقبل ، أخطط لتطوير محرك DBX وتوسيع قدرات مصمم استعلام SQL باستخدام نظام التكوين UNION و JOIN ، بالإضافة إلى إضافة دعم قاعدة بيانات جديد من MySQL 8 بناءً على نوع هيكل JSON.

الآن يتم استخدام DBX في نظام إدارة محتوى RevolveR الخاص بي ويظهر خصائص جيدة (يتم تهيئة الموقع بالكامل ، شريطة أن يكون هناك ذاكرة تخزين مؤقت محدثة ، مع استعلام واحد لقاعدة البيانات ويستهلك حوالي 0.7 ميغابايت من ذاكرة الوصول العشوائي للمترجم). كما أنه مناسب جدًا بالنسبة لي لرؤية بنية قاعدة البيانات بالكامل في ملف منفصل واحد ، مما يسرع أحيانًا من بناء وتصميم وحدات جديدة.

مستودع المشروع: DBX v1.1.1 على جيثب .

Source: https://habr.com/ru/post/ar438762/


All Articles