潛魚在淵

          Concentrating on Architectures.

          posts - 77, comments - 309, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          On Demand ORM

          Posted on 2006-01-12 00:39 非魚 閱讀(3251) 評論(3)  編輯  收藏 所屬分類: 面向對象設計
              我對RAD不感興趣。因為RAD提供了太多的東西,而其中我會用到的大概不超過20%,其余的80%包括了我不想要的功能、BUG和雜亂的生成代碼。就象 一個人只能吃一碗飯,RAD給了他兩碗;如果真的是飯還好說,大不了放到餿掉或者倒掉,可惜RAD總是強迫你吃下去。

              我對ORM也是這樣的看法。

              所有人對ORM都有一個簡單的印象:減少對象持久化過程中的編碼。不管使用什么方式,所有ORM工具都做到了這一點,但這似乎還不能滿足我們的要求。

              我們會怎樣處理持久化對象呢?基本上是下列情況:

          1. 找到感興趣的對象集;
          2. 查看這個集合中所有對象的部分信息,或者
          3. 查看特定對象的全部信息,或者
          4. 查看特定對象的部分信息,或者
          5. 處理特定對象或對象集合的全部信息,或者
          6. 處理特定對象或對象集合的部分信息;
          7. 把處理過的對象保存到數據庫中。
              在上面這些情況中,很少會用到一個對象的全部信息,多數情況下,我們只會使用、更新一個對象的部分信息。通常我們會這樣說:“ORM,我需要一個對象,但 是我只關心這個對象中的FIELD1,FIELD2,FIELD5的信息。”實際上我們希望象使用SQL語句一樣來使用ORM。例如在一個典型的使用工作流的環境中,每個環節一般只會用到對象的一部分信息。

              對象和關系數據庫對信息的組織方式是不同的。對象的粒度可能會比數據庫的記錄要細,數據庫基于效率考慮,可能會把信息集中存儲。一些直接映射表記錄到對象的ORM在這里可能會遇到麻煩。

              ORM的實現者總是考慮提供完整的對象,而習慣于SQL語句的開發者又希望得到自己請求的結果——可能是一個對象的部分信息。盡管LAZY LOAD也有很大的幫助,但開發者更想它能夠LAZY到任意字段級別。

              在受益于ORM的簡化數據庫訪問的同時,我們不希望ORM給我們帶來性能方面的影響。這種恐懼時刻存在于我們心中:萬一將來發生性能問題,我們如何象優化 SQL一樣來優化ORM?更進一步想,如何在應用規模逐漸膨脹的情況下,有效的管理使用ORM的應用的可修改性?如何在負載遞增的情況下保證使用ORM的 應用的可伸縮性?當在項目的后期發現一個具有侵入性的ORM不能再適應應用的規模和可伸縮性要求時,恐怕沒有人 不頭痛吧?

              我想要的ORM是一個On Demand ORM。就象下面這樣寫代碼:

           1 public void mthod1() {
           2   User user = ODORM.request("name;password""pk=test");
           3   List groups = ODORM.requestList(Group.class,   "groupid;groupname""groupname like 'test%'");
           4   // after end user set the user groups
           5   user.setGroups(groups);
           6   ODORM.save(user);
           7   // sometimes do some more process.
           8   if ()
           9   method2(user);
          10 }
          11 
          12 public void method2(User user) {
          13   // securityLevel property should be loaded on   demand by ODORM mechanism.      
          14   user.setSecurityLevel(user.getSecurityLevel()+1);    
          15   ODORM.save(user);
          16 }

              自然管理MAPPING是ORM的本份,我只是想它更靈活一點。拋磚引玉,想聽聽大家的想法。

          評論

          # re: On Demand ORM  回復  更多評論   

          2006-01-12 01:56 by 郁也風
          最近也在考慮mapping工具選型,本來是傾向于hiberante,不過隨著考慮的深入,反倒越來越傾向于ibaties了。

          對我來說,以下幾點需要考慮:
          1、入門臺階。相信每個項目負責人都不喜歡搞些難度較大的技術在自己項目中折磨那些新人;
          2、歷史項目。我們都知道的一點是hibernate的實現模式導致它在歷史項目中的引入極為困難(新版是否在這方面有所增強,不太了解);
          3、技術選型的穩定性。對于開源項目或是大家的練手項目來說,什么新就用什么,但對于一個公司的項目選型則關系較大,因為涉及到將來很長一段時間在公司的應用推廣培訓;
          4、非魚同志上面說的那些。

          # re: On Demand ORM  回復  更多評論   

          2006-01-12 09:45 by GHawk
          越是需要操作的靈活性,對象映射的對象性自然就會下降。這樣倒不如不用ORM,直接寫JDBC和SQL,但是這對整個系統的架構會產生很大的影響。要指望Mapping和持久層沒有性能損失是做不到的。就像吃海鮮,你越是要新鮮的海鮮,就越要放棄復雜的加工和運輸手段。這個問題的解決可能不是ORM能夠勝任的,或許更大程度上依賴于數據庫系統。
          軟件設計是一種trade-off,技術本身沒有優劣之分。工程師所要做的就是如何把各種技術融合到一起。性能或是對象性操作的獲得也遵循這一原則。

          # re: On Demand ORM  回復  更多評論   

          2006-03-10 18:04 by gchhua
          軟件設計確實是trade-off,只存在合適與否,不存在優劣。就如模式的一個重要條件:適用的上下文
          主站蜘蛛池模板: 酒泉市| 图木舒克市| 贵州省| 营山县| 赤峰市| 阿巴嘎旗| 延庆县| 安丘市| 临江市| 康平县| 二手房| 吴川市| 福建省| 玛纳斯县| 普兰县| 盐山县| 封开县| 紫云| 鄂托克前旗| 龙口市| 溆浦县| 堆龙德庆县| 乌海市| 泰来县| 兴国县| 连州市| 延边| 五家渠市| 宁夏| 南昌县| 谷城县| 德阳市| 金堂县| 东乡族自治县| 盱眙县| 满城县| 凤冈县| 乐安县| 泾源县| 邹平县| 达日县|