Zawsze zastanawiałem się, jakie jest znaczenie tabel:
eav_entity
eav_entity_datetime
eav_entity_decimal
eav_entity_int
eav_entity_store
eav_entity_text
Zawsze są puste. Są one tworzone w wersjach wcześniejszych niż 1.6 app/code/core/Mage/Eav/sql/eav_setup/mysql4-install-0.7.0.php
i później przeniesione do skryptu instalacyjnego dla wersji 1.6+. /app/code/core/Mage/Eav/sql/eav_setup/install-1.6.0.0.php
Widziałem, że istnieje model zasobów powiązany z jedną z tabel Mage_Eav_Model_Resource_Entity_Store
(być może są inne), ale nic się z tym nie dzieje.
Czy te tabele mają jakieś zastosowanie, czy jest to inna „funkcja”, która została uruchomiona i nie została zaimplementowana, na przykład wersja układu lub okruszki administracyjne .
Odpowiedzi:
Domyślam się, że jest to częściowo dziedzictwo i wzorzec „wygody” dla programistów do wdrażania „ogólnych” bytów / modeli.
Jak już wspomniałeś, powiązane tabele są zwykle puste. Powodem jest to, że żadna z podstawowych jednostek EAV nie używa tej „domyślnej” struktury tabeli jednostek. Oto tabele encji z instalacji 1.8:
Na przykładzie modelu klienta możemy zobaczyć, że model zasobów
Mage_Customer_Model_Resource_Customer
rozszerza sięMage_Eav_Model_Entity_Abstract
, Źródło .Uwaga : Przed wersją 1.6
Mage_Customer_Model_Entity_Customer
rozszerzono także model zasobów dla jednostki klientaMage_Eav_Model_Entity_Abstract
, Źródło .Jeśli zbadamy
Mage_Eav_Model_Entity_Abstract
klasę, znajdziemygetEntityTable
metodę. Ta metoda służy do określania, której tabeli należy użyć podczas budowania zapytań podczas typowych operacji CRUD. Inną interesującą metodą jestgetValueTablePrefix
. To określa prefiks tabel dla tabel danych „typ”,*_datetime
,*_decimal
,*_varchar
i tak dalej.Zaglądając do źródła tych metod ( tu i tutaj ).
W powyższej metodzie możemy zobaczyć, że jeśli typ encji nie definiuje niestandardowej tabeli, domyślnie jest to ustawiane
Mage_Eav_Model_Entity::DEFAULT_ENTITY_TABLE
. Wartością tej stałej jest'eav/entity'
, która z kolei zamienia się weav_entity
tabelę (zakładając, że w aplikacji nie ma skonfigurowanego prefiksu tabeli). Druga metoda, o której wspomniałem, opiera się na tej tabeli jako prefiks, jeśli żadna nie została skonfigurowana dla danej jednostki. Jeśli sprawdzisz wartości weav_entity_type
tabeli dlavalue_table_prefix
kolumny, zauważysz, że wszystkie one sąNULL
.Logika w metodzie jest raczej prosta, jeśli nie zdefiniowano prefiksu wartości, użyj nazwy tablicy encji jako prefiksu.
Zakładam, że skoro te tabele są w Magento od tak dawna, najlepiej pozostawić je dla kompatybilności wstecznej, niż je całkowicie usunąć. Pomysł, który według mnie zamierzali, był łatwą w użyciu strukturą encji / modelu, którą inni programiści mogliby po prostu rozszerzyć o kilka klas i mieć te „dynamiczne” atrybuty, które można zmienić za pośrednictwem administratora (patrz produkty z katalogu i modele klientów). Niestety implementacja i praktyka tego wzorca nie wydaje się dobrze skalować i prowadzi do problemów. Nigdy nie widziałem tej struktury używanej na wolności, prawdopodobnie z powodu braku dokumentacji i przykładowych przypadków użycia lub słabej wydajności.
Nie jestem głównym programistą (ani archeologiem), ale to, co zbieram ze kodu i struktur danych, mam nadzieję, że to pomoże rzucić nieco światła.
źródło
Rozważ ten fragment kodu w podstawowym modelu zasobów EAV.
Ta metoda pobiera nazwę tabeli jednostki podstawowej do użycia do przechowywania. Tak więc w przypadku modelu zasobów produktu metoda ta zwróci
catalog_product_entity
(zakładając, że nie ustawiono prefiksu nazwy tabeli)Te cztery linie są najbardziej odkrywcze.
Jeśli jednostka nie ma ustawionej tabeli, używana jest następująca stała
Ten
eav/entity
ciąg jest następnie używany do wyszukiwania nazwy tabeliKtóry pobiera nazwę tabeli z konfiguracji.
Ach ha! Jeśli typ jednostki eav nie ma ustawionej nazwy tabeli, Magento użyje
eav_entity
tabel jako domyślnej lokalizacji przechowywania.Oryginalny zespół inżynierów Magento był zachwycony koncepcją EAV - podczas gdy nowoczesne Magento to zmniejszyło, modele EAV były preferowanym rozwiązaniem wielu problemów.
Rozsądne wydaje się założenie / spekulowanie, że początkowa przedpremierowa implementacja EAV zawierała wszystkie dane w tej centralnej
eav_entity
tabeli typów (wspólny wzorzec na platformach korporacyjnych), a typy jednostek pojawiły się później.Inną (przekonującą) możliwością jest to, że ta funkcja miała umożliwić „bezobsługowe” modele CRUD. Teoretycznie byłoby możliwe wstawienie poprawnych informacji o typie EAV, skonfigurowanie klas modelu / zasobu / kolekcji i przechowywanie danych w tych
eav_entity
tabelach. Odejście Magento od EAV i skupienie się na zespole inżynierów po uruchomieniu na funkcjach użytkowników końcowych sprawiło, że ta funkcja zniknęła we mgle. Byłbym ciekawy, czy to zadziała, ale nie chciałbym na nim polegać, ponieważ nie jest to ścieżka do kodu, na którą zwrócono dużą uwagę, i wątpliwe jest, aby TAF obejmował jego użycie.źródło
Magento używa modelu danych o nazwie „Wartość atrybutu jednostki” dla wielu swoich funkcji (klientów, produktów itp.). To pozwala dynamicznym atrybutom w systemie bez konieczności restrukturyzacji i modyfikowania tabel w locie. EAV Na Wikipedii
źródło