Magento 2 EAV: Gambaran Umum Struktur Data

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.


gambar


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:


  • customer
  • customer_address
  • catalog_category
  • catalog_product


    Apa yang sedang dibicarakan ini? Yah, setidaknya itu jenis entitas lain:


  • order
  • invoice
  • creditmemo
  • shipment

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?


gambar


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.


gambar


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.


gambar


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 :


gambar


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.

Source: https://habr.com/ru/post/id441122/


All Articles