डेटाबेस लेवल सीरियलाइजेशन

नमस्कार, हेब्र!


मैं एक बार बैठ गया और सामने वाले JSON को अचल संपत्ति के साथ देने की कोशिश की, जिसमें बहुत अधिक निर्भरता थी। सिम्फनी 4, knp पेजिनेशन और JMSSerializer सिद्धांत, मानक चीजों में अच्छी तरह से पीठ पर खड़ा था, लेकिन समस्या यह है कि जब आप सभी नेस्टेड संस्थाओं और संग्रह के साथ एक वस्तु देने की कोशिश करते हैं, तो इस डेटा के क्रमबद्धता स्तर पर सब कुछ धीमा होने लगता है।


पहले आपको डेटाबेस के लिए एक अनुरोध करने की आवश्यकता है, फिर क्रमिक धीरे-धीरे बाकी सब कुछ खींच लेगा, फिर यह सब JSON में लपेटा जाएगा और उसके बाद ही सब कुछ सामने आएगा।


विचार


मेरे पास एक विचार था, क्यों न JSON को डेटाबेस से सीधे सामने से सीधे पीछे से लौटा दिया जाए, हां, आपको भयानक SQL लिखने की आवश्यकता है, लेकिन आप एक उपकरण बना सकते हैं जो आपके लिए ऐसा करता है। मैंने एक विचार लिखने के बारे में सेट किया है, सिद्धांत पर एक मॉडल पर एक रिपॉजिटरी , सिद्धांत, OneToOne, ManyToOne, OneToMany और ManyToMany संचार से डेटा मॉडल के आधार पर। इसके अलावा, इस उपकरण को आसानी से सिम्फनी 4 से खराब किया जा सकता है और यह खुद को कॉन्फ़िगर करेगा, परिणामस्वरूप, आपको केवल क्वेरीब्यूरीफैक्ट्री कारखाने को इंजेक्ट करने की आवश्यकता है और इकाई वर्ग द्वारा वांछित तालिका के लिए वहां से क्वेरीरीबर्ल प्राप्त करना होगा।


मेरा धारावाहिक भी क्रमांकन समूहों का उपयोग करता है जिन्हें आप इकाई क्षेत्र पर एक्सपोज़ एनोटेशन का उपयोग करके सेट कर सकते हैं, तालिका एनोटेशन को इकाई में संलग्न करना और तालिका उपनाम को निर्दिष्ट करना न भूलें, आमतौर पर आपके द्वारा निर्दिष्ट लोगों का उपयोग करना बेहतर होता है।


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 API से बहुत ही त्वरित उत्तर मिले और साथ ही साथ मैं बहुत से वस्तुओं को बहुत अधिक नेस्टेड निर्भरता के साथ वापस करने में सक्षम था, उदाहरण के लिए, मैं जो कुछ भी JSSerializer के माध्यम से प्राप्त करना चाहता था, मुझे 40 सेकंड के लिए मिला, अब के लिए 230 मिलीसेकंड, और यह प्रदान करता है कि कर्नेल सब्सक्राइबर प्रतिबिंब के माध्यम से इकाई क्षेत्रों पर एनोटेशन पढ़ता है, मैं इसे कैश सिम्फनी के माध्यम से जल्द ही लागू करना चाहता हूं।


लेख को पूरक बनाया जाएगा ...


दूसरा भाग

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


All Articles