Magento的表有三百多張,以實(shí)體、屬性、值(EAV)的數(shù)據(jù)庫結(jié)構(gòu)難以掌握,加上缺少有關(guān)EAV的文檔,以至許多人不知道這種EAV方式的好處以及它對magento來說的重要性,在這里作為一名magento開發(fā)者,讓我們來了解下,它是如何工作的并且對我們有什么好處。
?
什么是EAV呢?
EAV是實(shí)體(Entity)、屬性(Attribute)、值(Value)的意思,接下來來看看每一部分以便更好的理解它。
?
實(shí)體(Entity)
實(shí)體指的是magento的數(shù)據(jù)對象,如產(chǎn)品、分類目錄、客戶、訂單等,每一個實(shí)體在數(shù)據(jù)庫中都對應(yīng)著一條實(shí)體記錄。
?
屬性(Attribute)
屬性是指跟實(shí)體相關(guān)的一些性質(zhì)數(shù)據(jù),如產(chǎn)品實(shí)體有名稱、價格、狀態(tài)等。
?
值(Value)
值是最容易理解的了,就是指屬性的值了。
?
EAV是怎么工作的呢?
一直以來,數(shù)據(jù)庫其實(shí)很簡單的,比如我們現(xiàn)在要設(shè)計一個商城,需要有一張產(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í)體存儲了所有的屬性,打開表,你會看到里面有好幾百條不同屬性的記錄,為什么有些名稱還是一樣的呢?困惑吧?magento是如何辨別的呢?很快你就會注意到entity_type_id,每一個實(shí)體都會有一個entity_type_id,為了找出來,那就再回來catalog_product_entity表,看entity_type_id字段,你會發(fā)現(xiàn)所有的記錄值都是10,如果你有去看catalog_category_entity,你將會看到一個不同的entity_type_id值。根據(jù)這個值和attribute code你就可以找到所有產(chǎn)品的屬性,當(dāng)然也可以所有其它實(shí)體的屬性了。
?
思考下下面的查詢:
# 找出所有產(chǎn)品的屬性
SELECT attribute_code FROM eav_attribute WHERE entity_type_id = 10;
?
# 找出單個產(chǎn)品的屬性
SELECT attribute_code FROM eav_attribute WHERE entity_type_id = 10 AND attribute_code = 'name';
?
你得到屬性和實(shí)體了吧。接下來了解下值,值被分離在不同的表中,讓我們看下所有前綴是catalog_product_entity的表,值是根據(jù)它們的類型來分的,例如,所有的價格以及其它decimal屬性的會存儲在表catalog_product_entity_decimal中,另外所有文本類型數(shù)據(jù)會存儲在catalog_product_varchar中,需要指出的是每個屬性存儲的表,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值被存儲在表catalog_product_entity_varchar中,你認(rèn)為下面的查詢會存儲在哪呢?想一想,然后copy it看下你對了沒。
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)建后,模型就會保存了。
?
EAV有什么缺點(diǎn)呢?
最主要的就是它的速度了,由于實(shí)體數(shù)據(jù)都是碎片式的,建立一個完整的實(shí)體記錄需要許多表聯(lián)合查詢。幸運(yùn)地是Varien團(tuán)隊(duì)開發(fā)了個優(yōu)秀的緩存系統(tǒng),允許開發(fā)者緩存那些不常改變的信息。
?
另一個問題就是學(xué)習(xí)的風(fēng)險,很多開發(fā)人員學(xué)習(xí)到半途就放棄了,對于這還真沒有什么捷徑,希望我們共同征服它吧!
?
總結(jié)
實(shí)體、屬性、值是很好的一種數(shù)據(jù)庫結(jié)構(gòu),也是學(xué)習(xí)magento很關(guān)鍵的一部分,因此對于開發(fā)者來說,明白它是如何工作的就顯的十分重要了。
?
?
?
?
來源: http://www.vipinit.com/index/article-158.html
?
參考: http://www.magereverse.com/
?
?
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

