'eav_'테이블의 목적


19

나는 항상 테이블의 의미가 무엇인지 궁금했습니다.

eav_entity  
eav_entity_datetime
eav_entity_decimal
eav_entity_int
eav_entity_store
eav_entity_text

그들은 항상 비어 있습니다. 1.6 이전 버전에서 생성 된 app/code/core/Mage/Eav/sql/eav_setup/mysql4-install-0.7.0.php이후 버전 1.6+의 설치 스크립트 /app/code/core/Mage/Eav/sql/eav_setup/install-1.6.0.0.php
로 이동했습니다. 테이블 중 하나에 링크 된 자원 모델 Mage_Eav_Model_Resource_Entity_Store이 있지만 다른 테이블 이있을 수는 있습니다.

이러한 테이블에 대한 사용이 있습니까, 아니면 예를 들어 레이아웃 버전 이나 관리 사이트 이동 경로 와 같이 시작되고 구현되지 않은 다른 "기능"입니까?


3
Magento 및 특히 EAV를 배우기 시작했을 때이 테이블이 항상 비어 있음을 알았습니다. 온라인 검색을 시도했지만 지정된 답변을 얻지 못했습니다. 다른 엔터티 테이블에 대한 정의 또는 참조 테이블이라고 생각했습니다. 그러나 지금도 열심히 답변을 기다리고 있습니다. 이 질문에 감사드립니다. :)
MagentoBoy

@MagentoBoy. 나는 또한 Magento로 작업을 시작했을 때 데이터베이스 주위에 머리를 감쌀 때를 보았습니다. 나는 5 세 이상이었고 여전히 의아해합니다.
Marius

.. 그러나 여러분들은 정말 magento에 대한 좋은 기술을 가지고 있습니다 .. 때때로, 나는 당신의 참고 문헌을 사용하여 배우고 코드를 작성하기도합니다. magento의 초보자이며 많은 것을 배울 필요가 있습니다 ..
MagentoBoy

답변:


17

내 생각 엔 개발자가 "일반적인"엔터티 / 모델을 구현할 수있는 레거시이며 "편의성"패턴이라고 생각합니다.

언급했듯이 관련 테이블은 일반적으로 비어 있습니다. 핵심 EAV 엔터티가이 "기본"엔터티 테이블 구조를 사용하지 않기 때문입니다. 다음은 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)

예를 들어 고객 모델을 사용하여, 우리는 자원 모델이 있음을 알 수 Mage_Customer_Model_Resource_Customer확장 Mage_Eav_Model_Entity_Abstract, 소스 .

참고 : 고객 기업에 대한 이전 1.6 자원 모델이되었다 Mage_Customer_Model_Entity_Customer또한 확장하는 Mage_Eav_Model_Entity_Abstract, 소스 .

Mage_Eav_Model_Entity_Abstract클래스를 살펴보면 getEntityTable메소드 가 발견 됩니다. 이 방법은 일반적인 CRUD 작업 중에 쿼리를 작성할 때 사용할 테이블을 결정하는 데 사용됩니다. 관심있는 다른 방법은 getValueTablePrefix입니다. 이 데이터 "타입"테이블에 대한 테이블 접두사 결정 *_datetime, *_decimal, *_varchar등이있다.

해당 메소드의 소스를 엿보기 ( herehere ).

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

위의 방법에서 엔티티 유형이 사용자 정의 테이블을 정의하지 않으면 기본값이로 설정되어 있음을 알 수 Mage_Eav_Model_Entity::DEFAULT_ENTITY_TABLE있습니다. 해당 상수의 값은입니다 ( 'eav/entity'이것은 차례로 eav_entity테이블 로 바뀝니다 (응용 프로그램에 구성된 테이블 접두사가 없다고 가정)). 내가 언급 한 두 번째 방법은 주어진 엔티티에 대해 아무것도 구성되지 않은 경우이 테이블에서 접두사로 대체됩니다. 열의 eav_entity_type표 값을 검사하면 모두 값 value_table_prefix임을 알 수 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;
    }

값 접두어가 정의되지 않은 경우 메소드의 논리는 다소 단순하며 엔티티 테이블 이름을 접두어로 사용하십시오.

