当前位置:首页 > 问答 > 正文

数据库服务器多层结构到底是啥,简单说说它怎么分层和作用

数据库服务器多层结构,说白了,就是一种“分活儿干”的设计思想,它把一个原本可能又大又笨重的软件应用,像切蛋糕一样,切成好几层,每一层专门负责一块事情,层与层之间通过明确的规矩(比如网络请求)来沟通,这么做的好处非常多,我们后面会详细说,最常见的分层方式就是三层结构,这也是最经典、最容易理解的一种,下面我就主要围绕这三层来简单说说它们分别是啥,以及各自的作用。

(参考来源:软件架构领域的通用实践与经典教材《企业应用架构模式》中关于分层模式的论述)

第一层是表现层,你也可以叫它用户界面层。 这一层是干嘛的呢?它就是直接跟用户打交道的那个部分,是用户能看到、能操作的东西,比如你打开手机上的一个购物APP,那些精美的图片、商品的列表、搜索框、按钮,所有这些你眼睛能看到、手指能点到的,都属于表现层,它的核心作用只有一个:当好“传话筒”和“化妆师”。

  • 传话筒:它负责把用户的操作(比如点击“登录”、输入搜索关键词)收集起来,打包成一个请求,然后发给后面第二层的“业务逻辑层”去处理,等第二层处理完了,它再把结果(比如登录成功、搜索到的商品列表)用用户能看懂的方式(比如显示“登录成功”的提示、把商品列表展示出来)呈现给用户。
  • 化妆师:它不关心数据是怎么算出来的,也不关心数据是怎么存的,它只关心怎么把数据打扮得漂漂亮亮,让用户用起来舒服,比如同样的商品数据,在手机APP上可能显示成卡片式,在网页上可能显示成列表式,这都是表现层干的活。

表现层就像一个公司的前台或者客服,专门负责接待客户(用户),理解客户的需求,然后把需求转达给后面的部门,再把部门的处理结果反馈给客户。

数据库服务器多层结构到底是啥,简单说说它怎么分层和作用

(参考来源:Web开发中经典的MVC模式,其中的View和Controller通常被归为表现层的组成部分)

第二层是业务逻辑层,有时候也叫应用层。 这一层是整个系统的“大脑”和“总指挥”,是真正体现这个软件是干什么的核心所在,它不直接跟用户打交道,也不直接去碰数据库,它处在中间承上启下的关键位置,它的作用非常关键:

  • 处理核心业务:比如在一个银行系统里,“转账”这个操作,表现层只负责让用户输入转出账户、转入账户和金额,然后点“确认”,但真正执行转账的,是业务逻辑层,它会检查转出账户有没有足够的钱,检查转入账户是否存在,计算手续费,然后分别从转出账户扣钱、向转入账户加钱,这一系列复杂的、有顺序的、有规则的步骤,就是业务逻辑。
  • 协调调度:业务逻辑层接到表现层的请求后,它可能需要命令第三层的“数据访问层”去数据库里查一些数据,然后根据查到的数据进行计算和判断,最后再命令数据访问层把更新的数据存回数据库,它就像一个项目的项目经理,自己不一定亲手干活,但所有的工作流程都由它来控制和安排。
  • 规则集中地:所有关于这个业务的规则,新用户注册送10元优惠券”、“商品库存少于10件时显示紧张”等等,都应该写在这一层,这样,规则变了,只需要改这一层的代码,而不用去改动表现层或数据层。

如果没有这一层,所有复杂的判断和计算逻辑就可能散落在用户界面或者操作数据库的代码里,导致系统变得一团乱麻,难以修改和维护。

数据库服务器多层结构到底是啥,简单说说它怎么分层和作用

(参考来源:Martin Fowler在《企业应用架构模式》中强调的“领域逻辑”层,其核心思想就是将业务规则集中管理)

第三层是数据访问层,也叫持久层。 这一层是专门跟数据库打交道的“仓库管理员”,它的任务非常单纯:执行最基础的“增删改查”操作,也就是把数据存进数据库,从数据库里取出数据,更新数据库里的数据,或者删除数据。

  • 封装数据库操作:它把那些复杂的、专业的操作数据库的命令(比如SQL语句)都封装起来,对于上面的业务逻辑层来说,它根本不需要知道数据库是MySQL还是Oracle,也不需要知道数据表具体是怎么设计的,业务逻辑层只需要对数据访问层说:“给我把id为123的用户信息拿来”,或者“把刚才生成的订单保存起来”,具体怎么“拿”、怎么“存”,是数据访问层的事情。
  • 隔离变化:这样做的好处是,万一以后要换数据库了,比如从MySQL换成另一种数据库,我们只需要修改数据访问层的代码,让它适应新的数据库就可以了,上面的业务逻辑层和表现层完全不受影响,因为它们根本不直接接触数据库,这就大大降低了系统维护的成本和风险。

数据访问层就像一个专业的仓库保管员,业务逻辑层(项目经理)只需要说要什么货或者存什么货,保管员自己会找到对应的货架(数据库表),用专业的方式(SQL)完成存取。

数据库服务器多层结构到底是啥,简单说说它怎么分层和作用

(参考来源:在Java EE开发中,DAO模式就是数据访问层的典型实现)

为什么非要这么麻烦地分层呢?

把系统分成这些层,主要目的是为了“解耦”和“高内聚”。

  • 解耦:意思是降低层与层之间的依赖关系,每一层都像一块独立的积木,它们之间通过定义好的接口连接,修改其中一层(比如给APP换一个更漂亮的界面,或者更换数据库类型),只要接口不变,其他层就不用动,这极大地提高了系统的灵活性和可维护性。
  • 高内聚:意思是把相关的功能聚集在同一层里,比如所有关于界面显示的逻辑都在表现层,所有业务规则都在业务逻辑层,所有数据库操作都在数据访问层,这样,当需要修改某个功能时,开发者能很快地定位到相关的代码在哪里,不会东找一点西找一点。

除了经典的三层,在更复杂、更大规模的系统里,还可能衍生出更多的层,在表现层和业务逻辑层之间,可能会加一个API网关层,用来统一管理所有进入系统的请求,做身份验证、流量控制、日志记录等,在业务逻辑层后面,数据访问层前面,可能会加一个服务层,把一些非常核心的、可复用的业务功能包装成更粗粒度的服务,供不同的表现层(比如APP、网站、小程序)共同调用。

数据库服务器的多层结构是一种经过实践检验的、非常有效的软件设计方法,它通过明确的分工,让复杂的系统变得清晰、易于开发、易于扩展和维护,虽然一开始看起来有点抽象和麻烦,但它就像是给软件盖房子先画好设计图纸一样,是保证软件质量、支撑软件长远发展的坚实基础。