`
sdiablo
  • 浏览: 8130 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

hibernate与数据库建模--原作robbin

阅读更多
其实围绕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常用命令备忘 - robbin的自言自语1

    Git常用命令备忘 ­ robbin的自言自语robbin的自言自语登录Small is beautiful, constraint is liberty.首页

    javaeye Robbin 论缓存技术

    在Javaeye Robbin的讨论中,他提到了缓存技术在多种场景下的应用和重要性。 **缓存的作用** 1. **高速缓冲存储**:缓存是一种位于主存储器和慢速I/O设备之间的高速存储器,其目的是减少对慢速设备的访问次数,提高...

    范凯个人网站源码robbin_site.zip

    robbin_site 是范凯的个人网站 http://robbinfan.com 网站的源码。 标签:robbin

    Robbin Fan—运营专业型社区的经验和反思.ppt

    Robbin Fan—运营专业型社区的经验和反思.ppt

    MFC SDI制作Office2007样式的Robbin菜单.docx

    MFC单文档程序 开发应用软件时修改界面的样式,仅供学习参考

    SpringCloud1.pdf

    - 独立配置Robbin负载均衡 # 1.系统架构演变 随着互联网的发展,网站应用的规模不断扩大。需求的激增,带来的是技术上的压力。系统架构也因此不断的演进、升级、迭代。从单一应用,到垂直拆分,到分布式服务,到...

    Struts2学习资料(强烈推荐)

    4. ** strut2与其它技术集成**:例如,与Hibernate或MyBatis的持久层集成,以及与Spring框架的深度整合,实现服务层和DAO层的管理。 5. **安全考虑**:学习防止SQL注入、XSS攻击等安全问题的方法,以及如何使用...

    Ribbon For DELPHI 10.1 BERLIN.7z

    利用Ribbon for Delphi 10.1 Berlin,开发者可以轻松创建自定义的Ribbon菜单,通过调整控件的大小、颜色、字体等属性,实现与Windows系统风格的无缝对接。此外,该组件还支持触摸设备,适应了多设备、多平台的趋势。...

    robbin谈管理:改造团队的经验

    2、我早年做过很多软件咨询项目,给很多公司讲过敏捷开发、领域模型、面向对象建模和ORM。但我能够得到这些公司的信任,却并非因为讲这些时髦的内容,而是因为擅长解决各类技术上的疑难杂症,可以扮演一个救火队长的...

    一个基于WPF+ C# 实现的Ribbon 控件库程序代码

    Ribbon界面设计通常与Microsoft Office应用(如Word、Excel)的顶部工具栏相联系,提供丰富的功能选项和便捷的访问方式。 【描述】中的内容与标题一致,进一步确认这是一个使用WPF+C#技术栈构建的Ribbon控件集合,...

    利用C# 在AutocAD2010中创建Ribbon

    AutoCAD 2010 中使用 C# 创建 Ribbon 在 AutoCAD 2010 中使用 C# 创建自定义 Ribbon 是一个非常有实践价值的技术,以下是相关知识点的总结。 首先,需要了解 AutoCAD 2010 中的 Ribbon runtime API,它允许开发者...

    二次创业者的失败 - 丁香园技术VP,EGO上海分会会长 - 范凯

    介绍Robbin作为一个二次创业者在2014-2015年是如何创业失败的,又从创业的失败经历当中总结了哪些经验教训。

    spring cloud 组件整合 eureka gateway feign hystrix,各个模的整合,供大家一起学习

    1. **Eureka**:Eureka是Spring Cloud中的服务注册与发现组件。它是一个基于REST的服务,用于定位服务,使服务能够相互发现。每个微服务启动时,会向Eureka Server注册自己的服务信息,包括服务名、地址等。其他服务...

    Struts2 技术内幕-深入解析Struts2架构设计与实现原理

    《Struts2技术内幕:深入解析Struts2架构设计与实现原理》由国内极为资深的Struts2技术专家(网名:downpour)亲自执笔,iteye兼CSDN产品总监范凯(网名:robbin)以及51CTO等技术社区鼎力推荐。《Struts2技术内幕:深入...

    git常用命令保存快速使用

    * `git config --global user.name "robbin"`:设置用户名 * `git config --global user.email "fankai@gmail.com"`:设置邮箱 * `git config --global color.ui true`:设置 Git 输出颜色 * `git config --global ...

    Fundamentals of Calculs - Crowell et al - 2016-计算机科学

    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地址。IP地址(Internet Protocol Address)是互联网上每个设备的唯一标识,它允许...

    robbin谈管理:我敬佩的3位CEO管理者

    GE在韦尔奇任内20年实现了每年30%的高速增长,市值曾经达到全球第2,是全球最著名的CEO楷模。韦尔奇写的两本书:一本自传,一本Winning我读了很多遍,我觉得最有意思的反差是,尽管韦尔奇整个职业生涯都在GE渡过,...

Global site tag (gtag.js) - Google Analytics