Dalam publikasi ini, saya akan meninjau struktur data Magento 2 yang mendukung konsep seperti EAV . Pengembang terkadang perlu keluar dari belantara kode dan mencoba mensurvei tempat tinggal mereka dari ketinggian penerbangan elang - ini memungkinkan Anda untuk fokus pada hal-hal yang benar-benar penting atau hanya besar. Jadi saya keluar.

Singkatan EAV diungkapkan sebagai Entitas - Atribut - Nilai (ini untuk mereka yang tidak mengikuti tautan di atas). " Plus " utama dari EAV adalah penggunaan ruang database yang efisien dalam kasus-kasus di mana kemungkinan jumlah atribut yang berbeda (properti, parameter) yang dapat digunakan untuk menggambarkan hal-hal (entitas) sangat luas, tetapi jumlah atribut, yang sebenarnya merujuk pada objek individual relatif kecil. Contoh yang baik dari kasus seperti itu dalam e-commerce adalah konsep "produk" - atribut signifikan dari produk " TV " (ukuran layar) berbeda dari atribut signifikan dari produk " kantong tidur " (suhu nyaman minimum).
Jadi apa yang ditawarkan Magento 2 untuk menyimpan data dalam format EAV?
namespace 'eav_'
Dalam database Magento 2.3 yang eav_
, ada 21 tabel dengan awalan eav_
. Semuanya dapat dibagi menjadi tiga kelompok:
eav_attribute
eav_entity
eav_form
Cara termudah adalah dengan eav_form
- tabel ini berhubungan dengan tampilan beberapa data EAV pada UI dan tidak berhubungan langsung dengan penempatan data EAV dalam database (saya hanya mempertimbangkan struktur data dan hanya dari sudut pandang penyimpanan informasi, bukan tampilan). Untuk percobaan, saya menghapus eav_form
ruang eav_form
dari database dan ini tidak menghentikan saya untuk melakukan pemesanan di toko. Jadi Anda masih perlu mencari di mana data dari ruang tabel ini digunakan dan berapa yang dibutuhkan untuk Magento berfungsi.
Dari dua yang tersisa, grup eav_attribute
merujuk ke huruf A (ttribute) , dan grup eav_entity
ke huruf E (ntity) . Di mana huruf V (alue) ?
Nilai untuk atribut entitas harus dicari dalam sufiks nama tabel:
_datetime
_decimal
_int
_text
_ varchar
Anda dapat melihat tabel yang dimulai dengan:
catalog_category_entity_
catalog_product_entity_
customer_address_entity_
customer_entity_
eav_entity_
Penggandaan sederhana jumlah sufiks (5) dengan jumlah awalan (5) memberi kita jumlah total tabel (25) di mana data nilai seharusnya disimpan.
'eav_entity_type': registri tipe entitas
Awal dari EAV di Magento perlu ditemukan di tabel eav_entity_type
. Di sinilah menetapkan jenis nilai atribut entitas apa yang akan disimpan dalam struktur EAV. Jadi, awalnya Magento 2.3 menawarkan opsi ini untuk delapan entitas berikut:
customer
customer_address
catalog_category
catalog_product
order
invoice
creditmemo
shipment
'eav_attribute': registry atribut
Langkah selanjutnya adalah mencari tahu atribut apa yang bisa dikarakterisasi oleh jenis entitas ini. Informasi ini ada di tabel eav_attribute
. Registri atribut memiliki penutupan pada daftar jenis entitas dengan kunci asing . Dalam atribut registry, awalnya 135 entri milik 4 jenis entitas:
Jangan gunakan struktur EAV untuk menyimpan data. Yaitu, pada tahap tertentu, antusiasme hadir dan penggunaan EAV direncanakan untuk delapan jenis entitas, tetapi pada kenyataannya mereka berhenti pada 4.
'eav_entity_': ghost space
Ruang tabel eav_entity
menyerupai kota hantu Cina - dari 9 tabel ruang, hanya dua yang berisi data:
eav_entity_type
: ini adalah daftar tipe entitas yang saya sebutkan di atas;eav_entity_attribute
: digunakan untuk mengatur atribut dalam grup (lebih dekat dengan tampilan data daripada penyimpanannya); informasi ini berhubungan lebih langsung dengan atribut-atribut itu sendiri daripada dengan entitas (mis., jelas bukan dari paroki ini - ia memiliki tempat di ruang eav_attribute_
);
7 tabel sisanya kosong:
eav_entity
eav_entity_datetime
eav_entity_decimal
eav_entity_int
eav_entity_store
eav_entity_text
eav_entity_varchar
Ini sangat mirip dengan mencoba menyatukan cara menyimpan nilai untuk atribut entitas dalam satu set tabel ( datetime
, decimal
, int
, text
, varchar
) alih-alih memiliki 5 tabel dengan sufiks yang sesuai untuk setiap jenis entitas. Pada upaya yang gagal? Atau apakah ini masa depan EAV di Magento?

