'ईवी_' तालिकाओं का उद्देश्य


19

मैंने हमेशा सोचा है कि तालिकाओं का अर्थ क्या है:

eav_entity  
eav_entity_datetime
eav_entity_decimal
eav_entity_int
eav_entity_store
eav_entity_text

वे हमेशा खाली रहते हैं। उन्हें 1.6 से पहले के संस्करणों में बनाया गया है app/code/core/Mage/Eav/sql/eav_setup/mysql4-install-0.7.0.phpऔर बाद में उन्होंने संस्करणों 1.6 + के लिए स्क्रिप्ट स्थापित करने के लिए किया। /app/code/core/Mage/Eav/sql/eav_setup/install-1.6.0.0.php
मैंने देखा कि तालिकाओं में से एक से जुड़ा एक संसाधन मॉडल है Mage_Eav_Model_Resource_Entity_Store(शायद अन्य हैं) लेकिन इसके साथ कुछ भी नहीं होता है।

क्या इन तालिकाओं का कोई उपयोग है या यह एक अन्य "फीचर" है जिसे शुरू किया गया था और उदाहरण के लिए लेआउट संस्करण या व्यवस्थापक ब्रेडक्रंब की तरह लागू नहीं किया गया था ।


3
जब मैंने मैगेंटो और विशेष रूप से ईएवी सीखना शुरू किया, तो मैं देखता हूं कि ये टेबल हमेशा खाली हैं। मैंने ऑनलाइन खोज करने की कोशिश की लेकिन कभी भी कोई निर्दिष्ट उत्तर नहीं मिला। मैंने सोचा था कि यह अन्य इकाई तालिकाओं के लिए एक परिभाषा या संदर्भ तालिका हो सकती है। लेकिन अब मुझे भी जवाब का बेसब्री से इंतजार है। इस सवाल के लिए धन्यवाद। :)
MagentoBoy

@MagentoBoy। मैंने तब भी देखा जब मैंने Magento के साथ काम करना शुरू किया, जबकि मैं डेटाबेस के चारों ओर अपना सिर लपेटने की कोशिश कर रहा था। 5 साल हो गए हैं और मैं अभी भी हैरान हूं।
मेरियस

.. लेकिन आप लोग वास्तव में Magento पर अच्छे कौशल रखने वाले हैं .. कभी-कभी, मैं सीखने के लिए और मेरे कोड में भी आपके संदर्भों का उपयोग करता हूं .. इसके बारे में Magento के लिए लगभग 7 से 8 महीने और php अनुभव के लिए 11 महीने हैं लेकिन फिर भी मुझे ऐसा लगता है Magento के लिए एक शुरुआत है और बहुत कुछ सीखने की जरूरत है ..
MagentoBoy

जवाबों:


17

मेरा अनुमान है कि यह डेवलपर्स और "जेनेरिक" संस्थाओं / मॉडल को लागू करने के लिए डेवलपर्स के लिए एक विरासत और "सुविधा" पैटर्न है।

जैसा कि आपने कहा है, संबंधित सारणियां आमतौर पर खाली होती हैं। इसका कारण यह है कि कोर ईएवी संस्थाओं में से कोई भी इस "डिफ़ॉल्ट" इकाई तालिका संरचना का उपयोग नहीं करता है। ये एक 1.8 स्थापित से इकाई सारणी हैं:

mysql> select distinct(entity_table) from eav_entity_type;
+-------------------------+
| entity_table            |
+-------------------------+
| customer/entity         |
| customer/address_entity |
| sales/order             |
| sales/order_entity      |
| catalog/category        |
| catalog/product         |
| sales/quote             |
| sales/quote_address     |
| sales/quote_entity      |
| sales/quote_item        |
| sales/invoice           |
+-------------------------+
11 rows in set (0.00 sec)

उदाहरण के रूप में ग्राहक मॉडल का उपयोग करते हुए, हम देख सकते हैं कि संसाधन मॉडल का Mage_Customer_Model_Resource_Customerविस्तार होता है Mage_Eav_Model_Entity_Abstract, स्रोत

नोट : 1.6 से पहले ग्राहक इकाई के लिए संसाधन मॉडल Mage_Customer_Model_Entity_Customerजो विस्तारित किया गया था Mage_Eav_Model_Entity_Abstract, स्रोत

