Lo scopo delle tabelle "eav_"


19

Mi sono sempre chiesto quale sia il significato delle tabelle:

eav_entity  
eav_entity_datetime
eav_entity_decimal
eav_entity_int
eav_entity_store
eav_entity_text

Sono sempre vuoti. Sono creati nelle versioni precedenti alla 1.6 in app/code/core/Mage/Eav/sql/eav_setup/mysql4-install-0.7.0.phpe successivamente sono stati portati allo script di installazione per le versioni 1.6+ /app/code/core/Mage/Eav/sql/eav_setup/install-1.6.0.0.php
Ho visto che esiste un modello di risorsa collegato a una delle tabelle Mage_Eav_Model_Resource_Entity_Store(forse ce ne sono altre) ma non succede nulla.

C'è qualche utilità in queste tabelle o è questa un'altra "funzione" che è stata avviata e non implementata come la versione del layout o il pangrattato dell'amministratore, ad esempio.


3
Quando ho iniziato a studiare Magento e specialmente EAV, vedo che queste tabelle sono sempre vuote. Ho provato a cercare online ma non ho mai trovato una risposta specifica. Ho pensato che potrebbe essere una definizione o una tabella di riferimento per altre tabelle di entità. Ma ora aspetto con impazienza la risposta. Grazie per questa domanda :)
MagentoBoy,

@MagentoBoy. Ho visto anche quando ho iniziato a lavorare con Magento, mentre cercavo di avvolgere la mia testa nel database. Sono passati più di 5 anni e sono ancora perplesso.
Marius

... ma voi ragazzi avete davvero buone capacità sul magento .. A volte, uso i vostri riferimenti per imparare e anche nel mio codice .. Sono passati da 7 a 8 mesi per magento e 11 mesi per esperienza php Ma mi sento ancora come me sono un principiante per magento e ho bisogno di imparare molto ..
MagentoBoy

Risposte:


17

La mia ipotesi è che sia parte dell'eredità e un modello di "convenienza" per gli sviluppatori di implementare entità / modelli "generici".

Come hai affermato, le tabelle correlate sono generalmente vuote. Il motivo è che nessuna delle entità EAV principali utilizza questa struttura di tabella entità "predefinita". Queste sono le tabelle delle entità da un'installazione 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)

Usando il modello Cliente come esempio, possiamo vedere che il modello risorsa si Mage_Customer_Model_Resource_Customerestende Mage_Eav_Model_Entity_Abstract, Fonte .

Nota : prima dell'1.6 era stato Mage_Customer_Model_Entity_Customeresteso anche il modello di risorsa per l'entità cliente Mage_Eav_Model_Entity_Abstract, Fonte .

Se esaminiamo la Mage_Eav_Model_Entity_Abstractclasse troviamo un getEntityTablemetodo. Questo metodo viene utilizzato per determinare quale tabella utilizzare durante la creazione di query durante le operazioni CRUD comuni. Un altro metodo che è di interesse è getValueTablePrefix. Esso determina il prefisso per le tabelle di dati per tabelle "tipo", *_datetime, *_decimal, *_varchare così via.

Sbirciando nella fonte per quei metodi ( qui e qui ).

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

Nel metodo sopra si può vedere che se il tipo di entità non definisce una tabella personalizzata come da impostazione predefinita Mage_Eav_Model_Entity::DEFAULT_ENTITY_TABLE. Il valore di quella costante è 'eav/entity', che a sua volta viene trasformato nella eav_entitytabella (supponendo che non vi sia un prefisso di tabella configurato nell'applicazione). Il secondo metodo che ho citato ricade su questa tabella come prefisso se nessuno è stato configurato per la data entità. Se si esaminano i valori nella eav_entity_typetabella per la value_table_prefixcolonna, si noterà che sono tutti 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;
    }

La logica nel metodo è piuttosto semplice, se non viene definito alcun prefisso valore utilizzare il nome della tabella entità come prefisso.

