任何一个重要的数据库无疑都会拥有不止一个依赖者。即使该数据库只是简单地被两个Web 应用程序所共享,也有许多事情需要考虑。假设有一个名为网上购物车的Web应用程序,它使用了一个包含类别代码的数据库。就网上购物车来说,类别代码是静态的,永远不会变化,所以该应用程序高速缓存了这些代码以提高性能。现在再假设有一个名为网上管理器的Web应用程序,它是用于更新类别代码的。这个网上管理器 应用程序运行在一个不同的服务器上,是一个完全独立的程序。那么,设想一下,当网上管理器更新了一个类别代码时,网上购物车如何知道该刷新自己高速缓存的类别代码了呢。这是一个简单的例子,但有时的确是一个复杂的问题。

不同的系统可能会以不同的方式访问和使用数据库。一个应用程序可能是基于网络的电子商务系统,它会执行很多数据库更新和数据创建的操作。另一个应用程序则可能是一个规划好的批处理任务,定时从一个要求独占访问数据库表的第三方接口中加载数据。可能还有一个应用程序是报表引擎,它持续地要求数据库进行复杂的查询操作。可以很容易想象这样的情况会是多么的复杂。

最重要的是,一旦访问某个数据库的系统超过一个,情况就会变得有些复杂了。MyBatis在很多方面都能有所帮助。首先,MyBatis作为持久化框架对所有类型的系统(包括事务系统、批处理 系统还有报表系统)都是有用的。这就是说,无论访问给定数据库的是什么系统,MyBatis都是一个非常好用的工具。其次,如果能够使用MyBatis,或者甚至是像Java这样的一致的平台,那么就 可以使用分布或高速缓存来在各个不同的系统之间进行通信。最后,对于最复杂的情况,你也可 以很容易地禁用iBATIS高速缓存,然后自己编写能与当前情况完美契合的特定查询语句和更新语句,即使使用相同数据库的其他系统没有禁用高速缓存。

复杂的键和关系

设计关系数据库的本意就是需要它遵守一系列严格的设计规则。出于各种原因,有时这些规则会被打破。如果某条规则被破坏、误解或者过度使用,就有可能导致出现复 杂的键和关系。关系数据库设计的规则要求,表中的每一条记录都应当通过一个主键来唯一地标 识。最简单的数据库设计可能会使用一个毫无意义的键作为主键。但也有一些数据库设计可能会 使用一种所谓的自然键,此时真实数据的一部分被用作了键。即使如此,更加复杂 的设计还可能会使用由两列或更多列组成的复合键。主键经常被用于在表与表之间创建关系。所 以任何复杂或错误的主键定义都会因为它与其他表之间存在的关系而被传播出去。

有时,主键规则也可能没有被遵守。也就是说,有时数据根本就不存在主键。这就会使得数据库查询变得异常复杂,因为我们无法唯一地标识数据。这也会使得在表之间创建关系变得非常 困难和混乱。这还会对数据库性能造成不好的影响,因为我们往往会在主键上建立索引以提高性 能,且主键还被用来决定数据的物理顺序。

在另外一些情况中,主键规则又可能被过度使用了。数据库可能毫无实际理由地使用了复合自然键。这样的设计就是过于认真地遵循规则和尽可能地用最严格的方式实现规则带来的结果。 使用自然键在表之间创建关系实际上会造成对一些真实数据的复制,这对于数据库的维护来说往 往是一件糟糕的事情。复合键用于关系时就会造成更多的冗余,因为这会用到关联表中的好几列, 只为了唯一地标识一条记录。在这两种情况下,由于自然键和复合键的使用,数据库的灵活性就 丧失了,因为自然键和复合键会给数据库维护造成极大的困难,当需要进行数据迁移时更像是一 场“噩梦”。

MyBatis可以处理任何类型的复杂键定义和关系。虽然最好还是将数据库设计得更合理一些, 但MyBatis的确可以处理那些使用无意义键、自然键、复合键甚至根本没有键的表。

数据模型的去规范化或过度规范化

关系数据库的设计包括一个消除冗余的过程。冗余的消除非常重要,因为它保证了数据库能 够提供较好的性能且灵活而可维护。数据模型中消除冗余的过程称为规范化(normalization),规 范化的程度有好几个级别。没有经过任何处理的数据往往存在大量的数据冗余,因此也被认为是 未规范化的。规范化是一个复杂的话题,我们在此不会讨论过多细节。

