Tujuan tabel 'eav_'

19

Saya selalu bertanya-tanya apa arti dari tabel:

eav_entity  
eav_entity_datetime
eav_entity_decimal
eav_entity_int
eav_entity_store
eav_entity_text

Mereka selalu kosong. Mereka dibuat dalam versi sebelum 1.6 app/code/core/Mage/Eav/sql/eav_setup/mysql4-install-0.7.0.phpdan kemudian mereka dibawa ke skrip instalasi untuk versi 1.6+ /app/code/core/Mage/Eav/sql/eav_setup/install-1.6.0.0.php
Saya melihat bahwa ada model sumber daya yang terhubung ke salah satu tabel Mage_Eav_Model_Resource_Entity_Store(mungkin ada yang lain) tetapi tidak ada yang terjadi / dengan itu.

Apakah ada gunanya tabel ini atau ini "fitur" lain yang dimulai dan tidak diterapkan seperti versi tata letak atau remah roti admin misalnya.

Marius
sumber
3
Ketika saya mulai belajar Magento dan khususnya EAV, saya melihat bahwa tabel ini selalu kosong. Saya mencoba mencari secara online tetapi tidak pernah mendapatkan jawaban yang spesifik juga. Saya pikir itu mungkin tabel definisi atau referensi untuk tabel entitas lainnya. Tapi sekarang saya juga menunggu jawaban. Terima kasih untuk pertanyaan ini. :)
MagentoBoy
@ MagentoBoy. Saya juga melihat ketika saya mulai bekerja dengan Magento, sementara saya mencoba untuk membungkus kepala saya di sekitar database. Sudah 5+ tahun dan saya masih bingung.
Marius
..tapi kalian benar-benar memiliki keterampilan yang baik pada magento .. Kadang-kadang, saya menggunakan referensi Anda untuk belajar dan dalam kode saya juga .. Sudah sekitar 7 hingga 8 bulan untuk magento dan 11 bulan untuk pengalaman php Tapi masih merasa seperti saya Saya seorang pemula untuk magento dan perlu belajar banyak ..
MagentoBoy

Jawaban:

17

Dugaan saya adalah bagian warisan dan pola "kenyamanan" bagi pengembang untuk menerapkan entitas / model "umum".

Seperti yang telah Anda nyatakan, tabel terkait biasanya kosong. Alasannya adalah bahwa tidak ada entitas EAV inti yang menggunakan struktur tabel entitas "default" ini. Ini adalah tabel entitas dari instalasi 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)

Menggunakan model Pelanggan sebagai contoh, kita dapat melihat bahwa model sumber daya Mage_Customer_Model_Resource_Customermeluas Mage_Eav_Model_Entity_Abstract, Sumber .

Catatan : Sebelum 1.6 model sumber daya untuk entitas pelanggan Mage_Customer_Model_Entity_Customerjuga diperluas Mage_Eav_Model_Entity_Abstract, Sumber .

Jika kita memeriksa Mage_Eav_Model_Entity_Abstractkelas kita menemukan getEntityTablemetode. Metode ini digunakan untuk menentukan tabel mana yang akan digunakan ketika membangun kueri selama operasi CRUD umum. Metode lain yang menarik adalah getValueTablePrefix. Hal ini menentukan awalan untuk tabel data "jenis" meja, *_datetime, *_decimal, *_varchardan sebagainya.

Mengintip sumber untuk metode tersebut (di sini dan di sini ).

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

Dalam metode di atas kita dapat melihat bahwa jika tipe entitas tidak mendefinisikan tabel kustom itu defaultnya Mage_Eav_Model_Entity::DEFAULT_ENTITY_TABLE. Nilai konstanta itu adalah 'eav/entity', yang pada gilirannya akan berubah menjadi eav_entitytabel (dengan asumsi tidak ada awalan tabel yang dikonfigurasi dalam aplikasi). Metode kedua yang saya sebutkan jatuh kembali pada tabel ini sebagai awalan jika tidak ada yang dikonfigurasi untuk entitas yang diberikan. Jika Anda memeriksa nilai dalam eav_entity_typetabel untuk value_table_prefixkolom Anda akan melihat bahwa semuanya 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;
    }