Presumo che dato che questi tavoli sono stati in Magento per così tanto tempo, è meglio lasciarli per qualsiasi retrocompatibilità piuttosto che rimuoverli del tutto. L'idea che credo stessero cercando era una struttura entità / modello facile da usare che altri sviluppatori potessero semplicemente estendere alcune classi e avere questi attributi "dinamici" che potevano essere cambiati tramite l'amministratore (vedere i prodotti del catalogo e i modelli dei clienti). Sfortunatamente l'implementazione e la pratica di tale modello non sembrano ridimensionarsi bene e portano a problemi. Non ho mai visto questa struttura utilizzata in natura, probabilmente a causa della mancanza di documentazione e di casi d'uso esemplificativi o di prestazioni scadenti.

Non sono uno sviluppatore principale (o archeologo) ma è quello che raccolgo dal codice e dalle strutture di dati, si spera che aiuti a far luce.


1
Grazie per la spiegazione. Abbastanza buono per me Proverò a creare un'entità che utilizza queste tabelle, solo per divertimento.
Marius

6

Considera questo bit di codice nel modello di risorsa EAV di base.

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

Questo metodo acquisisce il nome della tabella dell'entità di base da utilizzare per l'archiviazione. Pertanto, per il modello di risorsa di un prodotto, questo metodo restituirà catalog_product_entity(presupponendo che non sia stato impostato alcun prefisso per il nome della tabella)

Queste quattro righe sono le più rivelatrici.

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

Se l'entità non ha un set di tabelle, viene utilizzata la seguente costante

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

Questa eav/entitystringa viene quindi utilizzata per cercare il nome di una tabella

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

Il che toglie il nome della tabella dalla configurazione.

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

Ah ah! Se un tipo di entità eav non ha un nome di tabella impostato, Magento utilizzerà le eav_entitytabelle come posizione di archiviazione predefinita.

Il team di ingegneri Magento originale era innamorato del concetto EAV - mentre il moderno Magento ha ridimensionato questo concetto, i modelli EAV erano la soluzione preferita per molti problemi.

Sembra ragionevole supporre / ipotizzare che l'implementazione EAV pre-release iniziale abbia archiviato tutti i dati in questa eav_entitytabella dei tipi centrale (un modello comune nelle piattaforme enterprise), e i tipi di entità sono arrivati ​​successivamente.

Un'altra possibilità (convincente) è che questa funzione fosse progettata per abilitare modelli CRUD "senza tablatura". In teoria, sarebbe possibile inserire le informazioni corrette sul tipo EAV, impostare il proprio modello / risorsa / classi di raccolta e avere i dati memorizzati in queste eav_entitytabelle. L'allontanamento di Magento da EAV e l'attenzione post-lancio sul team di ingegneri sulle funzionalità degli utenti finali hanno fatto sì che questa funzione si dissolvesse nella nebbia. Anche se sarei curioso di sapere se funziona, non vorrei fare affidamento su di esso poiché non è un percorso di codice che ha ricevuto molta attenzione, ed è dubbio che il TAF ne copra l'utilizzo.


1
Grazie per la spiegazione dettagliata. Proverò sicuramente a costruire un modulo con un'entità "senza tablatura" per vedere se funziona. +1 da me. Ma mi sento obbligato ad accettare la risposta fornita da @beeplogic che afferma sostanzialmente le stesse cose. Era 5 minuti più veloce.
Marius

-1

Magento utilizza un modello di dati chiamato "Valore attributo entità" per molte delle sue funzioni (clienti, prodotti, ecc.). Questo è ciò che consente gli attributi dinamici nel sistema senza dover ristrutturare e alterare le tabelle al volo. EAV su Wikipedia


Grazie, ma questo non risponde davvero alla domanda. Quale entità utilizza le tabelle menzionate nella domanda? Non stavo parlando di clienti, prodotti o categorie.
Marius
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.