簡化多表連接的訪問方式,hanva中的database.service基表映射框架

在Hanva的框架中,多表連接的查詢,一般由以下的方式完成:
1、對於條件限制上的連接,可以直接採用entity讀取,條件上的多表,僅限於條件上的擴充,與一般的單表查詢沒有什麼不同;可以設定list,也可以在entities標簽中直接設定連接條件;
2、對於選定域也是多表的,如果沒有相應的類可選,原則上是依靠database.service把基表的連預先設出來,從而把多表的連接轉化為單表上的連接,簡化了連接操作;
3、其他情況,不反對越過應用層直接使用SQL查詢(還沒有碰到過);

database.service基表轉化系統,在適應原來多表的環境中,是非常關鍵的一個部件,經過近一年的運轉,表明當初的設想是正確的,基本符合應用要求。database.service最早的設想是基於以下幾點:
1、多表連接中最常見的情形是少記錄量的基表和多記錄量的主表的連接;
2、基表的記錄量都比較地少;
3、基表在一個數據庫方案中總是佔了總數的一半以上,對於基表的管理的開發,總是佔用了系統總開發時數的十分一以上,而重復性總是很高,而界面的使用率也是最低的。
4、把數據庫的關系分割成單一的ER後,總是能夠體現出最重要的是主entity的管理,其他部分是極少動作的,包括基表和二級三級子表。

database.service是針對上面幾點的解決方案,主要包括:
1、使用XML放置簡短的基表記錄而不是使用數據庫方案,這樣,就省去了其餘基表的管理部分,使用寫字板就可以完成通常是一次性的管理;
2、基表記錄的訪問量很大,而多表連接意味著多表遍歷,消耗的資源遠遠超過普通的單表連接,因此,把基表記錄放進內存而把多表連接簡化為單表,不但可以簡化應用服務器的工作,也能夠大幅度提高運行效率;
3、對於不便於使用XML文本記錄的類型,支持使用數據庫記錄,然後在有訪問時就把這個基列讀出來,象一般的基表類型一樣工作;如果超過一段時間沒有訪問,就把這個基列清除出內存,騰出空間給即時的其他服務;
4、基表,特別是特殊的基表工作,總是意味著獨立的可抽象的方法,分散到各個模板訪問中實現,會加大各個模板的工作量,把它抽象出來集中到基類服務模塊,可以省卻這部分的工作(可重復調用)。
5、基表系統不考慮子表集合,那是XML/OR構想中解決的課題。

database.service包括以下類組件:
一、MemoryBase:
顧名思義,就是單純存放在內存中的Base類,實際上在啟動、訪問前是存放在xml文件中,由XML結構保存的等同於原數據庫小基表的內容。在XML使用 方式還不熟練的時侯,是所有的基類放在一個大文件中,以減少初始化解釋的成本;目前,已經發現把不同的基表分散到小的文件中,在訪問時再解釋,可以減少對 內存資源的消耗,同時,解釋小文件的單次訪問的成本也在可接受範圍內,這樣的結構比老一版要好。

二、SimpleBase;
使用單一數據庫表存儲的的基表,這是針對某些基類記錄還是比較多的,超出十個以上如果手工在XML中管理會比較麻煩,而套用XContainer的自管理索引的升級也沒有做,這時侯,使用simplebase可以把主要的基列放在數據庫。

三、multibase;;
這是針對多對多的表關系結構及其主要訪問管理方法抽象出來的表類型;

四、treebase/multitree
treebase作為一個依靠parentid的反向遍歷,經反復對模式在實際項目中驗證,表明它的運行和應用效率都比較低,樹結構最合適的做法不是使用 parentid,而是使用listable的鏈表集合,以避開每次訪問的反向parentid的上溯遍歷算法。這條,已經由XML、XOR方式得到解 決,因此,在database.service中這兩項實際上已經被廢棄。(但在開發時它花的時間是最多的)。

結語:
無論是hanva和它的基表服務,以及hanva的前身使用視圖和子查詢來簡化J2EE中的多表查詢的復雜性和困難,其動機都是通過在數據庫或應用層上的 附加工夫,把應用層中的繁複而困難的對關系結構的映射簡化成單表結構。它盡管對數據庫的ER設計,盡可能地減少多表連接有範式上的指示作用,但並不是對關 系數據庫中的外鍵關系的否定,而只是對這種外鍵訪問的傳統的多表SQL鏈接的否定。對於兩層的應用,它沒有任何意義,對於三層的面向對象的應用系統,它很 可能是關系結構向關系對象結構轉化過程中的嘗試,盡管還沒有任何跡象表明它會是一個成功地廣泛得到應用的嘗試。

附:
    database是尝试使用一个Database.getInstance().getBase()的方法,提供统一的访问base的方法;
    database最基本的记录是dao.Record,一个MemoryBase和一个SimpleBase记录都是一个Record; MemoryBase继承Record的所有方法;同时SimpleBase继承了MemoryBase,其他的Base都继承自SimpleBase。 dao.Record作为所有base的父类,本身继承自vEntity->dao;并使用其中的方法。
    无论是memorybase,simplebase,multibase都是返回records结果集中的记录;但是treebase结果集中按 (flat的真假),如果flat为真,与前面三种base相同,否则只保留isleaf的部分,意即除非是叶的基类,否则不允许引用;而 TreeNode与Record是不同的;TreeNode使用另外getNode()方法。对于MemoryBase,SimpleBase在始始载入 内存后就不需要pro和conllection
   
关于multibase:
multibase针对多对多基型设计,目的仍是使用同一个基表,而避免产生多个表型连接。multibase基于一个simplebase记录类型,但 是实际上的实例对象是一个dao.Multibase对象;在多对多关系表上可以使用simple_ref,也可以自行建立关系型表,如 member_role_ref;查询时的方法先定义在Query中,然后得到逮属于某个基型的id是那几个,最后使用in()语句得到列表。显然,如果 数目太多,sql会因为太长而不能运行。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值