यदि हम Mage_Eav_Model_Entity_Abstractकक्षा की जांच करते हैं तो हमें एक getEntityTableविधि मिलती है । इस विधि का उपयोग यह निर्धारित करने के लिए किया जाता है कि सामान्य CRUD ऑपरेशन के दौरान प्रश्नों का निर्माण करते समय किस तालिका का उपयोग किया जाए। एक और तरीका जो ब्याज का है getValueTablePrefix। यह डेटा "प्रकार" तालिकाओं के लिए तालिकाओं के लिए उपसर्ग निर्धारित करता है,*_datetime , *_decimal, *_varcharऔर इतने पर।

उन तरीकों के लिए स्रोत में झांकना ( यहां और यहां) )।

public function getEntityTable()
    {
        if (!$this->_entityTable) {
            $table = $this->getEntityType()->getEntityTable();
            if (!$table) {
                $table = Mage_Eav_Model_Entity::DEFAULT_ENTITY_TABLE;
            }
            $this->_entityTable = Mage::getSingleton('core/resource')->getTableName($table);
        }

        return $this->_entityTable;
    }

उपरोक्त विधि में हम देख सकते हैं कि यदि इकाई प्रकार कस्टम तालिका को परिभाषित नहीं करता है तो यह चूक करता है Mage_Eav_Model_Entity::DEFAULT_ENTITY_TABLE। उस स्थिरांक का मान है 'eav/entity', जो बदले में eav_entityतालिका में बदल जाता है (यह मानते हुए कि एप्लिकेशन में कोई कॉन्फ़िगर तालिका उपसर्ग नहीं है)। मैंने जिस दूसरी विधि का उल्लेख किया है, वह उपसर्ग के रूप में इस तालिका पर वापस आती है यदि दिए गए निकाय के लिए कोई भी कॉन्फ़िगर नहीं किया गया है। आप में मूल्यों की जांच-पड़ताल eav_entity_typeके लिए तालिका value_table_prefixस्तंभ आप है कि वे सभी कर रहे हैं पर ध्यान देंगे NULL

public function getValueTablePrefix()
    {
        if (!$this->_valueTablePrefix) {
            $prefix = (string)$this->getEntityType()->getValueTablePrefix();
            if (!empty($prefix)) {
                $this->_valueTablePrefix = $prefix;
                /**
                * entity type prefix include DB table name prefix
                */
                //Mage::getSingleton('core/resource')->getTableName($prefix);
            } else {
                $this->_valueTablePrefix = $this->getEntityTable();
            }
        }

        return $this->_valueTablePrefix;
    }

विधि में तर्क सरल है, यदि कोई मूल्य उपसर्ग परिभाषित नहीं है, तो उपसर्ग के रूप में इकाई तालिका नाम का उपयोग करें।

मुझे लगता है कि जब से इन तालिकाओं Magento में इतने लंबे समय के लिए किया गया है यह किसी भी पिछड़े संगतता के लिए उन्हें बाहर निकालने की तुलना में उन्हें छोड़ने के लिए सबसे अच्छा है। यह विचार कि मेरा मानना ​​है कि वे इकाई / मॉडल संरचना का उपयोग करने में आसान थे, अन्य डेवलपर्स कुछ वर्गों का विस्तार कर सकते हैं और इन "गतिशील" विशेषताओं को व्यवस्थापक के माध्यम से बदल सकते हैं (कैटलॉग उत्पादों और ग्राहक मॉडल देखें)। दुर्भाग्यवश, उक्त पैटर्न के क्रियान्वयन और अभ्यास को अच्छी तरह से नहीं लगता है और समस्याओं की ओर ले जाता है। मैंने इस संरचना को जंगली में कभी नहीं देखा है, शायद प्रलेखन की कमी और उदाहरण मामलों या खराब प्रदर्शन के कारण।

मैं कोई कोर डेवलपर (या पुरातत्वविद्) नहीं हूं, लेकिन यही मैं कोड और डेटा संरचनाओं से इकट्ठा करता हूं, उम्मीद है कि यह कुछ प्रकाश को बहाने में मदद करता है।


1
स्पष्टीकरण के लिए धन्यवाद। मेरे लिए काफी अच्छा। मैं एक ऐसी संस्था बनाने की कोशिश करूंगा जो इन तालिकाओं का उपयोग करती है, सिर्फ मनोरंजन के लिए।
मारियस

6

आधार EAV संसाधन मॉडल में कोड के इस बिट पर विचार करें।

#File: app/code/core/Mage/Eav/Model/Entity/Abstract.php
public function getEntityTable()
{
    if (!$this->_entityTable) {
        $table = $this->getEntityType()->getEntityTable();
        if (!$table) {
            $table = Mage_Eav_Model_Entity::DEFAULT_ENTITY_TABLE;
        }
        $this->_entityTable = Mage::getSingleton('core/resource')->getTableName($table);
    }

    return $this->_entityTable;
}