Bagaimanapun Bumi tidak berbentuk dan kosong, dan kegelapan berada di atas jurang maut, dan Roh Allah tabel ini awalnya tidak digunakan.
Jenis Nilai Atribut
Jenis eav_entity_type
ditetapkan dalam tabel eav_attribute
, eav_attribute
atribut itu sendiri dan pengikatannya dengan jenis entitas yang sesuai diatur dalam tabel eav_attribute
. Dan bagaimana menentukan di mana mencari nilai untuk atribut seperti entitas seperti itu?
Bidang eav_attribute.backend_type
akan membantu kami dalam hal ini. Ini menunjukkan di mana nilai atribut disimpan:
- statis : di tabel dengan data tentang entitas itu sendiri (misalnya, nilai untuk atribut # 9 -
customer.email
, Anda perlu mencari di tabel customer_entity di kolom email
);
Untuk tipe yang tersisa, nilainya disimpan dalam tabel terpisah, dengan nama yang awalannya sesuai dengan tipe entitas ( customer_
, ...) dan sufiks ke salah satu tipe data:
datetime
decimal
int
text
varchar
Yaitu, nilai untuk atribut # 79 catalog_product.special_from_date
tipe datetime
disimpan dalam tabel catalog_product_entity_datetime
. Nilai untuk atribut # 77 catalog_product.price
berada di tabel catalog_product_entity_decimal
.
Apa yang menarik untuk dilihat di tabel eav_attribute
dalam kaitannya dengan tipe nilai? Seperti yang saya catat di atas, tabel ini menjelaskan atribut hanya untuk 4 dari 8 jenis entitas yang terdaftar di eav_entity_type
. Pada saat yang sama, untuk entitas seperti customer
dan customer_address
semua atribut yang awalnya didefinisikan adalah tipe nilai static
- yaitu, mereka adalah kolom biasa dalam tabel dan tidak mengambil keuntungan dari pendekatan EAV. Tabel:
customer_entity_datetime
customer_entity_decimal
customer_entity_int
customer_entity_text
customer_entity_varchar
customer_address_entity_datetime
customer_address_entity_decimal
customer_address_entity_int
customer_address_entity_text
customer_address_entity_varchar
awalnya kosong dan hanya dapat digunakan secara programatik (mis., melalui panel admin, tanpa ekstensi pihak ketiga, tidak ada cara untuk menulis apa pun ke tabel ini).
EAV untuk kategori
Kategori katalog - ini adalah entitas pertama yang kurang lebih menggunakan pendekatan EAV di Magento. Jenis entitas adalah catalog_category
, total atribut awal adalah 30, yang non-statis - 26. Artinya, hanya 4 atribut ( children_count
, level
, path
, position
) disimpan dalam tabel catalog_category_entity
, sisanya disimpan di catalog_category_entity_
[ datetime
| decimal
| int
| text
| varchar
].
Struktur tabel dari himpunan ini sangat mirip satu sama lain dan dengan tabel serupa dari jenis entitas lainnya (klien, alamat mereka, dll.):
CREATE TABLE `catalog_category_entity_datetime` ( `value_id` int(11) NOT NULL AUTO_INCREMENT, `attribute_id` smallint(5) unsigned NOT NULL DEFAULT '0', `store_id` smallint(5) unsigned NOT NULL DEFAULT '0', `entity_id` int(10) unsigned NOT NULL DEFAULT '0', `value` datetime DEFAULT NULL, PRIMARY KEY (`value_id`), UNIQUE KEY `...` (`entity_id`,`attribute_id`,`store_id`), ... ) ...
Untuk berbagai jenis nilai yang disimpan ( datetime
, decimal
, int
, text
, varchar
), hanya jenis kolom value
berubah. Struktur ini memungkinkan Anda untuk menyimpan nilai ( value
) terpisah dari atribut terpisah ( attribute_id
) dari entitas terpisah ( entity_id
) untuk etalase yang terpisah ( store_id
).
Sehubungan dengan fitur arsitektur Magento, koneksi tambahan dengan etalase store_id
- store_id
. Dengan demikian, dimungkinkan untuk melokalkan nilai atribut yang sama dari entitas yang sama untuk etalase yang berbeda. Kategori katalog adalah entitas pertama di Magento yang Anda dapat menggunakan subsistem EAV langsung di luar kotak. Anda dapat menetapkan nilai untuk atribut direktori melalui panel admin.

