浅析面向对象数据库设计思想

什么是面向对象思想

面向对象其实是一种抽象的思维,区别于面向过程。面向过程是一种以过程为中心的编程思想,它首先分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,在使用时依次调用,是一种基础的顺序的思维方式。面向过程开发方式是对计算机底层结构的一层抽象,它将程序分为数据和操纵数据两部分,其核心问题是数据结构和算法的开发和优化。现今常见的支持面向过程的编程语言就是C等。

浅析面向对象数据库设计思想

面向对象是按人们认识客观世界的系统思维方式,采用基于对象(实体)的概念建立模型,模拟客观世界分析、设计、实现软件的编程思想,通过面向对象的理念使计算机软件系统能与现实世界中的系统一一对应。因为世界上有很多人和事物,每一个都可以看做一个对象,而每个对象都有自己的属性和行为,对象与对象之间通过方法来交互。面向对象是一种以“对象”为中心的编程思想,把要解决的问题分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个对象在整个解决问题的步骤中的属性和行为。

浅析面向对象数据库设计思想

面向对象方法直接把所有事物都当作独立的对象,处理问题过程中所思考的不再主要是怎样用数据结构来描述问题,而是直接考虑重现问题中各个对象之间的关系。面向对象方法的基础实现中也包含面向过程的思想。常见的支持面向对象的编程语言有C++pythonJava等。

设计一个班级管理系统

相信对于这个问题来说,大家都很熟悉了,在学校里经常做了,甚至可以说是学习数据库的一个入门话题,对于一个班级管理系统,我们需要考虑的问题很多,我们就根据需要来一层层设计。按照一个班级来说,我们有老师、学生这种身份的组成,人有男女属性,老师有科任的区别,学生可能为班干,老师可能会使用某些教具,学生有课桌椅等等,我们的数据库中就应该具备这些属性。

面向过程的数据库设计

对于面向过程来说,我们需要设计若干张表,班级表、教师表、学生表等。他们之间可以用下面这张图来简单表示

浅析面向对象数据库设计思想

假设教室里面有学生和老师都是女性,老师有名字、手机号码、住址等信息,随着时间推移,观点的进步,教室里面允许有不同性别的学生和老师进入,这个时候我们要增加一个属性项,要怎么做呢?分别在学生表和老师表上面增加了一个性别,这个操作很简单啊,啪的一下很快嘛,于是有了下一张图

浅析面向对象数据库设计思想

这么做没问题吗?有问题很大,毕竟这间传统文化名校学生几百届,收录了数万名学生和老师的记录,我们草率的加字段,将会导致数据库遍历整张表,这样的执行效率是在O(n)级别,数据量特别大的时候,等待的时间将是不可接受的,万一学校德育说学生不能带手机,手机号码取消了,那我们又要哼哧哼哧哼哧的删字段,再次等到O(n),时间继续推移,在广大家长有时刻关系自家孩子的需求下,学校同意学生带手机了,不过他们还想知道学生用了什么手机型号,于是我们又要加上mobile_numberphone_type这些信息,又是两个O(n)……来来回回折腾,万幸的是数据库还坚强,毕竟只有三张表,还很坚持的住。日子还是要过的,校董会觉得,学生学习之后必须通过考试来确定老师教学成果。啊这,不就是少了一张表了吗?来来加上!满足满足!可是考试不是考一门啊!!语数英,生物化、地理政治生物……啊这?哦没事!不就是再加字段嘛,然后统计总分,计算排名!然后通过将学生连起来,完事!连完之后学校说我们想看看各位班干有没有带头作用,查一下他们的成绩和总分,一条sql将数据取出来?发现了其中某些人排名低,想要安排几个老师重点关注,是不是这个时候又要建立外键把这两张表连起来。于是我们就有一张巨复杂的表。

浅析面向对象数据库设计思想

这个时候我们还要对学生进行修改涉及的关系就多了呀,会对考试系统和班级管理有影响,如果更进一步的,学校增加了图书馆,而图书馆针对学生、老师、管理员有不同的权限设置,还要接入现有的系统环境中,我们又需要更进一步的修改设计了,这个时候不可避免的需要对整个环境进行修改,于是又要经历若干次的O(n)遍历。经历一番折腾之后,德育处说,我们要统计一下学生考勤情况,这个时候又要引入考勤系统的接入,我觉得,这个时候数据库不崩溃一下似乎有点过意不去了吧?哈哈

浅析面向对象数据库设计思想

面向对象的数据库设计思想

对于面向对象的设计思想来说,我们更多的是关注对象及其属性,比如说我们需要有一张人物对象表,而教师对象表则是人物对象的实例,学生对象表亦然,我们有一个房间对象表,教室对象是房间对象的具体实例,德育处、校董会和图书馆亦然,都是房间的一个具体实例。因此我们仅仅只是需要一个Room表即可

浅析面向对象数据库设计思想

增加考试系统功能的时候我们可以仅仅关注考试对象表,而语文、数学、英语等等这些都是考试对象表的具体实例每一场考试可以建立一个Chinese2StudentsMath2Students等等关系表完成考试情况的链接,之后有了特殊培养班级则是建立Student2Teacher关系表,完成老师学生之间的关系。至于说后续引入的考勤系统,则是通过我们建立的打卡机对象Puncher表,形成Teacher2PuncherStudent2Puncher完成关系的建立,根据这个关系我们可以设置打卡时间,打卡地点,打卡设备等等信息,以增强打卡性质的合理性。

浅析面向对象数据库设计思想

与面向过程设计思想的不同

在这个简单案例中我们发现面向对象和面向过程的优缺点,一个是以建设过程为中心,一个是以建设过程中出现的抽象实体为驱动。在图书馆的场景下确实用这种方式的设计会更加方便一些,新功能新业务的话,只需要在原来的基础上进行扩展建设,需要卸载服务也只是对表进行卸载即可,对原来的结果没有影响,该干嘛就干嘛。

在面向过程的设计方案中,我们的流程化设计使得编程任务明确,在开发之前基本考虑了实现方式和最终结果,具体步骤清楚,便于节点分析,从而衍生出瀑布流的开发模式,这种方式效率高,其强调代码的短小精悍,善于结合数据结构来开发高效率的程序,然而缺点也是很明显,后续将会带来庞大的开发债,代码的可用性降低,扩展能力差

面向对象数据库设计真的这么优秀吗?

显然不是,对于面向对象的数据库设计来说,这种操作方式确实会带来业务上的便利,然而不可避免的会带来性能上的损失,毕竟面向过程的搜索是一种列查询,而对于面向对象则是一种join查询。对于join的话,内外左右全连接都可以,说白了就是在数据表间横向跨表查找,列查询则是一种单表的纵向顺序查询方式,甚至可以通过建立索引的方式进行加快查找,而横向的方式也是只能通过一张张表的跳跃来搜寻。因而在面向对象的搜索过程中避免的出现性能低的现象这是不得不做出性能上面的牺牲,计算时间和空间存储大小都开销很大。此外当要修改对象内部时,对象的属性不允许外部直接存取,所以要增加许多没有其他意义、只负责读或写的行为。这会为编程工作增加负担,增加运行开销,并且使程序显得臃肿。

此外对于这样的数据库设计,表结构将会变得非常臃肿,没有对应orm模型来协助处理的话,dba的工作也会很辛苦。

原创文章,作者:Zhu, Yuanyuan,如若转载,请注明出处:https://www.yidc.net/archives/17091