'Eav_' টেবিলগুলির উদ্দেশ্য


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
আমি যখন ম্যাজেন্টো এবং বিশেষত EAV শিখতে শুরু করেছি তখন আমি দেখতে পাচ্ছি যে এই টেবিলগুলি সর্বদা খালি থাকে। আমি অনলাইনে অনুসন্ধান করার চেষ্টা করেছি তবে এর সাথে কোনও নির্দিষ্ট উত্তর কখনও পাইনি। আমি ভেবেছিলাম এটি অন্যান্য সত্তার টেবিলগুলির জন্য একটি সংজ্ঞা বা রেফারেন্স সারণী হতে পারে। তবে এখন আমিও অধীর আগ্রহে উত্তরের অপেক্ষা করছি। এই প্রশ্নের জন্য ধন্যবাদ। :)
ম্যাজেন্টোবয়

@MagentoBoy। আমি তখনও দেখলাম যখন আমি ম্যাজেন্টোর সাথে কাজ শুরু করেছি, যখন আমি ডাটাবেসটির চারপাশে আমার মাথা গুটিয়ে দেওয়ার চেষ্টা করছিলাম। আমার 5+ বছর হয়েছে এবং আমি এখনও বিস্মিত।
মারিয়াস

.. তবে আপনি ছেলেরা ম্যাজেন্টো সম্পর্কে সত্যিই ভাল দক্ষতা অর্জন করছেন .. কখনও কখনও, আমি আপনার রেফারেন্সগুলি শিখতে এবং আমার কোডেও ব্যবহার করি .. এটি ম্যাজেন্টোর জন্য প্রায় 7 থেকে 8 মাস এবং পিএইচপি অভিজ্ঞতার জন্য 11 মাস হয়েছে তবে এখনও আমার মতো মনে হচ্ছে ম্যাজেন্টোর জন্য একজন শিক্ষানবিস এবং খুব শিখতে হবে ..
ম্যাজেন্টোবয়

উত্তর:


17

আমার অনুমান যে এটি বংশগত উত্তরাধিকার এবং বিকাশকারীদের "জেনেরিক" সত্তা / মডেলগুলি প্রয়োগ করার জন্য একটি "সুবিধা" প্যাটার্ন।

যেমনটি আপনি বলেছেন, সম্পর্কিত টেবিলগুলি সাধারণত খালি থাকে। কারণ হ'ল মূল EAV সত্তার কোনওটিই এই "ডিফল্ট" সত্তা সারণী কাঠামোটি ব্যবহার করে না। এগুলি একটি 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পদ্ধতি খুঁজে পাই । এই পদ্ধতিটি সাধারণ সিআরইউডি অপারেশনের সময় কোয়েরি তৈরি করার সময় কোন টেবিলটি ব্যবহার করতে হবে তা নির্ধারণ করতে ব্যবহৃত হয়। আরেকটি পদ্ধতি যা আগ্রহী তা হ'ল getValueTablePrefix। এটি তথ্য "টাইপ" টেবিলের জন্য টেবিলের জন্য উপসর্গ নির্ধারণ করে, *_datetime, *_decimal,*_varchar ইত্যাদি।

সেই পদ্ধতি (জন্য উৎস মধ্যে peeking এখানে এবং এখানে )।

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;
    }

পদ্ধতিতে যুক্তিটি বরং সহজ, যদি কোনও মান উপসর্গ সংজ্ঞায়িত না হয় তবে সত্তার টেবিলের নামটি উপসর্গ হিসাবে ব্যবহার করুন।

