MyBatis知多少(14)分散的数据库系统
任何一个重要的数据库无疑都会拥有不止一个依赖者。即使该数据库只是简单地被两个Web 应用程序所共享,也有许多事情需要考虑。假设有一个名为网上购物车的Web应用程序,它使用了一个包含类别代码的数据库。就网上购物车来说,类别代码是静态的,永远不会变化,所以该应用程序高速缓存了这些代码以提高性能。现在再假设有一个名为网上管理器的Web应用程序,它是用于更新类别代码的。这个网上管理器 应用程序运行在一个不同的服务器上,是一个完全独立的程序。那么,设想一下,当网上管理器更新了一个类别代码时,网上购物车如何知道该刷新自己高速缓存的类别代码了呢。这是一个简单的例子,但有时的确是一个复杂的问题。
不同的系统可能会以不同的方式访问和使用数据库。一个应用程序可能是基于网络的电子商务系统,它会执行很多数据库更新和数据创建的操作。另一个应用程序则可能是一个规划好的批处理任务,定时从一个要求独占访问数据库表的第三方接口中加载数据。可能还有一个应用程序是报表引擎,它持续地要求数据库进行复杂的查询操作。可以很容易想象这样的情况会是多么的复杂。
最重要的是,一旦访问某个数据库的系统超过一个,情况就会变得有些复杂了。MyBatis在很多方面都能有所帮助。首先,MyBatis作为持久化框架对所有类型的系统(包括事务系统、批处理 系统还有报表系统)都是有用的。这就是说,无论访问给定数据库的是什么系统,MyBatis都是一个非常好用的工具。其次,如果能够使用MyBatis,或者甚至是像Java这样的一致的平台,那么就 可以使用分布或高速缓存来在各个不同的系统之间进行通信。最后,对于最复杂的情况,你也可 以很容易地禁用iBATIS高速缓存,然后自己编写能与当前情况完美契合的特定查询语句和更新语句,即使使用相同数据库的其他系统没有禁用高速缓存。
复杂的键和关系
设计关系数据库的本意就是需要它遵守一系列严格的设计规则。出于各种原因,有时这些规则会被打破。如果某条规则被破坏、误解或者过度使用,就有可能导致出现复 杂的键和关系。关系数据库设计的规则要求,表中的每一条记录都应当通过一个主键来唯一地标 识。最简单的数据库设计可能会使用一个毫无意义的键作为主键。但也有一些数据库设计可能会 使用一种所谓的自然键,此时真实数据的一部分被用作了键。即使如此,更加复杂 的设计还可能会使用由两列或更多列组成的复合键。主键经常被用于在表与表之间创建关系。所 以任何复杂或错误的主键定义都会因为它与其他表之间存在的关系而被传播出去。
有时,主键规则也可能没有被遵守。也就是说,有时数据根本就不存在主键。这就会使得数据库查询变得异常复杂,因为我们无法唯一地标识数据。这也会使得在表之间创建关系变得非常 困难和混乱。这还会对数据库性能造成不好的影响,因为我们往往会在主键上建立索引以提高性 能,且主键还被用来决定数据的物理顺序。
在另外一些情况中,主键规则又可能被过度使用了。数据库可能毫无实际理由地使用了复合自然键。这样的设计就是过于认真地遵循规则和尽可能地用最严格的方式实现规则带来的结果。 使用自然键在表之间创建关系实际上会造成对一些真实数据的复制,这对于数据库的维护来说往 往是一件糟糕的事情。复合键用于关系时就会造成更多的冗余,因为这会用到关联表中的好几列, 只为了唯一地标识一条记录。在这两种情况下,由于自然键和复合键的使用,数据库的灵活性就 丧失了,因为自然键和复合键会给数据库维护造成极大的困难,当需要进行数据迁移时更像是一 场“噩梦”。
MyBatis可以处理任何类型的复杂键定义和关系。虽然最好还是将数据库设计得更合理一些, 但MyBatis的确可以处理那些使用无意义键、自然键、复合键甚至根本没有键的表。
数据模型的去规范化或过度规范化
关系数据库的设计包括一个消除冗余的过程。冗余的消除非常重要,因为它保证了数据库能 够提供较好的性能且灵活而可维护。数据模型中消除冗余的过程称为规范化(normalization),规 范化的程度有好几个级别。没有经过任何处理的数据往往存在大量的数据冗余,因此也被认为是 未规范化的。规范化是一个复杂的话题,我们在此不会讨论过多细节。
当一个数据库刚刚被设计出来时,我们常用那些未经加工的数据来分析冗余。数据库管理员、 数据建模人员甚至是开发人员都会分析这些数据,然后使用一些用于消除冗余的特定规则的集合 来对它们进行规范化。没有经过规范化的数据模型会存在一些数据冗余(即在不同的表中有相同 的数据),且每张表都有大量的记录和大量的列。经过规范化的数据模型的冗余就很少甚至没有 了,这时模型中会存在较多的表,但每张表中只有几列和几条记录。
没有哪个级别的规范化是完美的。一个未经规范化的模型具有简单的优点,甚至有时在性能 上也会具有一些优势。这种模型的数据存取速度可能比经过规范化的模型还更快。造成这种现象 的原因是未经规范化的模型中需要执行的语句和关系演算更少,因此负担也就更少。也就是说, 去规范化应该总是例外而不能作为一条规则。良好的数据库设计往往开始于一个“教条化”的规 范化模型,然后再根据需要对其去规范化。经过规范化后再去规范化的过程总比没有规范化而需 要重新规范化来得简单得多。因此,总是从一个规范化的数据模型开始数据库设计吧。
也存在数据库被过度规范化的情况,其结果也会带来很多问题。太多的表就需要创建太多的关系,以致难以维护。过度规范化的数据库会造成的问题包括:当查询数据库时,需要执行很多表连接操作;当更新关系紧密的数据时,需要执行很多更新语句。所有这些都会对数据库性能造成负面影响。还有一点,当需要把这样的数据模型映射到对象模型时,通常也会更加困难,因为你可能不希望你的对象模型拥有与数据模型一样的如此细粒度的类。
去规范化的模型也可能存在问题,甚至可能比过度规范化的模型还要多。去规范化的模型容 易具有较多的记录和较多的列。过多的记录会对性能造成负面影响,原因是查找时需要扫描的数据更多了。过多的列也存在同样的问题,因为每条记录的内容都更多了,因此每次执行更新或查询时就需要更多的资源。对这样的大表执行某些操作(如更新或查询)时要格外小心,要保证只针对那些必要的列,切忌将那些无关列也搅和进来。还要说明的一点就是,对于去规范化的模型, 要创建有效的索引通常会很困难。
MyBatis对去规范化的模型和过度规范化的模型都是适用的。因为它没有对你的对象模型或数 据模型的粒度做任何假设,它也没有要求两者之间必须相同或基本相似。MyBatis在分离对象模型 和关系模型这件事上,恐怕是做得最好的了。
系列文章:
MyBatis知多少(14)分散的数据库系统的更多相关文章
- MyBatis知多少(26)MyBatis和Hibernate区别
iBatis和Hibernate之间有着较大的差异,但两者解决方案很好,因为他们有特定的领域.我个人建议使用MyBatis的,如果: 你想创建自己的SQL,并愿意维持他们. 你的环境是由关系数据模型驱 ...
- MyBatis知多少(26)调试
这是很容易,同时与iBATIS的工作程序进行调试. iBATIS有内置的日志支持,并适用于下列日志库,并在这个顺序搜索他们. Jakarta Commons日志记录(JCL). Log4J JDK 日 ...
- MyBatis知多少(25)动态SQL
使用动态查询是MyBatis一个非常强大的功能.有时你已经改变WHERE子句条件的基础上你的参数对象的状态.在这种情况下的MyBatis提供了一组可以映射语句中使用,以提高SQL语句的重用性和灵活性的 ...
- MyBatis知多少(24)存储过程
使用MyBatis配置来调用存储过程.为了理解这一章,首先需要了解我们是如何在MySQL中创建一个存储过程. 在继续对本节学习之前,可以自行学习MySQL存储过程. 我们已经在MySQL下有EMPLO ...
- MyBatis知多少(23)MyBatis结果映射
resultMap的元素是在MyBatis的最重要和最强大的元素.您可以通过使用MyBatis的结果映射减少高达90%的JDBC编码,在某些情况下,可以让你做JDBC不支持的事情. ResultMap ...
- MyBatis知多少(22)MyBatis删除操作
本节从表中使用MyBatis删除记录. 我们已经在MySQL下有EMPLOYEE表: CREATE TABLE EMPLOYEE ( id INT NOT NULL auto_increment, f ...
- MyBatis知多少(21)更新操作
上一章展示了如何使用MyBatis对表进行读取操作.本章将告诉你如何在一个表中使用MyBatis更新记录. 我们已经在MySQL下有EMPLOYEE表: CREATE TABLE EMPLOYEE ( ...
- MyBatis知多少(20)MyBatis读取操作
上篇展示了如何使用MyBatis执行创建操作表.本章将告诉你如何使用MyBatis来读取表. 我们已经在MySQL下有EMPLOYEE表: CREATE TABLE EMPLOYEE ( id INT ...
- MyBatis知多少(19)MyBatis操作
若要使用iBATIS执行的任何CRUD(创建,写入,更新和删除)操作,需要创建一个的POJO(普通Java对象)类对应的表.本课程介绍的对象,将“模式”的数据库表中的行. POJO类必须实现所有执行所 ...
随机推荐
- Maven学习总结(八)——使用Maven构建多模块项目
在平时的Javaweb项目开发中为了便于后期的维护,我们一般会进行分层开发,最常见的就是分为domain(域模型层).dao(数据库访问层).service(业务逻辑层).web(表现层),这样分层之 ...
- 建立一个名叫Cat的类
//属性 成员变量 String name; int age; String color; //方法 函数 成员函数 void name() { System.out.println("名字 ...
- 利用Httponly提升web应用程序安全性
随着www服务的兴起,越来越多的应用程序转向了B/S结构,这样只需要一个浏览器就可以访问各种各样的web服务,但是这样也越来越导致了越来越 多的web安全问题.www服务依赖于Http协议实现,Htt ...
- 动软商城系统可免费下载了,专业批发分销商城系统,ASP.NET商城系统
动软商城系统是一套集CMS资讯+品牌Shop商城+WAP商城+APP手机客户端+SNS用户互动社区于一体的全新电商营销解决方案.主要为企业树立企业品牌形象,实现独立网络推广,充分集成网站SEO.企业微 ...
- Flv.js
Flv.js 是 HTML5 Flash 视频(FLV)播放器,纯原生 JavaScript 开发,没有用到 Flash.由 bilibili 网站开源. 该项目依托于 Media Source Ex ...
- jxl 2.6.12 与 jxl 2.3.0 稳定版性能比较
jxl 2.3.0 org.jxls:jxls:2.3.0 org.jxls:jxls-poi:1.0.9 org.jxls:jxls-jexcel:1.0.6 jxls-reader:2.0.2 j ...
- Objective C for Windows
You can use Objective C inside the Windows environment. If you follow these steps, it should be work ...
- 用git写书
apebook.org www.apebook.org 最好的程序员图书免费托管服务 apebook 提供了 gitbook.com 类似的云端图书托管能力,图书基于广受欢迎的 gitbook 工具 ...
- 北京地铁月度消费总金额计算(Python版)
最近业余时间在学习Python,这是那天坐地铁时突发奇想,想看看我这一个月的地铁费共多少钱,所以简单的构思了下思路,就直接开写了,没想到用Python来实现还挺简单的. 设计思路: 每次乘车正常消费7 ...
- Conway's Game of Life: An Exercise in WPF, MVVM and C#
This blog post was written for the Lockheed Martin Insight blog, sharing here for the external audie ...