持久层设计与实施

原创 2015年07月07日 21:34:52

持久层设计与实施

系统工程=程序+文档,程序是由逻辑结构+数据构成,那么对于数据的处理就显得格外重要。一个程序中会用到很多数据,然而不是所有的数据都需要存入数据库。我们在设计系统的时候应该如何做出选择呢?

首先,我们可以逐条解析需求说明书,从中提取所有出现的数据,然后将数据按照处理方式分类:部分数据只是在处理逻辑中使用,那么它们只需要赋给变量,部分数据可以写入文档,那么它们可以存放在工程文件夹中,最终可能一起放入服务器中保存,剩下的数据,需要持久保存时,才考虑将其存入数据库。对于有必要存入数据库的数据,我们按照功能逻辑先做一个简单的分组。

为了使数据库更加合理,高效。我们需要用三范式来规范每个数据表的属性。三范式拆分原则如下:

l        第一范式:确保每列属性保持原子性,即不可拆分。原子性是相对的,根据实际需求而定,要考虑是否便于查询,是否用到某属性处理业务逻辑

l        第二范式:主键列与非主键列遵循完全函数依赖关系,即确保表中的每列非主属性都和每个主键属性相关。确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。只要数据列中出现数据重复,就要把表拆分开来。

l        第三范式:非主键列之间没有传递函数依赖关系,确保每列都和主键列直接相关,而不是间接相关

有时候不能死板地套用三范式,还要根据具体情况,考虑需求和性能,做出更合理的取舍。

当用三范式规范了表结构之后,我们该考虑各个数据表之间的关系了,表与表之间本来是没有关系的,为什么要考虑关系呢?因为业务逻辑的需要,因为要查询出不同数据表信息的组合,所以才建立表格之间的关系。那么我们就可以从多表连接查询入手,来探究表之间的关系。新建两张表:student表和course表

          

(实际开发中这两个表会有自己不同的主键。)

1.       外连接

外连接可分为:左连接、右连接、完全外连接。

l        左连接left join或left outer join

SQL语句:select * from student left join course onstudent.ID=course.ID
执行结果:

左外连接包含left join左表所有行,如果左表中某行在右表没有匹配,则结果中对应行右表的部分全部为空(NULL)。【此时我们不能说结果的行数等于左表数据的行数。当然此处查询结果的行数等于左表数据的行数,因为左右两表此时为一对一关系】

l        右连接right join或right outer join

SQL语句:select *from student right join course on student.ID=course.ID
执行结果:

右外连接包含right join右表所有行,如果左表中某行在右表没有匹配,则结果中对应左表的部分全部为空(NULL)。【同样此时我们不能说结果的行数等于右表的行数。当然此处查询结果的行数等于左表数据的行数,因为左右两表此时为一对一关系】。

l        完全外连接full join或full outer join

SQL语句:select * from student full join course onstudent.ID=course.ID
执行结果:

完全外连接包含full join左右两表中所有的行,如果右表中某行在左表中没有匹配,则结果中对应行右表的部分全部为空(NULL),如果左表中某行在右表中没有匹配,则结果中对应行左表的部分全部为空(NULL)。

2.     内连接join或inner join

SQL语句:select * from student inner join courseon student.ID=course.ID
执行结果:

inner join 是比较运算符,只返回符合条件的行。此时相当于:select * from student,course where student.ID=course.ID

3.     交叉连接cross join

没有 WHERE 子句的交叉联接将产生连接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。SQL语句:select * from student cross joincourse执行结果:

如果我们在此时给这条SQL加上WHERE子句的时候比如SQL:select* from student cross join course where student.ID=course.ID此时将返回符合条件的结果集,结果和inner join所示执行结果一样。

4.     两表关系为一对多,多对一或多对多时的连接语句

当然上面两表为一对一关系,那么如果表A和表B为一对多、多对一或多对多的时候,我们又该如何写连接SQL语句呢?其实两表一对多的SQL语句和一对一的SQL语句的写法都差不多,只是查询的结果不一样,当然两表也要略有改动。比如表1的列可以改为:Sno Name Cno。表2的列可以改为:Cno CName。这样两表就可以写一对多和多对一的SQL语句了,写法和上面的一对一SQL语句一样。下面介绍一下当两表为多对多[需要建立中间关系表]的时候我们该如何建表以及些SQL语句。新建三表:student 表,course表,和student_course表

                

