发表于: 2017-12-14 22:45:07
1 717
今日完成的事情:
今天进行方案评审,但是没有做好充足的准备,然后就把方案修改了一下,明天再次进行评审。
今天的主要问题是对于实体和关系没有搞懂:
1)实体和关系是怎么产生的?
1.数据库设计的时候会产生几种关系映射:一对一,一对多,多对多。这个时候就产生了实体和关系。
举一个老师和学生的例子:实体对应的就是老师和学生。关系就是:一个老师可以有多个学生,一个学生也可以对应多个老师,这就是多对多的关系。
2)实体和实体之间产生了关系,实体和实体之间如何关联?
1.可以在原来的数据表种创建外键进行关联。
2.新建一张关联表,用来保存实体和实体之间的关联。
3)使用外键的优点:
1.数据一致性:由数据库自身保证数据一致性,完整性,更可靠,因为程序很难100%保证数据 的完整性,而用外键即使在数据库服务器当机或者出现其他问题的时候,也能够最大限度的保证数据的一致性和完整性。
2.数据简洁:使用外键,就会少一张数据表,相对来说表格更少,看起来会更加简洁。
3.使设计更全面:外键在一定程度上说明的业务逻辑,会使设计周到具体全面 。
但是外键也存在一定的缺陷,特别实在多对多的关系上面。
4)使用外键的缺点:
1.程序逻辑: 某些程序逻辑中,程序的逻辑已经足够保证完整性,我会在存储过程或包等地方做严谨的判断。
2.性能问题:这个是最为诟病的,如果使用外键的话,那么数据库要承受很大的压力。比如一个业务流水表,频繁插入数据,如果这个表身上有3外键,那么每次插入一条,就必须对这3个外键对应的3个表做相应的查找判断有无对应数据,如果这3个表也很大,那就这3个表的判断时间就很常,虽然外键指向的关联表的字段肯定是索引,但是我觉得很多时候,这样的判断本来就在程序里控制好了,通过外键再判断一次,就是降低性能。
3.有的时候不判断也是可以的,但是存在外键的情况下,就必须要进行判断。
4.维护麻烦:业务逻辑有bug或者其他情况,需要经常手工维护数据,有错综复杂的外键关联着,很是麻烦 。
这个时候就引入了关联表,说到关联表就要说一下er关系模型转换成关系模型:
4)中间表进行多对多关联:
1.实体类型的转换:将每个实体类型转换成一个关系模式,实体的属性即为关系模式的属性,实体标识符即为关系模式的键。
2.联系类型的转换:
若实体间联系是1:1,可以在两个实体类型转换成的两个关系模式中任意一个关系模式的属性中加入另一个关系模式的键(作为外键)和联系类型的属性。
若实体间联系是1:N,则在N端实体类型转换成的关系模式中加入1端实体类型的键(作为外键)和联系类型的属性。
若实体间联系是M:N,则将联系类型也转换成关系模式,其属性为两端实体类型的键(作为外键)加上联系类型的属性,而键为两端实体键的组合。
5)使用中间表的优点:
1.把复杂的逻辑放在一张中间表当中,可以很清晰的看到对应的关系。
2.中间表放的字段较少,可以有效减少存取数据对数据库产生的压力。
3.还是分离思想(感觉这个分离思想在我们的开发种真是无处不在):实体和逻辑判断进行了分离,更利于我们维护数据,扩展性也更好。我们的实体表就可以只关注实体对象,而对应的逻辑就交给中间关联表来做。
由于复盘用的框架是老大写的,用的是hibernate,所以把hibernate的动态查询看了一下小课堂。
1)mybatis动态查询;
mubatis动态查询时写在xml配置文件当中的。
把我做任务时候的动态查询语句贴出来一下:
<!-- 修改用户信息 -->
<update id="updateUser" parameterType="com.mmy.model.User">
update users
<set>
<if test="name != null">name=#{name},</if>
<if test="passWord != null">pass_word=#{passWord},</if>
<if test="salt != null">salt=#{salt},</if>
<if test="phone != null">phone=#{phone},</if>
<if test="mail != null">mail=#{mail},</if>
<if test="head != null">head=#{head},</if>
<if test="createUser != null">create_user=#{createUser},</if>
<if test="updateUser != null">update_user=#{updateUser},</if>
</set>
where phone LIKE #{phone}
</update>
这是一个修改用户信息的动态查询语句。首先会对字段进行判断是不是空。比如:如果只有name字段不是空,那么这个sql语句就是:update users name = #{name} where phone LIKE #{phone},mybatis动态查询其实挺智能的。
2)hibernate动态查询是听的培宇大佬的小课堂:hibernate的动态查询语句是需要自己手动拼写的,到时候有封装好的框架进行和mybatis差不多的操作,封装成动态查询语句。有于代码生成没有做,所以没有实际操作,所以可能还是有很多问题,需要代码生成之后自己好好研究。
明日计划的事情:
明日进行二次评审。
遇到的问题:
还是有好多东西不太懂,需要多问,和多看一些大佬的关于复盘的小课堂,补一下自己关于复盘的缺陷。
收获:
中间关联表的作用以及如何利用中间关联表。
评论