2010-07-22 47 views
0

開始:我不是Zend Framework的專家,並且做了一些可怕的錯誤。我確信這一點。我認爲我的設計模式有問題。如何在Zend Framework中處理數據庫訪問?

舉個例子: 我建立准入管理與Zend_Acl裏(訪問控制列表)

有三個數據庫中的表: 角色 資源 權限

權限表處理中的作用資源關係。

我爲每個表做了一個模型,它擴展了Zend_Db_Table_Abstract。到現在爲止還挺好。

現在在ACL中,我加載頁面請求上的資源,角色和權限並將其添加到ACL中。 現在,我做錯了一部分:我這樣做的方式是從tablemodels調用方法,給我所需的數據。但是當我查看我的分析器時,它需要117個選擇查詢,並且需要0.7秒才能加載ACL。尚未查詢底層系統。這不好,我相信有更好的方法。我無法在谷歌或任何地方找到任何關於此的信息。

有人能告訴我我做錯了什麼,如果我是,我應該加快速度?我應該將一切查詢加載到模型並讓它們處理它嗎?我該怎麼做,有沒有例子?

在此先感謝!

回答

0

目前尚不清楚你在做什麼,但你不應該抓住生成這麼多的查詢。

有些事情要考慮:

你需要加載在每次請求的全部ACL?也許你可以構建數據訪問層,以便在用戶嘗試執行某些操作時檢查相關權限。

如果你需要完整的ACL,你應該能夠建立一個查詢獲取所有的相關數據。也許迴避這裏的Zend_Table的東西,只是執行一個原始的自定義查詢?不完全是最佳做法,但如果你加載了所有內容,那只是一個查詢。

更具體的代碼在你的問題肯定會產生更具體的答案。

0

如果你確實需要加載所有的東西,爲什麼不加載它只是一次,並序列化你的acl對象,並保持它在會話或緩存?

每當你需要訪問你的ACL對象,檢查緩存或會話變量被設置與否的時間。如果已設置,則可以避免運行查詢,並僅從會話或緩存中反序列化對象。

我同意這是一個骯髒的解決方案,但它的工作原理,並不會運行117個查詢各一次。