Mục đích của các bảng 'eav_'


19

Tôi đã luôn tự hỏi ý nghĩa của các bảng là gì:

eav_entity  
eav_entity_datetime
eav_entity_decimal
eav_entity_int
eav_entity_store
eav_entity_text

Chúng luôn trống rỗng. Chúng được tạo trong các phiên bản trước 1.6 app/code/core/Mage/Eav/sql/eav_setup/mysql4-install-0.7.0.phpvà sau đó chúng được chuyển sang tập lệnh cài đặt cho các phiên bản 1.6+ /app/code/core/Mage/Eav/sql/eav_setup/install-1.6.0.0.php
Tôi thấy rằng có một mô hình tài nguyên được liên kết với một trong các bảng Mage_Eav_Model_Resource_Entity_Store(có thể có các bảng khác) nhưng không có gì xảy ra với / với nó.

Có sử dụng cho các bảng này không hay đây là một "tính năng" khác đã được khởi động và không được triển khai như phiên bản bố cục hoặc mẩu bánh mì quản trị chẳng hạn.


3
Khi tôi bắt đầu học Magento và đặc biệt là EAV, tôi thấy rằng các bảng này luôn trống. Tôi đã cố gắng tìm kiếm trực tuyến nhưng không bao giờ có bất kỳ câu trả lời cụ thể là tốt. Tôi nghĩ rằng nó có thể là một định nghĩa hoặc bảng tham chiếu cho các bảng thực thể khác. Nhưng bây giờ tôi cũng háo hức chờ đợi câu trả lời. Cảm ơn câu hỏi này. :)
MagentoBoy

@MagentoBoy. Tôi cũng đã thấy sau đó khi tôi bắt đầu làm việc với Magento, trong khi tôi đang cố gắng quấn đầu quanh cơ sở dữ liệu. Tôi đã hơn 5 năm và tôi vẫn còn hoang mang.
Marius

..nhưng các bạn thực sự có kỹ năng tốt về magento .. Đôi khi, tôi cũng sử dụng tài liệu tham khảo của mình để tìm hiểu và trong mã của mình .. Đã khoảng 7 đến 8 tháng cho magento và 11 tháng cho trải nghiệm php Nhưng vẫn cảm thấy như tôi là người mới bắt đầu chơi magento và cần học rất nhiều ..
MagentoBoy

Câu trả lời:


17

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_Customermở 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_Customercũng được mở rộng Mage_Eav_Model_Entity_Abstract, Nguồn .

Nếu chúng ta kiểm tra Mage_Eav_Model_Entity_Abstractlớp chúng ta tìm thấy một getEntityTablephươ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, *_varcharvà vân vân.

Nhìn trộm vào nguồn cho các phương thức đó ( ở đâyở đâ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_entitybả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_typebảng cho value_table_prefixcộ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ỏ.


1
Cảm ơn đã giải thích. Đủ tôt cho tôi. Tôi sẽ cố gắng tạo ra một thực thể sử dụng các bảng này, chỉ để cho vui.
Marius

6

Xem xét bit mã này trong mô hình tài nguyên EAV cơ sở.

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

Phương thức này lấy tên bảng thực thể cơ sở để sử dụng để lưu trữ. Vì vậy, đối với mô hình tài nguyên của sản phẩm, phương thức này sẽ trả về catalog_product_entity(giả sử không có tiền tố tên bảng nào được đặt)

Bốn dòng này là tiết lộ nhất.

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

Nếu thực thể không có tập hợp bảng, hằng số sau được sử dụng

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

Đây eav/entitychuỗi sau đó được sử dụng để tìm kiếm một tên bảng

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

Mà lấy tên bảng từ cấu hình.

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

À ha! Nếu một loại thực thể eav không có bộ tên bảng, thì Magento sẽ sử dụng các eav_entitybảng làm vị trí lưu trữ mặc định.

Nhóm kỹ sư Magento ban đầu say mê khái niệm EAV - trong khi Magento hiện đại đã thu nhỏ lại, các mô hình EAV là giải pháp ưa thích cho nhiều vấn đề.

Có vẻ hợp lý khi giả định / suy đoán việc triển khai EAV trước khi phát hành ban đầu được lưu trữ tất cả dữ liệu trong bảng eav_entityloại trung tâm này (một mẫu chung trong nền tảng doanh nghiệp) và các loại thực thể xuất hiện sau đó.

Một khả năng (hấp dẫn) khác là tính năng này được dự định để kích hoạt các mô hình CRUD "không cần thẻ". Về lý thuyết, có thể chèn thông tin loại EAV chính xác, thiết lập các lớp mô hình / tài nguyên / bộ sưu tập của bạn và có dữ liệu được lưu trữ trong các eav_entitybảng này . Magento rời khỏi EAV và tập trung sau khi ra mắt vào nhóm kỹ sư về các tính năng của người dùng cuối có nghĩa là tính năng này mờ dần vào màn sương. Mặc dù tôi tò mò nếu điều này hoạt động, tôi sẽ không muốn dựa vào nó vì nó không phải là một con đường mã nhận được nhiều sự chú ý và nghi ngờ rằng TAF bao gồm việc sử dụng nó.


1
Cảm ơn vì lời giải thích chi tiết. Tôi chắc chắn sẽ thử xây dựng một mô-đun với thực thể "không cần thẻ" để xem nó có hoạt động không. +1 từ tôi. Nhưng tôi cảm thấy bắt buộc phải chấp nhận câu trả lời được cung cấp bởi @beeplogic nói rằng về cơ bản những điều tương tự. Anh nhanh hơn 5 phút.
Marius

-1

Magento sử dụng mô hình dữ liệu gọi là "Giá trị thuộc tính thực thể" cho nhiều chức năng của nó (khách hàng, sản phẩm, v.v.). Đây là những gì cho phép các thuộc tính động trong hệ thống mà không phải cơ cấu lại và thay đổi các bảng một cách nhanh chóng. EAV trên Wikipedia


Cảm ơn, nhưng điều này không thực sự trả lời câu hỏi. Thực thể nào sử dụng các bảng được đề cập trong câu hỏi? Tôi đã không nói về khách hàng, sản phẩm hoặc danh mục.
Marius
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.