วัตถุประสงค์ของตาราง '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
เมื่อฉันเริ่มเรียนรู้ Magento และ EAV พิเศษฉันเห็นว่าตารางเหล่านี้ว่างเปล่าเสมอ ฉันพยายามค้นหาออนไลน์ แต่ไม่เคยได้รับคำตอบที่ระบุเช่นกัน ฉันคิดว่ามันอาจจะเป็นนิยามหรือตารางอ้างอิงสำหรับตารางเอนทิตีอื่น ๆ แต่ตอนนี้ฉันยังรอคำตอบอย่างกระตือรือร้น ขอบคุณสำหรับคำถามนี้ :)
MagentoBoy

@MagentoBoy ฉันยังเห็นเมื่อฉันเริ่มทำงานกับ Magento ในขณะที่ฉันพยายามห่อหัวของฉันรอบฐานข้อมูล ฉันมีอายุมากกว่า 5 ปีแล้วและฉันก็ยังงงงวย
Marius

.. แต่พวกคุณมีทักษะที่ดีเกี่ยวกับวีโอไอพี .. บางครั้งฉันใช้การอ้างอิงของคุณเพื่อเรียนรู้และในรหัสของฉันเช่นกัน .. มันใช้เวลาประมาณ 7-8 เดือนสำหรับวีโอไอพีและ 11 เดือนสำหรับประสบการณ์ PHP แต่ยังรู้สึกเหมือนฉัน ผมเป็นมือใหม่สำหรับวีโอไอพีและความต้องการที่จะเรียนรู้มาก ..
MagentoBoy

คำตอบ:


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วิธีการ วิธีนี้จะใช้ในการกำหนดตารางที่จะใช้เมื่อสร้างแบบสอบถามในระหว่างการดำเนินการ 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_prefixNULL

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
ขอบคุณสำหรับคำอธิบาย ดีพอสำหรับฉัน ฉันจะพยายามสร้างเอนทิตีที่ใช้ตารางเหล่านี้เพื่อความสนุก
Marius

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 ไม่มีการตั้งชื่อตารางไว้วีโอไอพีจะใช้eav_entityตารางเป็นที่เก็บข้อมูลเริ่มต้น

ทีมวิศวกรวีโอไอพีดั้งเดิมได้รับการยกย่องในแนวคิด EAV - ในขณะที่วีโอไอพีรุ่นใหม่ได้ปรับขนาดของมันกลับมา แต่รุ่น EAV เป็นทางเลือกที่ดีสำหรับปัญหามากมาย

ดูเหมือนว่ามีเหตุผลที่จะสมมติ / คาดการณ์การใช้ EAV ก่อนวางจำหน่ายครั้งแรกซึ่งจัดเก็บข้อมูลทั้งหมดในeav_entityตารางชนิดศูนย์กลางนี้ (รูปแบบทั่วไปในแพลตฟอร์มองค์กร) และประเภทเอนทิตีมาในภายหลัง

ความเป็นไปได้อื่น ๆ (ที่น่าสนใจ) คือคุณลักษณะนี้มีจุดประสงค์เพื่อเปิดใช้งานโมเดล CRUD แบบ "tableless" ในทางทฤษฎีเป็นไปได้ที่จะแทรกข้อมูลประเภท EAV ที่ถูกต้องตั้งค่าคลาส / โมเดล / รีซอร์ส / คอลเล็กชันของคุณและมีข้อมูลที่เก็บไว้ในeav_entityตารางเหล่านี้ Magento ย้ายออกจาก EAV และการโพสต์โฟกัสในทีมวิศวกรรมเกี่ยวกับคุณสมบัติของผู้ใช้งานนั่นหมายความว่าฟีเจอร์นี้จะหายไปในหมอก ในขณะที่ฉันอยากรู้ว่างานนี้ฉันไม่ต้องการที่จะพึ่งพาเพราะมันไม่ใช่เส้นทางของรหัสที่ได้รับความสนใจเป็นอย่างมากและเป็นที่น่าสงสัยว่า TAF ครอบคลุมการใช้งานของมัน


1
ขอบคุณสำหรับคำอธิบายโดยละเอียด ฉันจะลองสร้างโมดูลด้วยเอนทิตี "tableless" เพื่อดูว่าใช้งานได้หรือไม่ +1 จากฉัน แต่ฉันรู้สึกผูกพันที่จะต้องยอมรับคำตอบของ @beeplogic ที่ระบุว่าเป็นเรื่องเดียวกัน เขาเร็วกว่า 5 นาที
Marius

-1

Magento ใช้รูปแบบข้อมูลที่เรียกว่า "ค่าเอนทิตี้ของ" สำหรับฟังก์ชั่นหลายอย่าง (ลูกค้าผลิตภัณฑ์ ฯลฯ ) นี่คือสิ่งที่ช่วยให้คุณลักษณะแบบไดนามิกในระบบโดยไม่ต้องปรับโครงสร้างและแก้ไขตารางได้ทันที EAV บน Wikipedia


ขอบคุณ แต่นี่ไม่ได้ตอบคำถามจริงๆ เอนทิตีใดใช้ตารางที่กล่าวถึงในคำถาม ฉันไม่ได้พูดถึงลูกค้าผลิตภัณฑ์หรือหมวดหมู่
Marius
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.