当一个数据库刚刚被设计出来时,我们常用那些未经加工的数据来分析冗余。数据库管理员、 数据建模人员甚至是开发人员都会分析这些数据,然后使用一些用于消除冗余的特定规则的集合 来对它们进行规范化。没有经过规范化的数据模型会存在一些数据冗余(即在不同的表中有相同 的数据),且每张表都有大量的记录和大量的列。经过规范化的数据模型的冗余就很少甚至没有 了,这时模型中会存在较多的表,但每张表中只有几列和几条记录。

没有哪个级别的规范化是完美的。一个未经规范化的模型具有简单的优点,甚至有时在性能 上也会具有一些优势。这种模型的数据存取速度可能比经过规范化的模型还更快。造成这种现象 的原因是未经规范化的模型中需要执行的语句和关系演算更少,因此负担也就更少。也就是说, 去规范化应该总是例外而不能作为一条规则。良好的数据库设计往往开始于一个“教条化”的规 范化模型,然后再根据需要对其去规范化。经过规范化后再去规范化的过程总比没有规范化而需 要重新规范化来得简单得多。因此,总是从一个规范化的数据模型开始数据库设计吧。

也存在数据库被过度规范化的情况,其结果也会带来很多问题。太多的表就需要创建太多的关系,以致难以维护。过度规范化的数据库会造成的问题包括:当查询数据库时,需要执行很多表连接操作;当更新关系紧密的数据时,需要执行很多更新语句。所有这些都会对数据库性能造成负面影响。还有一点,当需要把这样的数据模型映射到对象模型时,通常也会更加困难,因为你可能不希望你的对象模型拥有与数据模型一样的如此细粒度的类。

去规范化的模型也可能存在问题,甚至可能比过度规范化的模型还要多。去规范化的模型容 易具有较多的记录和较多的列。过多的记录会对性能造成负面影响,原因是查找时需要扫描的数据更多了。过多的列也存在同样的问题,因为每条记录的内容都更多了,因此每次执行更新或查询时就需要更多的资源。对这样的大表执行某些操作(如更新或查询)时要格外小心,要保证只针对那些必要的列,切忌将那些无关列也搅和进来。还要说明的一点就是,对于去规范化的模型, 要创建有效的索引通常会很困难。

MyBatis对去规范化的模型和过度规范化的模型都是适用的。因为它没有对你的对象模型或数 据模型的粒度做任何假设,它也没有要求两者之间必须相同或基本相似。MyBatis在分离对象模型 和关系模型这件事上,恐怕是做得最好的了。

系列文章:

MyBatis知多少(1)

MyBatis知多少(2)

MyBatis知多少(3)

MyBatis知多少(4)MyBatis的优势

MyBatis知多少(5)业务对象模型

MyBatis知多少(6)表现层与业务逻辑层

MyBatis知多少(7)持久层

MyBatis知多少(8)关系型数据库

MyBatis知多少(9)不同类型的数据库

MyBatis知多少(10)应用程序数据库

MyBatis知多少(11)企业数据库

MyBatis知多少(12)私有数据库

