Magento数据库结构:EAV (转)
生活随笔
收集整理的這篇文章主要介紹了
Magento数据库结构:EAV (转)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Magento數(shù)據(jù)庫結(jié)構(gòu):EAV (轉(zhuǎn))??
Magento的表有三百多張,以實(shí)體、屬性、值(EAV)的數(shù)據(jù)庫結(jié)構(gòu)難以掌握,加上缺少有關(guān)EAV的文檔,以至許多人不知道這種EAV方式的好處以及 它對(duì)magento來說的重要性,在這里作為一名magento開發(fā)者,讓我們來了解下,它是如何工作的并且對(duì)我們有什么好處。
什么是EAV呢?
EAV是實(shí)體(Entity)、屬性(Attribute)、值(Value)的意思,接下來來看看每一部分以便更好的理解它。
實(shí)體(Entity)
實(shí)體指的是magento的數(shù)據(jù)對(duì)象,如產(chǎn)品、分類目錄、客戶、訂單等,每一個(gè)實(shí)體在數(shù)據(jù)庫中都對(duì)應(yīng)著一條實(shí)體記錄。
屬性(Attribute)
屬性是指跟實(shí)體相關(guān)的一些性質(zhì)數(shù)據(jù),如產(chǎn)品實(shí)體有名稱、價(jià)格、狀態(tài)等。
值(Value)
值是最容易理解的了,就是指屬性的值了。
EAV是怎么工作的呢?
一直以來,數(shù)據(jù)庫其實(shí)很簡(jiǎn)單的,比如我們現(xiàn)在要設(shè)計(jì)一個(gè)商城,需要有一張產(chǎn)品表,包括所有產(chǎn)品的信息,另一張表包括分類信息,也許還要一張表來連接這兩 張,這樣很容易理解吧,然而magento卻不一樣,它跟產(chǎn)品以及分類有關(guān)的表有40多張,要想知道為什么,讓我們來看下產(chǎn)品表。
不像其它的商城那樣,所有的產(chǎn)品信息在一張表里,magento把產(chǎn)品信息分離在子表中,最頂上的表是catalog_product_entity,如 果你看過這張表,你肯定發(fā)現(xiàn)了,它只包括產(chǎn)品的一些基礎(chǔ)信息,除了SKU,其它你看不到任何有用的信息,幸運(yùn)地是使用這張表你將可以從屬性和值表中看到完 整的產(chǎn)品記錄。
讓我們開始新建一條完整的產(chǎn)品記錄,你需要將屬性與我們的實(shí)體表相關(guān)聯(lián),做這之前先看下表eav_attribute,這張表在magento里為所有不 同的實(shí)體存儲(chǔ)了所有的屬性,打開表,你會(huì)看到里面有好幾百條不同屬性的記錄,為什么有些名稱還是一樣的呢?困惑吧?magento是如何辨別的呢?很快你 就會(huì)注意到entity_type_id,每一個(gè)實(shí)體都會(huì)有一個(gè)entity_type_id,為了找出來,那就再回來 catalog_product_entity表,看entity_type_id字段,你會(huì)發(fā)現(xiàn)所有的記錄值都是10,如果你有去看 catalog_category_entity,你將會(huì)看到一個(gè)不同的entity_type_id值。根據(jù)這個(gè)值和attribute code你就可以找到所有產(chǎn)品的屬性,當(dāng)然也可以所有其它實(shí)體的屬性了。
思考下下面的查詢:
# 找出所有產(chǎn)品的屬性
SELECT attribute_code FROM eav_attribute WHERE entity_type_id = 10;?
#?找出單個(gè)產(chǎn)品的屬性?
SELECT attribute_code FROM eav_attribute WHERE entity_type_id =?10 AND attribute_code = 'name';?
你得到屬性和實(shí)體了吧。接下來了解下值,值被分離在不同的表中,讓我們看下所有前綴是catalog_product_entity的表,值是根據(jù)它們的 類型來分的,例如,所有的價(jià)格以及其它decimal屬性的會(huì)存儲(chǔ)在表catalog_product_entity_decimal中,另外所有文本類 型數(shù)據(jù)會(huì)存儲(chǔ)在catalog_product_varchar中,需要指出的是每個(gè)屬性存儲(chǔ)的表,magento在eav_attribute表中使用 字段backend_type記錄,如果你運(yùn)行以下查詢,你將可以找到產(chǎn)品屬性'name’的backend type。
SELECT attribute_code, backend_type FROM eav_attribute WHERE entity_type_id = 4 AND attribute_code = 'name';?
希望以上的查詢返回的是varchar,這就是name的正確類型啦,基于以上,我們可以知道namer值被存儲(chǔ)在表catalog_product_entity_varchar中,你認(rèn)為下面的查詢會(huì)存儲(chǔ)在哪呢?想一想,然后copy it看下你對(duì)了沒。
SELECT e.entity_id AS product_id, var.value AS product_name FROM catalog_product_entity e, eav_attribute eav, catalog_product_entity_varchar varWHERE e.entity_type_id = eav.entity_type_id AND eav.attribute_code = 'name' AND eav.attribute_id = var.attribute_id AND var.entity_id = e.entity_id
為什么使用EAV呢?
使用EAV是因?yàn)樗啾绕渌胀ǖ臄?shù)據(jù)庫結(jié)構(gòu)要更容易擴(kuò)展。開發(fā)者不用編輯核心數(shù)據(jù)庫結(jié)構(gòu)就可以為任何實(shí)體添加屬性,并且當(dāng)自定義的屬性被添加后,不需要添加任何邏輯讓magento保存它,因?yàn)檫@些在模型中都已經(jīng)存在了,只要數(shù)據(jù)和屬性創(chuàng)建后,模型就會(huì)保存了。
EAV有什么缺點(diǎn)呢?
最主要的就是它的速度了,由于實(shí)體數(shù)據(jù)都是碎片式的,建立一個(gè)完整的實(shí)體記錄需要許多表聯(lián)合查詢。幸運(yùn)地是Varien團(tuán)隊(duì)開發(fā)了個(gè)優(yōu)秀的緩存系統(tǒng),允許開發(fā)者緩存那些不常改變的信息。
另一個(gè)問題就是學(xué)習(xí)的風(fēng)險(xiǎn),很多開發(fā)人員學(xué)習(xí)到半途就放棄了,對(duì)于這還真沒有什么捷徑,希望我們共同征服它吧!
總結(jié)
實(shí)體、屬性、值是很好的一種數(shù)據(jù)庫結(jié)構(gòu),也是學(xué)習(xí)magento很關(guān)鍵的一部分,因此對(duì)于開發(fā)者來說,明白它是如何工作的就顯的十分重要了。
歡迎一起交流,祝你好運(yùn)!
源地址:
http://www.vipinit.com/index/article-158.html
本人:很感謝這位同學(xué)的研究,作為一個(gè)入門,在某個(gè)部位深入淺出,寫的很好,再次感謝.
總結(jié)
以上是生活随笔為你收集整理的Magento数据库结构:EAV (转)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Kubernetes利用CNI-brid
- 下一篇: db mysql error_list