`
kakashi
  • 浏览: 23939 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

面向对象还是面向数据

    博客分类:
  • j2ee
阅读更多

 做过一些j2ee的项目,用过不同的方式,但是还是有一些困惑,实际上我想很多人都有或者曾有过这样的困惑,有困惑的人大家一起讨论下,过来人也希望能指点下.我暂且称之为面向对象和面向数据的方式.

    1)面向对象方式:一个典型的j2ee系统一般分为页面,后台,以及数据库.在很多情况下都是根据需求先去设计数据库,那么在根据数据库来设计对象(pojo),在pojo中维护数据库表之间的关系.最后把这些对象在页面上展现出来.当然这只是很简单的情况,这样做出来能够满足OO的思想,从数据库到后台再到页面对象是基本一致的.程序也比较清楚.我称这种方式为面向对象方式.使用这种方式一般都要借助ORM工具.

      但是很多人都知道这样做有个缺点,就是有潜在的性能问题.举个简单的例子,我在数据库有三张表,典型的权限管理.USER,ROLE,和中间表USER_PROLE.

     同样在程序中我该有个User和Role的pojo,User里面包含一个Set的属性,role 象这样:

 

 

Java代码 
  1.         public class User {  
  2.   
  3.     private String userName;  
  4.       
  5.         private String passWord;  
  6.       
  7.         private Wife  wife;  
  8.   
  9.         private Set<Role> roles;  
  10.           
  11.        ..........................  
  12.   
  13. }  

 

 

      1对多的情况:如果正好是页面上让我展现一些用户,并且显示这些用户对应的角色,那么很简单,ORM工具会在取出User的同时把roles也取出来.这个时候就会产生传说中的n+1的问题,但是实际上呢,如果你数据量不是特别大的话,你sql也会这么写.除非你采取存储过程,或者缓存的方式来规避这个问题.

    1对1的情况:如果User 和另一个pojo是一对一的情况.比如wife.这个pojo里有user老婆的信息.在数据库中也有个WIFE的表对应.如果我有个查询是user的一些信息和wife的一些信息的组合.那么ORM工具会怎么做呢,一般会先

    select USER_KEY, USERNAME ,PASSWORD,....... from USER

 

   然后根据每个user 再:

   select WIFENAME,......from WIFE where USER_KEY =?

 

   user 一多,这条语句会产生很多次,如果我直接用sql来查的话就很简单,一句就够了:

   select a.USER_KEY, a.USERNAME ,a.PASSWORD,b.WIFENAME....... from USER a, WIFE b

   where a.USER_KEY=b.USER_KEY

   这样IO的消耗明显降低,但是问题出来了,我返回的数据现在并没有一个pojo能满足.我是新建一个pojo吗,这个pojo同时有有查询出来的所有字段的对应属性,或者我是直接返回一个包含map的list? 两种方法都不太好,都破坏了设计.

 

  在来考虑下更复杂的情况,比如说有4,5个表连接在一起,然后在程序中有4.5个pojo互相关联,我如果用ORM,想想会产生多少sql,我用sql语句,一个关联就可以.当然也会有人说,你这样做关联,实际上在数据库端效率也很低.你用ORM表面上会有很多sql语句,但其实数据库有缓存的 ,效率没有你想象的那么低,也许这也是有一定的道理的.但我数据库不精通,我怎么知道他是命中了缓存呢,或者我怎么能提高这些sql的命中率呢?

 

 

 2)面向数据的方式  这种方式实际上是以页面为驱动来设计,页面上有多少个字段我对应的javaBean(DTO)就应该有多少个字段.数据库与DTO的不一致通过sql来弥补.

        就向上面同样的需求我有个查询是user的一些信息和wife的一些信息的组合,那么我DTO会这样写:

     

       

 public class User {

       private String userName;  
  
       private String passWord;  
  
       private String wifeName;  
  
       private String roleName;  
         
      ..........................  
}

 

        因为这时以页面开始驱动的,所以,最后结果可能就是一个功能对应一个DTO.不可避免会有很多重复的字段.很不OO,但这块实际上并不是那么难以维护的,每个人维护自己功能的DTO.比较难以维护的是sql语句.为了解决后台数据库与前台页面的不一致很可能写出很复杂的sql语句.

      在效率上,如果sql写的得当,效率会比较高,但写的不得当,效率很低,甚至比第一种方法中一大串的sql更慢.

 

 

       那么到底哪种方式好呢,我现在觉得要看情况,如果页面的设计能和后台的数据库设计保持一定的一致,那么实际上后台的设计可以更OO.那么第一种方法好些,如果有些功能的数据量特别大,可以在这些功能用第二种方式.

     但是实际很多项目页面设计是一些人,数据库设计是另一些人,那如果你作为程序后台的设计,我觉得用第二种稍好些.应为页面上要显示的东西和后台的数据库很不一致,你经常要糅合几张表的关系.那么你要在后台来糅合这种关系很困难,所以通过sql来糅合这种不一致也许是稍好些的方法.

 

分享到:
评论
1 楼 kakashi 2009-05-23  
没人来讨论下吗?你的项目里是怎么做的

相关推荐

    面向对象 面向对象 面向对象

    7. **面向对象与面向过程对比**:面向对象编程与传统的面向过程编程相比,更注重数据和操作数据的方式,而非步骤的执行顺序。面向对象强调模块化和组件化,更适合处理复杂系统的构建。 8. **案例分析**:在实际开发...

    面向对象数据结构与软件开发

    ### 面向对象数据结构与软件开发 #### 核心知识点详解 ##### 一、面向对象编程(OOP)基础 **定义:** 面向对象编程是一种编程范式,它使用“对象”来设计软件。对象是数据和操作这些数据的方法的封装体。 **...

    数据结构(用面向对象方法与C++语言描述)课后答案

    《数据结构(用面向对象方法与C++语言描述)》是由殷人昆编著的一本经典教材,专注于讲解如何利用面向对象编程的思想和C++语言来实现和理解数据结构。这本书的第二版提供了深入的数据结构理论,同时也强调了实际编程...

    面向对象空间数据模型构建研究

    面向对象空间数据模型构建研究涉及的主要知识点如下: 1. GIS应用中的空间数据模型作用:空间数据模型作为GIS应用的关键和基础,其研究和优劣直接关系到GIS的发展。空间数据模型对于记录和表达地理空间至关重要,它...

    数据结构与算法--面向对象的C++设计

    本书标题为《数据结构与算法——面向对象的C++设计》,其内容主要围绕数据结构和算法在C++中的面向对象设计模式展开。本书不仅介绍了数据结构与算法的基本概念,还着重强调了面向对象编程范式(Object-Oriented ...

    数据结构(用面向对象方法和C++描述)殷人昆

    数据结构(用面向对象方法和C++描述)殷人昆 数据结构(用面向对象方法和C++描述)殷人昆 数据结构(用面向对象方法和C++描述)殷人昆 数据结构(用面向对象方法和C++描述)殷人昆 数据结构(用面向对象方法和C++...

    5-第五章:面向对象的数据模型和对象关系数据模型.pdf

    本章内容主要围绕面向对象的数据模型和对象关系数据模型展开,详细讲解了对象数据库管理系统(OODBMS)的特点、优势与劣势,以及与传统数据库管理系统(DBMS)之间的区别。同时,也涉及了对象关系数据库系统(ORDBMS...

    面向过程、面向对象、面向组件、面向服务软件架构的分析与比较

    面向对象强调的是数据的封装、继承和多态,通过类和对象的概念,提供了更好的代码组织方式和重用机制。面向对象编程使得软件模块化程度更高,可维护性更好,尤其在处理复杂问题和大型项目时,其优势更为明显。 面向...

    Labview面向对象编程

    1. **封装**:封装是面向对象编程的基础,它将数据和操作这些数据的方法绑定在一起,形成一个独立的单元,称为对象。在Labview中,可以通过创建类来实现封装,类包含属性(相当于数据)和方法(相当于操作)。通过类...

    数据结构与算法-面向对象的C++设计模式

    根据给定的文件内容,我们可以整理出以下知识点: **第1章 概要** - 本节的主题涉及面向对象设计模式在...通过本文件提供的内容,读者可以深入了解数据结构与算法的面向对象设计,并掌握如何在C++中实现这些设计模式。

    数据结构习题解析 用面向对象方法与C++语言描述

    在《数据结构习题解析:用面向对象方法与C++语言描述》一书中,作者深入浅出地解释了如何利用面向对象编程的概念和C++语言来实现和理解各种数据结构。 面向对象编程(Object-Oriented Programming,OOP)是一种编程...

    面向对象和面向过程的区别

    面向对象编程则是自顶向下的设计方法,它强调的是数据和操作数据的方法(即对象)的结合。在面向对象编程中,我们将问题领域内的实体抽象为对象,对象之间通过消息传递进行交互。继续以五子棋为例,面向对象的设计会...

    Python 3面向对象编程

    《Python 3面向对象编程》通过Python 的数据结构、语法、设计模式,从简单到复杂,从初级到高级,一步步通过例子来展示了Python 中面向对象的概念和原则。, 《Python 3面向对象编程》不是Python 的入门书籍,适合...

    面向对象VS面向过程

    ### 面向对象与面向过程编程:对比与分析 #### 一、引言 在计算机科学领域,程序设计范式是定义如何构建和组织...无论是面向对象还是面向过程,关键在于找到最适合解决问题的方式,从而提高代码的质量和可维护性。

    数据结构的面向对象描述方法研究.pdf

    随着计算机科学的发展,数据结构的描述方法也在不断进步,尤其是面向对象(Object-Oriented,简称OO)方法的引入,对数据结构的描述方式产生了深远的影响。 面向对象方法最初成功应用于程序设计语言及其程序设计,...

    第16章 LabVIEW中的面向对象编程,labview面向对象的框架,LabView

    在LabVIEW中实现面向对象编程(Object-Oriented Programming, OOP)可以提升代码的可重用性、可维护性和组织性。本章将深入探讨LabVIEW中的面向对象编程框架及其应用。 面向对象编程的核心概念包括类(Class)、...

    漫画面向对象编程 Java

    面向对象的简、由类创建一个对象的方法、类的编写与对象的创建、类的构造函数、类的方法、修饰符、Java中的封装/继承/多态等特征、Java中的线程、用Java创建一个小世界、多线程共享数据,以及面向对象中的各种设计...

Global site tag (gtag.js) - Google Analytics