আমি অনুমান করি যেহেতু এই টেবিলগুলি এতদিন ধরে ম্যাজেন্টোতে রয়েছে সেগুলি সরাসরি সরানোর চেয়ে কোনও পিছনের সামঞ্জস্যের জন্য এগুলি রাখা ভাল best আমি বিশ্বাস করি যে তারা যাচ্ছিলেন তা হ'ল সত্তা / মডেল কাঠামোটি ব্যবহার করা সহজ ছিল যা অন্যান্য বিকাশকারীরা কেবল কয়েকটি শ্রেণি প্রসারিত করতে পারে এবং এই "গতিশীল" বৈশিষ্ট্যগুলি অ্যাডমিনের মাধ্যমে পরিবর্তিত হতে পারে (ক্যাটালগ পণ্য এবং গ্রাহক মডেলগুলি দেখুন)। দুর্ভাগ্যক্রমে উক্ত প্যাটার্নটির বাস্তবায়ন এবং অনুশীলনটি ভাল স্কেল বলে মনে হয় না এবং সমস্যার দিকে পরিচালিত করে। বুনোতে এই কাঠামোটি আমি কখনও দেখিনি, সম্ভবত ডকুমেন্টেশন এবং উদাহরণ ব্যবহারের ক্ষেত্রে বা দুর্বল পারফরম্যান্সের অভাবে।

আমি কোনও মূল বিকাশকারী (বা প্রত্নতাত্ত্বিক) কিন্তু আমি কোড এবং ডেটা কাঠামো থেকে সংগ্রহ করি না, আশা করি এটি কিছুটা আলোকপাত করতে সহায়তা করবে।


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 প্রকারের সারণীতে (এন্টারপ্রাইজ প্ল্যাটফর্মগুলির একটি সাধারণ প্যাটার্ন) এবং সত্তার প্রকারগুলি পরে এসেছিল।

আর একটি (বাধ্যতামূলক) সম্ভাবনা হ'ল এই বৈশিষ্ট্যটি "টেবিললেস" সিআরইউডি মডেলগুলি সক্ষম করার উদ্দেশ্যে তৈরি করা হয়েছিল। তত্ত্ব অনুসারে, সঠিক EAV প্রকারের তথ্য সন্নিবেশ করা, আপনার মডেল / উত্স / সংগ্রহের ক্লাস সেটআপ করা এবং এই eav_entityটেবিলগুলিতে ডেটা সঞ্চয় করা সম্ভব হবে । ইএভি থেকে ম্যাজেন্টোর সরানো, এবং শেষ-ব্যবহারকারী বৈশিষ্ট্যগুলিতে ইঞ্জিনিয়ারিং দলে পোস্ট-লঞ্চের ফোকাসের অর্থ এই বৈশিষ্ট্যটি কুয়াশা থেকে দূরে। যদিও আমি কৌতূহল হব যদি এটি কাজ করে তবে আমি এটির উপর নির্ভর করতে চাই না কারণ এটি কোনও কোড পাথ নয় যা যথেষ্ট মনোযোগ পেয়েছে, এবং এটি সন্দেহ হয় যে টিএএফ এর ব্যবহারটি coversেকে রাখে।


1
বিস্তারিত ব্যাখ্যার জন্য ধন্যবাদ। আমি অবশ্যই "টেবিললেস" সত্তা সহ একটি মডিউল তৈরির চেষ্টা করব যা এটি কাজ করে কিনা তা দেখার জন্য। আমার কাছ থেকে +1 তবে আমি @ বিপলগিকের দেওয়া উত্তরটি গ্রহণ করতে বাধ্য বলে মনে করি যা মূলত একই জিনিসগুলিকে জানিয়েছে। তিনি 5 মিনিট দ্রুত ছিল।
মারিয়াস

-1

ম্যাজেন্টো এর বেশিরভাগ ফাংশনের (গ্রাহক, পণ্য, ইত্যাদি) জন্য "সত্তা গুণাবলি মান" নামে একটি ডেটা মডেল ব্যবহার করে uses ফ্লাইয়ের টেবিলগুলিকে পুনর্গঠন এবং পরিবর্তন না করেই এটি সিস্টেমে গতিশীল বৈশিষ্ট্যগুলিকে মঞ্জুরি দেয়। EAV উইকিপিডিয়ায়


ধন্যবাদ, তবে এটি আসলে প্রশ্নের উত্তর দেয় না। প্রশ্নে উল্লিখিত টেবিলগুলি কোন সত্তা ব্যবহার করে? আমি গ্রাহক, পণ্য বা বিভাগ সম্পর্কে কথা বলছিলাম না।
মারিয়াস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.