一个学生可以选择多门课程,一门课程可以被多个学生选择,因此学生表student和课程表course之间是多对多的关系。当两表为多对多关系的时候,我们需要建立一个中间表student_course,中间表至少要有两表的主键,当然还可以有别的内容。SQL语句:select s.Name,C.Cname from student_course as sc left join student ass on s.Sno=sc.Sno left join course as c on c.Cno=sc.Cno执行结果:

此条SQL执行的结果是学生选课的情况。

通过上面各种表之间的连接的关系,我们就可以根据实际情况,考虑各个表之间的关系了。那么我们明确一下几个问题:

[1]一对一,一对多/多对一还是多对多?

答:根据一条记录实例来考虑这一问题.

[2]外键应该建在哪个表[如何区分主表,从表]?

答:若是一对一关系,那么只要存在相同属性值的属性列,外键甚至可以不建立,如果建立外键,那么外键任意建立在哪个表.根据实际情况,逻辑情况做出选择.

   若是一对多关系,那么外键应该放在多的一方.

[3]单向还是双向?

答:不论外键是如何建立,都可以通过左外链和右外链查询到结果

版权声明:本文为博主原创文章,未经博主允许不得转载。

Mybatis 基于Java的持久层框架(一)

简介 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手工设置参数以及抽取结果集。MyB...
  • u011345136
  • u011345136
  • 2015年01月24日 16:15
  • 3270

三大框架整合ssh(一)-----持久层搭建

这一节其实就是搭建hibernate开发环境,如果你可以自己搭建就跳过吧。但我还是把不做贴出来,并把可能出问题的方法指出来。 下面是这个项目的持久层目录图: 这一步主要是关于数据的操作,但是这时候你...
  • zl544434558
  • zl544434558
  • 2013年10月18日 13:51
  • 1845

JAVA三层架构,持久层,业务层,表现层的理解

SSH:Struts(表示层 )+Spring(业务层)+Hibernate(持久层)Struts: Struts是一个表示层框架,主要作用是界面展示,接收请求,分发请求。在 MVC框架 中,...
  • ljf_study
  • ljf_study
  • 2017年03月21日 16:22
  • 7418

数据持久化层和DAO层的关系

DAO =Data Access Objects,也就是所谓的数据访问对象,这个对象是和数据打交道的,当然是持久化层的。目前通用的是dao是数据层,也可以说为持久化层,service是逻辑层,也可以叫...
  • woshiliulei0
  • woshiliulei0
  • 2016年02月18日 15:10
  • 2352

Hibernate持久层全面描述

这里介绍增加Hibernate持久层提高了开发的效率,使软件的体系结构更加清晰,在代码编写和系统维护方面变得更容易。特别是在大型的应用里边,会更有利。 在向大家详细介绍Hibernate持久层之...
  • u012110719
  • u012110719
  • 2014年11月21日 18:19
  • 1226

拥有了JDBC,为什么还要有Hibernate和Mybatis等持久层框架?

JDBC,我想对于学Java的人简直太熟悉了,如果谁说不知道,那么狠遗憾的告诉你,你不是Java人! 这篇文章的主要目的还是想把大家引入后面我们重点要说的内容,那就是Mybatis和Hibernate...
  • andamajing
  • andamajing
  • 2017年05月05日 14:25
  • 959

Spring总结4—对持久层的支持(附:事务管理)

Spring对持久层采用的策略 没有重新实现新的持久层,只是对现有持久层方案进行封装,更利于使用 采用DAO模式 提供了大量的模板类来简化编程(HibernateTemplate、JdbcTempl...
  • u010796790
  • u010796790
  • 2016年04月24日 21:06
  • 1207

myBatis持久层缓存

缓存的意义:将用户经常查询的数据当在缓存(内存)中,用户去查询数据就不用从磁盘(关系型数据库数据文件)查询,而是从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题。 myBatis提供一级缓...
  • qq_27656675
  • qq_27656675
  • 2017年03月28日 18:26
  • 317

表现层、持久层、业务层

为了实现web层(struts)和持久层(Hibernate)之间的松散耦合,我们采用业务代表(Business Delegate)和DAO(Data Access Object)两种模式。DAO模式...
  • elong490
  • elong490
  • 2014年08月21日 09:20
  • 2833

Hibernate持久层(原理、基本流程)

Hibernate持久层 Java中对象的持久化有3种方式: (1)序列化对象,存到格式化的文本中; (2)将对象持久化到XML文档中; (3)持久到数据库中,一般指关系型数据库。   以...
  • Songjs19931206
  • Songjs19931206
  • 2015年08月16日 12:28
  • 1747
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:持久层设计与实施
举报原因:
原因补充:

(最多只允许输入30个字)