其实围绕Hibernate的话题,我都已经说过不下30遍,以致于最近两年以来,我对所有Hibernate的问题都不愿意再回应。另外最近一年多来,使用Rails的ActiveRecord,让我对ORM的认识又加深了很多,其实对于那么多争议的问题,最好的解决办法就是自己去实践。对于自己没有去实践过的东西,争是争不出来什么的。
引用
1、以数据库为中心建模 VS 以领域模型为中心建模:
老开发人员大多倾向于前者,因为比较符合过去的开发习惯,另外他们强调数据库的生命周期大于App
向我这样的只有几年工作经验的往往会倾向于后者,因为这能更充分发挥ORM的威力,更符合OO,免去很多维护DB的繁琐工作。
数据库设计三大范式如雷贯耳,但作为非科班出身的我直到两个月前竟然都不知道三大范式究竟是什么。那么三大范式是什么?
引用
第一范式(1NF):数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。
第二范式(2NF):数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况),也即所有非关键字段都完全依赖于任意一组候选关键字。
第三范式(3NF):在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖,指的是如果存在"A → B → C"的决定关系,则C传递函数依赖于A。
两个月前当我购买了一本《MySQL权威指南》,翻到三大范式的定义的时候,我内心巨震,三大范式简单总结一句就是消除冗余,单纯依赖关系。不允许数据库表出现冗余字段,不允许表之间多重依赖,因此符合三大范式设计的数据库模型其实和你按照面向对象思想去建模得到的数据库模型是一样的。
所以不论你是从数据库为中心建模,还是你以领域模型为中心建模,你应该最终得到一个一致的数据库模型。之所以导致数据库建模和OO建模的不一致,是因此传统的数据库建模从来都是违背三大范式的。而我们在过去经常说的一句话就是:为了数据库查询性能,我们需要多加一些冗余字段,不一定非要遵循三大范式......
所以不要再说什么数据库设计和面向对象设计导致的数据模型冲突的话,不是他们冲突,是你违背了三大范式,自己制造出来的冲突。
引用
2、Hibernate VS iBatis/JDBC:
担心失去对SQL待控制权,导致不能做优化,DBA反对
Hibernate是在JDBC之上的又一层框架,因此想当然的认为其性能不如iBatis/JDBC(我认为这个结论不成立,因为引入一个ORM层给了我们更多机会去优化性能,比如一二级缓存、lazyload、查询缓存,并且方式更优雅)。参考为什么ORM性能比iBATIS好?
担心OpenSessionInView模式有性能问题(http://www.iteye.com/topic/17501)
Hibernate无法应付复杂查询(我认为这不是问题,HQL和criteria查询能力很强,再不济还可以用SQL啊)
JavaEye网站的数据库设计是面向对象为中心的设计,但是拿三大范式来衡量,大部分设计都是吻合的,而我们的数据库缓存命中率在90%左右。缓存服务器的流量是数据库服务器流量的2.5倍之多。事实上我们有很多地方的查询尽量避免join,宁可让他n+1,这样速度反而更快,缓存命中率更高。
例如我们现在把帖子的内容字段拆分出来,单独放在一个post_texts表里面。这样posts表实际上只有35MB,而post_texts表有1GB。每次显示一个post,都会用主键去load post_text,命中缓冲。不需要查数据库,不需要去碰那个1GB的大表。
要充分发挥ORM的缓存优势,就必须把表设计的尽量细颗粒度,消除冗余和多重依赖,最终可能是相当多的小表,表之间通过主外键关联,但是关联关系都是单一的。那么这种追求面向对象的数据库模型是非常符合三大范式的。
分享到:
相关推荐
git config --global user.name "robbin" git config --global user.email "fankai@gmail.com" git config --global color.ui true ``` 设置别名,如`co`为`checkout`,`ci`为`commit`,`st`为`status`,`br`为`...
### MFC SDI 制作 Office 2007 样式 Robbin 菜单 #### 一、概述 Microsoft Foundation Classes (MFC) 是一个由微软开发的类库,用于简化 Windows 应用程序的开发过程。本文档旨在介绍如何在 MFC 单文档界面...
在Javaeye Robbin的讨论中,他提到了缓存技术在多种场景下的应用和重要性。 **缓存的作用** 1. **高速缓冲存储**:缓存是一种位于主存储器和慢速I/O设备之间的高速存储器,其目的是减少对慢速设备的访问次数,提高...
robbin_site 是范凯的个人网站 http://robbinfan.com 网站的源码。 标签:robbin
Robbin Fan—运营专业型社区的经验和反思.ppt
在IT行业中,数据库备份是确保数据安全和业务连续性的重要环节。本文主要关注Drupal网站的中小型站点和大型站点的MySQL数据库备份策略。 对于【小型Drupal站点】,我们可以利用Drupal的【backup_migrate】模块来...
此外,Hibernate3与EJB3 Persistence的关系也值得探讨,两者在功能上有重叠,但EJB3 Persistence更偏向标准,而Hibernate3提供了更丰富的功能。 总的来说,开发高效率的J2EE企业应用需要对JVM内存管理、数据库资源...
- 独立配置Robbin负载均衡 # 1.系统架构演变 随着互联网的发展,网站应用的规模不断扩大。需求的激增,带来的是技术上的压力。系统架构也因此不断的演进、升级、迭代。从单一应用,到垂直拆分,到分布式服务,到...
4. ** strut2与其它技术集成**:例如,与Hibernate或MyBatis的持久层集成,以及与Spring框架的深度整合,实现服务层和DAO层的管理。 5. **安全考虑**:学习防止SQL注入、XSS攻击等安全问题的方法,以及如何使用...
利用Ribbon for Delphi 10.1 Berlin,开发者可以轻松创建自定义的Ribbon菜单,通过调整控件的大小、颜色、字体等属性,实现与Windows系统风格的无缝对接。此外,该组件还支持触摸设备,适应了多设备、多平台的趋势。...
在IT领域,特别是数据分析与网站优化的范畴内,正则表达式(Regular Expressions,简称RegEx)在谷歌分析(Google Analytics,简称GA)中的应用是至关重要的技能之一。正则表达式是一种强大的文本处理工具,它允许...
### Linux平台gcc与动态共享库基础 #### 一、GNU gcc 编译工具的基本使用 对于初学者或者不经常接触Linux平台C语言开发的人来说,GNU gcc 和 Linux 平台的共享库可能相对陌生。本节将详细介绍如何使用GNU gcc进行...
1. **Eureka**:Eureka是Spring Cloud中的服务注册与发现组件。它是一个基于REST的服务,用于定位服务,使服务能够相互发现。每个微服务启动时,会向Eureka Server注册自己的服务信息,包括服务名、地址等。其他服务...
《Struts2技术内幕:深入解析Struts2架构设计与实现原理》由国内极为资深的Struts2技术专家(网名:downpour)亲自执笔,iteye兼CSDN产品总监范凯(网名:robbin)以及51CTO等技术社区鼎力推荐。《Struts2技术内幕:深入...
* `git config --global user.name "robbin"`:设置用户名 * `git config --global user.email "fankai@gmail.com"`:设置邮箱 * `git config --global color.ui true`:设置 Git 输出颜色 * `git config --global ...
Ribbon界面设计通常与Microsoft Office应用(如Word、Excel)的顶部工具栏相联系,提供丰富的功能选项和便捷的访问方式。 【描述】中的内容与标题一致,进一步确认这是一个使用WPF+C#技术栈构建的Ribbon控件集合,...
book by Joel Robbin and Sigurd Angenent, www.math.wisc.edu/undergraduate/calculus-instructors-page.www.lightandmatter.comFullerton, California www.lightandmatter.comCopyright 2006 Sigurd B. Angenent, ...
这篇文章将详细探讨“获取IP地址的方法与示例”,并基于提供的标签“源码”和“工具”进行深入解析。 首先,我们需要了解什么是IP地址。IP地址(Internet Protocol Address)是互联网上每个设备的唯一标识,它允许...