Logika dalam metode ini agak sederhana, jika tidak ada nilai awalan yang didefinisikan menggunakan nama tabel entitas sebagai awalan.

Saya berasumsi bahwa karena tabel-tabel ini sudah ada di Magento sejak lama, yang terbaik adalah membiarkannya untuk kompatibilitas mundur daripada menghapusnya langsung. Gagasan yang saya yakini akan mereka gunakan adalah struktur entitas / model yang mudah digunakan sehingga pengembang lain hanya dapat memperluas beberapa kelas dan memiliki atribut "dinamis" yang dapat diubah melalui admin (lihat katalog produk dan model pelanggan). Sayangnya implementasi dan praktik pola tersebut tampaknya tidak berkembang dengan baik dan menyebabkan masalah. Saya belum pernah melihat struktur ini digunakan di alam, mungkin karena kurangnya dokumentasi dan contoh kasus penggunaan atau kinerja yang buruk.

Saya bukan pengembang inti (atau arkeolog), tetapi itulah yang saya kumpulkan dari struktur kode dan data, semoga ini membantu menjelaskan.

beeplogic
sumber
1
Terima kasih untuk penjelasannya. Cukup baik untukku. Saya akan mencoba membuat entitas yang menggunakan tabel ini, hanya untuk bersenang-senang.
Marius
6

Pertimbangkan sedikit kode ini dalam model sumber daya EAV dasar.

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

Metode ini mengambil nama tabel entitas dasar yang akan digunakan untuk penyimpanan. Jadi, untuk model sumber daya produk, metode ini akan kembali catalog_product_entity(dengan asumsi tidak ada awalan nama tabel yang telah ditetapkan)

Empat baris ini adalah yang paling terbuka.

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

Jika entitas tidak memiliki set tabel, konstanta berikut digunakan

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

Ini eav/entitystring yang kemudian digunakan untuk mencari nama tabel

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

Yang memetik nama tabel dari konfigurasi.

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

Ah ha! Jika jenis entitas eav tidak memiliki set nama tabel, maka Magento akan menggunakan eav_entitytabel sebagai lokasi penyimpanan default.

Tim teknik Magento asli terpikat pada konsep EAV - sementara Magento modern telah meningkatkan ini, model EAV adalah solusi yang lebih disukai untuk banyak masalah.

Tampaknya masuk akal untuk berasumsi / berspekulasi implementasi EAV pra-rilis awal menyimpan semua data dalam eav_entitytabel tipe pusat ini (pola umum dalam platform perusahaan), dan tipe entitas muncul kemudian.

Kemungkinan lain (meyakinkan) adalah fitur ini dimaksudkan untuk mengaktifkan model CRUD "tableless". Secara teori, akan mungkin untuk memasukkan informasi jenis EAV yang benar, mengatur kelas model / sumber daya / pengumpulan Anda, dan menyimpan data dalam eav_entitytabel ini . Langkah Magento menjauh dari EAV, dan fokus pasca-peluncuran pada tim teknik pada fitur pengguna akhir berarti fitur ini memudar menjadi kabut. Walaupun saya ingin tahu apakah ini berhasil, saya tidak ingin bergantung padanya karena ini bukan jalur kode yang mendapat banyak perhatian, dan diragukan bahwa TAF mencakup penggunaannya.

Alan Storm
sumber
1
Terima kasih untuk penjelasan rinci. Saya pasti akan mencoba membangun modul dengan entitas "tableless" untuk melihat apakah itu berfungsi. +1 dari saya. Tapi saya merasa berkewajiban untuk menerima jawaban yang diberikan oleh @beeplogic yang pada dasarnya menyatakan hal yang sama. Dia 5 menit lebih cepat.
Marius
-1

Magento menggunakan model data yang disebut "Nilai Atribut Entitas" untuk sebagian besar fungsinya (pelanggan, produk, dll.). Inilah yang memungkinkan atribut dinamis dalam sistem tanpa harus merestrukturisasi dan mengubah tabel dengan cepat. EAV Di Wikipedia

Adam R.
sumber
Terima kasih, tetapi ini tidak benar-benar menjawab pertanyaan. Entitas apa yang menggunakan tabel yang disebutkan dalam pertanyaan? Saya tidak berbicara tentang pelanggan, produk, atau kategori.
Marius