Tôi đoán là đó là một phần di sản và một mẫu "tiện lợi" cho các nhà phát triển để triển khai các thực thể / mô hình "chung chung".
Như bạn đã nói, các bảng liên quan thường trống. Lý do là không có thực thể EAV cốt lõi nào sử dụng cấu trúc bảng thực thể "mặc định" này. Đây là các bảng thực thể từ bản cài đặt 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)
Sử dụng mô hình Khách hàng làm ví dụ, chúng ta có thể thấy rằng mô hình tài nguyên Mage_Customer_Model_Resource_Customer
mở rộng Mage_Eav_Model_Entity_Abstract
, Nguồn .
Lưu ý : Trước 1.6, mô hình tài nguyên cho thực thể khách hàng Mage_Customer_Model_Entity_Customer
cũng được mở rộng Mage_Eav_Model_Entity_Abstract
, Nguồn .
Nếu chúng ta kiểm tra Mage_Eav_Model_Entity_Abstract
lớp chúng ta tìm thấy một getEntityTable
phương thức. Phương pháp này được sử dụng để xác định bảng nào sẽ được sử dụng khi xây dựng truy vấn trong các hoạt động CRUD phổ biến. Một phương pháp khác được quan tâm là getValueTablePrefix
. Nó xác định tiền tố cho các bảng dữ liệu cho "loại" bảng, *_datetime
, *_decimal
, *_varchar
và vân vân.
Nhìn trộm vào nguồn cho các phương thức đó ( ở đây và ở đây ).
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;
}
Trong phương thức trên, chúng ta có thể thấy rằng nếu loại thực thể không xác định bảng tùy chỉnh thì nó mặc định là Mage_Eav_Model_Entity::DEFAULT_ENTITY_TABLE
. Giá trị của hằng số đó là 'eav/entity'
, lần lượt được chuyển thành eav_entity
bảng (giả sử không có tiền tố bảng được cấu hình trong ứng dụng). Phương thức thứ hai mà tôi đã đề cập rơi vào bảng này dưới dạng tiền tố nếu không có cấu hình nào cho thực thể đã cho. Nếu bạn kiểm tra các giá trị trong eav_entity_type
bảng cho value_table_prefix
cột, bạn sẽ nhận thấy rằng tất cả chúng 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;
}
Logic trong phương thức khá đơn giản, nếu không có tiền tố giá trị được xác định, hãy sử dụng tên bảng thực thể làm tiền tố.
Tôi cho rằng vì các bảng này đã ở Magento quá lâu nên tốt nhất là để chúng ở bất kỳ khả năng tương thích ngược nào hơn là loại bỏ chúng hoàn toàn. Ý tưởng mà tôi tin rằng họ sẽ thực hiện là một cấu trúc mô hình / thực thể dễ sử dụng mà các nhà phát triển khác có thể mở rộng một vài lớp và có các thuộc tính "động" này có thể được thay đổi thông qua quản trị viên (xem các sản phẩm danh mục và mô hình khách hàng). Thật không may, việc thực hiện và thực hành mô hình đã nói dường như không mở rộng tốt và dẫn đến các vấn đề. Tôi chưa bao giờ thấy cấu trúc này được sử dụng trong tự nhiên, có thể là do thiếu tài liệu và các trường hợp sử dụng ví dụ hoặc hiệu suất kém.
Tôi không phải là nhà phát triển cốt lõi (hay nhà khảo cổ học) nhưng đó là những gì tôi thu thập được từ mã và cấu trúc dữ liệu, hy vọng nó sẽ giúp làm sáng tỏ.