黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

Magento數(shù)據(jù)庫結(jié)構(gòu):EAV

系統(tǒng) 2310 0

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/

?

?

?

Magento數(shù)據(jù)庫結(jié)構(gòu):EAV


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論