나는이 테이블이 오랫동안 Magento에 있었기 때문에 완전히 제거하는 것보다 이전 버전과의 호환성을 유지하는 것이 가장 좋습니다. 내가 생각한 아이디어는 다른 개발자가 몇 가지 클래스를 확장하고 관리자를 통해 변경 될 수있는 이러한 "동적"속성을 가질 수있는 사용하기 쉬운 엔티티 / 모델 구조였습니다 (카탈로그 제품 및 고객 모델 참조). 불행하게도 상기 패턴의 구현 및 실행은 잘 확장되지 않고 문제를 야기한다. 필자는 문서와 예제 사용 사례가 없거나 성능이 좋지 않기 때문에이 구조를 야생에서 사용한 적이 없었습니다.

나는 핵심 개발자 (또는 고고학자)는 아니지만 코드 및 데이터 구조에서 수집 한 것이므로 약간의 빛을 발산하는 데 도움이되기를 바랍니다.


1
설명 주셔서 감사합니다. 나를 위해 충분합니다. 이 테이블을 사용하는 엔터티를 만들려고 노력할 것입니다.
Marius

6

기본 EAV 자원 모델에서이 코드 비트를 고려하십시오.

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

이 메소드는 스토리지에 사용할 기본 엔티티 테이블 이름을 가져옵니다. 따라서 제품의 자원 모델에 대해이 메소드는 리턴합니다 catalog_product_entity(테이블 이름 접 두부가 설정되지 않은 경우).

이 네 줄이 가장 공개적입니다.

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

엔티티에 테이블 세트가없는 경우 다음 상수가 사용됩니다.

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

eav/entity문자열은 테이블 이름을 찾는 데 사용됩니다

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

구성에서 테이블 이름을 뽑습니다.

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

아하! eav 엔티티 유형에 테이블 이름이 설정되어 있지 않으면 Magento는 eav_entity테이블을 기본 스토리지 위치로 사용합니다 .

최초의 Magento 엔지니어링 팀은 EAV 개념에 매료되었습니다. 현대 Magento는이를 다시 축소했지만 EAV 모델은 많은 문제에 대한 기본 솔루션이었습니다.

초기 시험판 EAV 구현 이이 중앙 유형 테이블 (엔터프라이즈 플랫폼의 공통 패턴)에 모든 데이터를 저장했다고 가정 / 추정하는 것이 합리적으로 보이고 eav_entity엔티티 유형은 나중에 나왔습니다.

또 다른 (권장) 가능성은이 기능이 "테이블리스"CRUD 모델을 가능하게하기위한 것입니다. 이론적으로 올바른 EAV 유형 정보를 삽입하고 모델 / 자원 / 수집 클래스를 설정하고이 eav_entity테이블에 데이터를 저장할 수 있습니다. Magento는 EAV에서 멀어졌으며 최종 사용자 기능에 대한 엔지니어링 팀에 대한 출시 후 초점은이 기능이 안개로 사라졌습니다. 이것이 효과가 있는지 궁금하지만, 많은 관심을 얻은 코드 경로가 아니기 때문에 TAF에 의존하고 싶지 않으며 TAF가 그 사용을 다루는 것은 의심의 여지가 있습니다.


1
자세한 설명을 주셔서 감사합니다. 분명히 "tableless"엔터티가있는 모듈을 작성하여 작동하는지 확인하려고합니다. 나에게서 +1 그러나 @beeplogic이 제공하는 답변을 기본적으로 똑같은 내용으로 수락해야한다고 생각합니다. 그는 5 분 더 빨랐다.
Marius

-1

Magento는 많은 기능 (고객, 제품 등)에 "엔터티 속성 값"이라는 데이터 모델을 사용합니다. 이것은 테이블을 즉시 재구성하고 변경하지 않고도 시스템의 동적 속성을 허용합니다. 위키 백과에 EAV


감사합니다, 그러나 이것은 실제로 질문에 대답하지 않습니다. 질문에 언급 된 표를 사용하는 엔터티는 무엇입니까? 고객, 제품 또는 카테고리에 대해서는 이야기하지 않았습니다.
Marius
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.