MyBatis知多少(14)分散的数据库系统的更多相关文章

  1. MyBatis知多少(26)MyBatis和Hibernate区别

    iBatis和Hibernate之间有着较大的差异,但两者解决方案很好,因为他们有特定的领域.我个人建议使用MyBatis的,如果: 你想创建自己的SQL,并愿意维持他们. 你的环境是由关系数据模型驱 ...

  2. MyBatis知多少(26)调试

    这是很容易,同时与iBATIS的工作程序进行调试. iBATIS有内置的日志支持,并适用于下列日志库,并在这个顺序搜索他们. Jakarta Commons日志记录(JCL). Log4J JDK 日 ...

  3. MyBatis知多少(25)动态SQL

    使用动态查询是MyBatis一个非常强大的功能.有时你已经改变WHERE子句条件的基础上你的参数对象的状态.在这种情况下的MyBatis提供了一组可以映射语句中使用,以提高SQL语句的重用性和灵活性的 ...

  4. MyBatis知多少(24)存储过程

    使用MyBatis配置来调用存储过程.为了理解这一章,首先需要了解我们是如何在MySQL中创建一个存储过程. 在继续对本节学习之前,可以自行学习MySQL存储过程. 我们已经在MySQL下有EMPLO ...

  5. MyBatis知多少(23)MyBatis结果映射

    resultMap的元素是在MyBatis的最重要和最强大的元素.您可以通过使用MyBatis的结果映射减少高达90%的JDBC编码,在某些情况下,可以让你做JDBC不支持的事情. ResultMap ...

  6. MyBatis知多少(22)MyBatis删除操作

    本节从表中使用MyBatis删除记录. 我们已经在MySQL下有EMPLOYEE表: CREATE TABLE EMPLOYEE ( id INT NOT NULL auto_increment, f ...

  7. MyBatis知多少(21)更新操作

    上一章展示了如何使用MyBatis对表进行读取操作.本章将告诉你如何在一个表中使用MyBatis更新记录. 我们已经在MySQL下有EMPLOYEE表: CREATE TABLE EMPLOYEE ( ...

  8. MyBatis知多少(20)MyBatis读取操作

    上篇展示了如何使用MyBatis执行创建操作表.本章将告诉你如何使用MyBatis来读取表. 我们已经在MySQL下有EMPLOYEE表: CREATE TABLE EMPLOYEE ( id INT ...

  9. MyBatis知多少(19)MyBatis操作

    若要使用iBATIS执行的任何CRUD(创建,写入,更新和删除)操作,需要创建一个的POJO(普通Java对象)类对应的表.本课程介绍的对象,将“模式”的数据库表中的行. POJO类必须实现所有执行所 ...

随机推荐

  1. atitit.ajax bp dwr 3.的注解方式配置使用流程总结.....

    atitit.ajax bp dwr 3.的注解方式配置使用流程总结..... 1. 下载  dwr.jar 1M 1 2. 配置注解方式..web.xml 1 3. Class 配置 2 4. 测试 ...

  2. javascript设计模式与开发实践阅读笔记(9)——命令模式

    命令模式:有时候需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是什么,此时希望用一种松耦合的方式来设计软件,使得请求发送者和请求接收者能够消除彼此之间的耦合关系. 说法很复 ...

  3. 从Windows XP系统迁移到Windows 7,Windows 8开始

    Microsoft在2014年4月8日结束了Windows XP的支持.您的公司准备好了吗?如果您还没有迁移到Windows 7或8,那就要抓紧时间了.从现在起将不再向XP系统提供安全修补程序,而仍然 ...

  4. Entity Framework 6.x Code Frist For Oracle 实践与注意点

    Entity Framework 6.x Code Frist For Oracle 实践与注意点 开发环境 Visual Studio.net 2015/2017 Oracle 11g/12c 数据 ...

  5. Intel® Threading Building Blocks (Intel® TBB) Developer Guide 中文 Parallelizing Data Flow and Dependence Graphs并行化data flow和依赖图

    https://www.threadingbuildingblocks.org/docs/help/index.htm Parallelizing Data Flow and Dependency G ...

  6. 解决VS2010中在项目上右键鼠标,无“添加STS引用”菜单的问题

    解决方法:将Windows Identity Foundation SDK文件夹C:\Program Files (x86)\Windows Identity Foundation SDK\v3.5\ ...

  7. 成功在神舟K650c-i7 d2(i7-4700MQ、HM87)上装好了Windows XP

    成功在神舟K650c-i7 d2(i7-4700MQ.HM87)上装好了Windows XP 本来已经在K650c上装好了Windows7.Windows8双系统,奈何某些旧软件只能在Windows ...

  8. Java 时间和字符换的处理

    /** * * @param timeStr 时间字符串 * @param diff 与起始值差距,单位为毫秒 * @throws ParseException */ public String de ...

  9. Linux安全事件应急响应排查方法总结

    Linux安全事件应急响应排查方法总结 Linux是服务器操作系统中最常用的操作系统,因为其拥有高性能.高扩展性.高安全性,受到了越来越多的运维人员追捧.但是针对Linux服务器操作系统的安全事件也非 ...

  10. Mysql 如何设置字段自动获取当前时间

    应用场景: 1.在数据表中,要记录每条数据是什么时候创建的,不需要应用程序去特意记录,而由数据数据库获取当前时间自动记录创建时间: 2.在数据库中,要记录每条数据是什么时候修改的,不需要应用程序去特意 ...