تسلسل قاعدة البيانات المستوى

مرحبا يا هبر!


جلست مرة واحدة وحاولت إعطاء شركة JSON الأمامية عقارات ، والتي كان لديها الكثير من التبعيات. كانت Symfony 4 ، ترقيم الصفحات knp و JMSSerializer في الخلف ، حسناً ، من حيث المبدأ ، أشياء قياسية ، ولكن المشكلة هي أنه عندما تحاول إعطاء كائن مع جميع الكيانات والمجموعات المتداخلة ، يبدأ كل شيء في التباطؤ عند مستوى التسلسل لهذه البيانات.


تحتاج أولاً إلى تقديم طلب إلى قاعدة البيانات ، ثم يقوم المُسلسل بسحب كل شيء تدريجيًا ، ثم سيتم لفه جميعًا في JSON وعندها فقط سيعود كل شيء إلى المقدمة.


فكرة


كان لدي فكرة ، لماذا لا تُرجع JSON مباشرة من قاعدة البيانات مباشرة إلى المقدمة من الخلف ، نعم ، تحتاج إلى كتابة SQL رائعة ، ولكن يمكنك إنشاء أداة تقوم بذلك نيابة عنك. لقد بدأت في كتابة فكرة ، وهي مستودع على جيثب ، بناءً على نموذج بيانات من العقيدة ، اتصالات OneToOne ، ManyToOne ، OneToMany و ManyToMany. أيضًا ، يمكن فك هذه الأداة بسهولة إلى Symfony 4 وستقوم بتكوين نفسها ، ونتيجة لذلك ، ستحتاج فقط إلى حقن مصنع QueryBuilderFactory والحصول من هناك على QueryBuilder للجدول المرغوب حسب فئة الكيان.


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


مثال إنشاء SQL


<?php use \Mash\MysqlJsonSerializer\QueryBuilder\Table\JoinStrategy\FieldStrategy; use \Mash\MysqlJsonSerializer\Wrapper\FieldWrapper; use \Mash\MysqlJsonSerializer\QueryBuilder\Table\Table; use \Mash\MysqlJsonSerializer\Wrapper\Mapping; use \Mash\MysqlJsonSerializer\QueryBuilder\QueryBuilder; $oneToManyTable = (new Table('advert_group', 'adg', 'adg_id')) ->addSimpleField('adg_id') ->addSimpleField('adg_name') ; $table = (new Table('estate', 'est', 'est_id')) ->addSimpleField('est_id') ->addSimpleField('est_name') ->addOneToManyField($oneToManyTable, 'advert_groups', new FieldStrategy('adg_estate')); $mapping = new Mapping(); $mapping ->addMap($table, 'est_id', 'id') ->addMap($table, 'est_name', 'name') ->addMap($oneToManyTable, 'adg_id', 'id') ->addMap($oneToManyTable, 'adg_name', 'name'); $builder = new QueryBuilder($table, new FieldWrapper($mapping)); $builder ->setOffset(2) ->setLimit(1); $sql = $builder->jsonArray(); 

نتيجة لذلك ، سيتم إنشاء SQL التالي:


 SELECT JSON_ARRAYAGG(JSON_OBJECT('id',est_res.est_id,'name',est_res.est_name,'advert_groups',(SELECT JSON_ARRAYAGG(JSON_OBJECT('id',adg.adg_id,'name',adg.adg_name)) FROM advert_group adg INNER JOIN estate est_2 ON est_2.est_id = adg.adg_estate WHERE est_2.est_id = est_res.est_id))) FROM (SELECT * FROM estate est LIMIT 1 OFFSET 2) est_res 

النتيجة:


 [{"id": 3, "name": ",  , 31", "advert_groups": [{"id": 10, "name": "avito-1115362430"}]}] 

ملخص


سيتم قريباً إضافة الإرشادات الكاملة للاستخدام إلى مستودع جيثب. كنتيجة لذلك ، عندما قمت بالبحث عن هذا في مشروعي ، تلقيت إجابات سريعة جدًا من واجهة برمجة تطبيقات REST وفي نفس الوقت تمكنت من إرجاع الكثير من الكائنات مع الكثير من التبعيات المتداخلة ، على سبيل المثال ، ما أردت الحصول عليه من خلال JMSSerializer التي حصلت عليها لمدة 40 ثانية ، الآن 230 مللي ثانية ، وهذا شريطة أن يقرأ Kernel Subscribber التعليقات التوضيحية على حقول الكيان من خلال الانعكاس ، أريد تنفيذ ذلك قريبًا من خلال ذاكرة التخزين المؤقت Symfony.


سيتم استكمال المقال ...


الجزء الثاني

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


All Articles