Anda tidak hanya dapat memberikan nilai yang berbeda untuk atribut teks, menerjemahkan ke dalam bahasa etalase yang sesuai, tetapi juga melokalkan atribut jenis lain. Misalnya, untuk mengantisipasi liburan Natal di etalase toko untuk atribut catalog_category.custom_design_from
Anda dapat menetapkan nilai pada 7 Januari tahun depan, dan di etalase toko pada 24 Desember ini.

EAV untuk produk
Secara umum, ini adalah jenis entitas yang sama dengan yang diluncurkan EAV di Magento. Jenis entitas adalah catalog_product
, dari total atribut awal - 63, yang non-statis - 56. Struktur tabel yang mendukung EAV untuk produk mirip dengan struktur tabel untuk katalog. Tetapi ada satu perbedaan signifikan. Untuk produk, Anda dapat membuat atribut baru melalui panel admin - ini adalah fungsi Magento default di luar kotak. Jika Magento hanya menyediakan struktur data EAV untuk entitas lain berdasarkan pengisian perangkat lunak mereka, maka untuk produk antarmuka diimplementasikan yang memungkinkan Anda untuk melakukan ini di tingkat pengguna (manajer toko) - Toko / Atribut / Produk .
Untuk produk, ada dua tabel lagi yang terkait dengan EAV:
eav_attribute_set
eav_attribute_group
Pada umumnya, mereka lebih cenderung menampilkan informasi daripada menyimpannya. Atribut produk digabungkan ke dalam satu set
dan, saat membuat produk, seperangkat atribut ditugaskan untuk itu, yang memungkinkan mengisi kartu produk untuk, misalnya, TV, memilih seperangkat atribut yang terkait khusus untuk peralatan rumah tangga (atau bahkan untuk sekelompok produk yang disebut "TV"). Menggabungkan atribut ke dalam set terjadi di Toko / Atribut / Produk / Set Atribut :

Total
IMHO, Magento adalah contoh yang baik dari fakta bahwa kesesuaian menggunakan EAV cukup sempit. Saat membookmark penggunaan EAV untuk 8 entitas ( eav_entity_type
), notasi EAV hanya digunakan untuk 4 entitas ( eav_attribute
), di mana hanya 2 entitas yang benar-benar memiliki atribut EAV - catalog_category
dan catalog_product
. Selain itu, untuk catalog_category
Atribut EAV digunakan bukan untuk tujuan yang dimaksudkan (sejumlah besar atribut yang berbeda untuk menggambarkan suatu entitas dengan sejumlah kecil atribut yang terkait dengan satu contoh ), tetapi untuk "showcase localization" dari nilai-nilai atribut ( set atribut yang sama untuk suatu entitas "Katalog kategori" dengan kemampuan atribut instance memiliki makna yang berbeda untuk etalase yang berbeda ).
Penggunaan penuh EAV hanya digunakan untuk catalog_product
(meskipun ada juga campuran "lokalisasi etalase", tetapi ini merupakan perpanjangan dari model EAV, dan bukan pencemarannya, seperti halnya dengan kategori). Tetapi dengan produk Magento mengungkapkan EAV secara penuh - aplikasi Magento dapat dengan aman digunakan untuk menunjukkan prinsip-prinsip EAV.