यह विधि भंडारण के लिए उपयोग करने के लिए आधार इकाई तालिका नाम को पकड़ लेती है। इसलिए, उत्पाद के संसाधन मॉडल के लिए, यह विधि वापस आ जाएगीcatalog_product_entity (यह मानते हुए कि कोई तालिका नाम उपसर्ग सेट नहीं किया गया है)

ये चार लाइन सबसे ज्यादा खुलासा करती हैं।

#File: app/code/core/Mage/Eav/Model/Entity/Abstract.php
$table = $this->getEntityType()->getEntityTable();
if (!$table) {
    $table = Mage_Eav_Model_Entity::DEFAULT_ENTITY_TABLE;
}

यदि इकाई में तालिका सेट नहीं है, तो निम्न स्थिरांक का उपयोग किया जाता है

#File: app/code/core/Mage/Eav/Model/Entity.php
const DEFAULT_ENTITY_TABLE      = 'eav/entity';

यह eav/entityस्ट्रिंग तब तालिका नाम देखने के लिए उपयोग की जाती है

#File: app/code/core/Mage/Eav/Model/Entity/Abstract.php
Mage::getSingleton('core/resource')->getTableName($table);

जो कॉन्फिगर से टेबल नेम को प्लक करता है।

<!-- File: app/code/core/Mage/Eav/etc/config.xml -->
<entity>
    <table>eav_entity</table>
</entity>

आह हा! यदि एक ईवा संस्था के प्रकार में टेबल नाम सेट नहीं है, तो मैगेंटो eav_entityडिफ़ॉल्ट भंडारण स्थान के रूप में तालिकाओं का उपयोग करेगा ।

मूल मैगेंटो इंजीनियरिंग टीम ईएवी अवधारणा के प्रति आसक्त थी - जबकि आधुनिक मैगनेटो ने इसे वापस बढ़ाया है, ईएवी मॉडल कई समस्याओं के लिए पसंदीदा समाधान थे।

ऐसा लगता है कि इस केंद्रीय प्रकार की तालिका (एंटरप्राइज़ प्लेटफ़ॉर्म में एक सामान्य पैटर्न) और इकाई प्रकार बाद में आए सभी डेटा को संग्रहीत पूर्व-रिलीज़ EAV कार्यान्वयन को मानने / अनुमान लगाने के लिए उचित है eav_entity

एक और (सम्मोहक) संभावना यह है कि यह सुविधा "टेबललेस" CRUD मॉडल को सक्षम करने के लिए थी। सिद्धांत रूप में, सही ईएवी प्रकार की जानकारी सम्मिलित करना, अपने मॉडल / संसाधन / संग्रह कक्षाओं को सेटअप करना और इन eav_entityतालिकाओं में संग्रहीत डेटा रखना संभव होगा । मैगेंटो का EAV से दूर जाना, और एंड-यूज़र फीचर्स पर इंजीनियरिंग टीम के लॉन्च के बाद के फोकस का मतलब था कि यह फीचर धुंध में बह गया। जब मैं उत्सुक होता हूं यदि यह काम करता है, तो मैं इस पर भरोसा नहीं करना चाहता हूं क्योंकि यह एक कोड पथ नहीं है जिसे बहुत अधिक ध्यान दिया गया है, और यह संदिग्ध है कि टीएएफ इसके उपयोग को कवर करता है।


1
विस्तृत विवरण के लिए धन्यवाद। मैं निश्चित रूप से "टेबललेस" इकाई के साथ एक मॉड्यूल बनाने की कोशिश करने जा रहा हूं ताकि यह काम कर सके। मुझ से +1। लेकिन मैं @beeplogic द्वारा प्रदान किए गए उत्तर को स्वीकार करने के लिए बाध्य महसूस करता हूं जो मूल रूप से समान चीजें बताता है। वह 5 मिनट तेज था।
मारियस

-1

मैगेंटो अपने कई कार्यों (ग्राहकों, उत्पादों आदि) के लिए "एंटिटी एट्रीब्यूट वैल्यू" नामक डेटा मॉडल का उपयोग करता है। यह वह है जो सिस्टम में गतिशील विशेषताओं को बिना पुनर्गठन और मक्खी पर तालिकाओं को बदलने की अनुमति देता है। विकिपीडिया पर EAV


धन्यवाद, लेकिन यह वास्तव में सवाल का जवाब नहीं देता है। प्रश्न में उल्लिखित तालिका किस इकाई का उपयोग करती है? मैं ग्राहक, उत्पादों या श्रेणियों के बारे में बात नहीं कर रहा था।
मेरियस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.