Magento的表有三百多張,以實體、屬性、值(EAV)的數據庫結構難以掌握,加上缺少有關EAV的文檔,以至許多人不知道這種EAV方式的好處以及它對magento來說的重要性,在這里作為一名magento開發者,讓我們來了解下,它是如何工作的并且對我們有什么好處。
?
什么是EAV呢?
EAV是實體(Entity)、屬性(Attribute)、值(Value)的意思,接下來來看看每一部分以便更好的理解它。
?
實體(Entity)
實體指的是magento的數據對象,如產品、分類目錄、客戶、訂單等,每一個實體在數據庫中都對應著一條實體記錄。
?
屬性(Attribute)
屬性是指跟實體相關的一些性質數據,如產品實體有名稱、價格、狀態等。
?
值(Value)
值是最容易理解的了,就是指屬性的值了。
?
EAV是怎么工作的呢?
一直以來,數據庫其實很簡單的,比如我們現在要設計一個商城,需要有一張產品表,包括所有產品的信息,另一張表包括分類信息,也許還要一張表來連接這兩張,這樣很容易理解吧,然而magento卻不一樣,它跟產品以及分類有關的表有40多張,要想知道為什么,讓我們來看下產品表。
?
不像其它的商城那樣,所有的產品信息在一張表里,magento把產品信息分離在子表中,最頂上的表是catalog_product_entity,如果你看過這張表,你肯定發現了,它只包括產品的一些基礎信息,除了SKU,其它你看不到任何有用的信息,幸運地是使用這張表你將可以從屬性和值表中看到完整的產品記錄。
?
讓我們開始新建一條完整的產品記錄,你需要將屬性與我們的實體表相關聯,做這之前先看下表eav_attribute,這張表在magento里為所有不同的實體存儲了所有的屬性,打開表,你會看到里面有好幾百條不同屬性的記錄,為什么有些名稱還是一樣的呢?困惑吧?magento是如何辨別的呢?很快你就會注意到entity_type_id,每一個實體都會有一個entity_type_id,為了找出來,那就再回來catalog_product_entity表,看entity_type_id字段,你會發現所有的記錄值都是10,如果你有去看catalog_category_entity,你將會看到一個不同的entity_type_id值。根據這個值和attribute code你就可以找到所有產品的屬性,當然也可以所有其它實體的屬性了。
?
思考下下面的查詢:
# 找出所有產品的屬性 SELECT attribute_code FROM eav_attribute WHERE entity_type_id = 10;
?
# 找出單個產品的屬性 SELECT attribute_code FROM eav_attribute WHERE entity_type_id = 10 AND attribute_code = 'name';?
你得到屬性和實體了吧。接下來了解下值,值被分離在不同的表中,讓我們看下所有前綴是catalog_product_entity的表,值是根據它們的類型來分的,例如,所有的價格以及其它decimal屬性的會存儲在表catalog_product_entity_decimal中,另外所有文本類型數據會存儲在catalog_product_varchar中,需要指出的是每個屬性存儲的表,magento在eav_attribute表中使用字段backend_type記錄,如果你運行以下查詢,你將可以找到產品屬性'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中,你認為下面的查詢會存儲在哪呢?想一想,然后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是因為它相比其它普通的數據庫結構要更容易擴展。開發者不用編輯核心數據庫結構就可以為任何實體添加屬性,并且當自定義的屬性被添加后,不需要添加任何邏輯讓magento保存它,因為這些在模型中都已經存在了,只要數據和屬性創建后,模型就會保存了。
?
EAV有什么缺點呢?
最主要的就是它的速度了,由于實體數據都是碎片式的,建立一個完整的實體記錄需要許多表聯合查詢。幸運地是Varien團隊開發了個優秀的緩存系統,允許開發者緩存那些不常改變的信息。
?
另一個問題就是學習的風險,很多開發人員學習到半途就放棄了,對于這還真沒有什么捷徑,希望我們共同征服它吧!
?
總結
實體、屬性、值是很好的一種數據庫結構,也是學習magento很關鍵的一部分,因此對于開發者來說,明白它是如何工作的就顯的十分重要了。
?
?
?
?
來源: http://www.vipinit.com/index/article-158.html
?
參考: http://www.magereverse.com/
?
?
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
