这次来讲MVC中最后的M。

Model,几乎可以说是网页应用的核心。

之前课程提到过网页应用是由数据库驱动,而在很多场景,数据库 = M ; M = 数据库。

所谓的ORM; object relational mapping。

现在新的网页开发框架,特别是MVC框架,都会提供ORM支持,避免程序员直接写SQL、操作数据库。

传统上,ASP/ php臭名昭著的sql注入问题,便是因为菜鸟程序员直接在程序中根据用户输入拼接数据库造成的;而使用ORM框架,则可以彻底避免这种问题。

ORM有两种风格,一种是 R => O;一种是 O => R 。

====== R => O ======

传统上,程序员也都是先完成数据库设计(甚至是由DBA完成),然后再考虑相应的对象生成,也就是所谓的 R => O。

在这样的场景下,整个软件的框架,还是以数据库为核心,业务的设计思维是以关系型数据库的表结构为基础去考虑的,具体应用实现上,会考虑很多关系型数据库的功能特性,比方说,外键,joining等等,并且,程序员需要直接考虑“数据库设计三范式”,以及冗余字段等面向数据库的优化手段。

并且,程序员也很可能会采用数据库的一些高级特性,如视图、存储过程、甚至触发器等等以方便使用。

O的存在,仅仅是为了方便操作数据库表。

====== O => R ======

这种设计哲学则是相反,程序员做业务分析、实现架构设计的时候,并不过多考虑数据库的特性与限制;程序仅考虑自己的业务对象:编程语言中的对象。

数据库仅仅只是作为一个对象持久层来考虑:

* 程序运行的时候,对象是自动保持在内存中。

* 但在对象状态改变、程序退出的时候,将对象保存进数据库。

* 程序重新启动的时候,则从数据库中获得原先数据,并还原为内存中的对象。

在这样的场景下,数据库是一个可以被替换的存储层,它可以是关系型数据库,也可以是NoSQL,甚至是硬盘文件;所以,即便使用关系型数据库,一般也不会使用其高级功能。

设计哲学的不同直接造成了使用技术的不同。

====== 比较 ======

在ED开发圣经PEAA中,列举了下面三种方案:

1. Trascation Script

也就是直接拼接SQL啦~

2. Table Module

R => O;并且,O非常简单,直接以类似数组的方式读取表数据。

.net中ADO.net的DataTable / DataRow对象便是这种设计的典型实现。

3. Domain Model

O => R,直接设计业务领域(Domain)的对象,然后在考虑对象的持久化方案。

针对上面3中方案,Martin Fowler画了下面这张著名图解:
http://www.hamishgraham.net/page/Work-Habits.aspx/Architecture/Business-Layer

他的结论是:

使用Table Module的方式,永远比直接写SQL简单;在简单的业务场景下,Table Module也会比Domain Model简单,但Table Module的方案复杂度会随着业务复杂化而快速增长。

反之,Domain Model的复杂度跟业务复杂度相比始终保持水平增长;它虽然一开始最复杂,但随着业务复杂度超过一定程度后,它反而会成为最简单的方案。

就我自己的开发经验,基本与Fowler的描述吻合;但随着ORM技术的成熟,Domain Model,未必如他在图中画的那样,一开始就有那么高的复杂度。

关键是看程序员是否习惯于关系型数据库的实现方案,如果是,那么,切换去Domain Model,确实会比较麻烦,各种不适应。

但如果是一个没有关系型数据库经验的程序员,或者说,没有强制使用SQL思维习惯的程序员,使用Domain Model,也可以是很自然的方案。

下一课,讲继续详细说明Domain Model。

作业:

1. ED开发圣经PEAA究竟是哪本书?

2. 数据库三范式是什么?

3. 关于Domain Model,什么是充血模型?什么是贫血模型?

51CTO系列:

  1. 宅男程序员给老婆的计算机课程之0:认清本质
  2. 宅男程序员给老婆的计算机课程之1:认清实际
  3. 宅男程序员给老婆的计算机课程之2:怎么看待牛人
  4. 宅男程序员给老婆的计算机课程之3:架构比较
  5. 宅男程序员给老婆的计算机课程之4:SQL vs NoSQL
  6. 宅男程序员给老婆的计算机课程之5:设计模式
  7. 宅男程序员给老婆的计算机课程之6:模版引擎
  8. 宅男程序员给老婆的计算机课程之7:运维的重要性
  9. 宅男程序员给老婆的计算机课程之8:控制器
  10. 宅男程序员给老婆的计算机课程之9:数据模型
  11. 宅男程序员给老婆的计算机课程之10:做,就对了!
  12. 宅男程序员给老婆的计算机课程之11:域模型

转载于:https://blog.51cto.com/wuvist/847715

宅男程序员给老婆的计算机课程之9:数据模型相关推荐

  1. 宅男程序员给老婆的计算机课程之8:控制器

    设计模式再"高级"一点,便是所谓的"框架"了. 从事Web开发,一般都会接触到MVC框架这个概念. M:也就是Model,直接跟网站数据库相关. V:也就是Vi ...

  2. 宅男程序员给老婆的计算机课程之4:SQL vs NoSQL

    男主角:Wuvist(新浪微博),真名翁伟,自称胖程序员一个,幸好已婚.学习.NET出身,现常用Python做服务器端开发,曾任新加坡某创业公司主程.公司被Techcrunch blog过后,觉得新加 ...

  3. 宅男程序员给老婆的计算机课程之5:设计模式

    设计模式,应该是很多ED心目中牛B的编程方式. 上回说到ED的好书POEE,实际上便是一本专门讲企业开发中使用的设计模式中的书. 设计模式,并不多,基本上看完GoF的这边<Design Patt ...

  4. 宅男程序员给老婆的计算机课程之6:模版引擎

    [51CTO独家特稿]设计模式再"高级"一点,便是所谓的"框架"了. 从事Web开发,一般都会接触到MVC框架这个概念. M:也就是Model,直接跟网站数据库 ...

  5. 宅男程序员给老婆的计算机课程之10:做,就对了!

    [51CTO独家特稿]学以致用,很多时候,学习一样东西最好需要能够在实际中应用起来. 所以我在第2课"怎么看待牛人"中强调的必须"看代码 + 写代码". 不过我 ...

  6. 宅男程序员给老婆的计算机课程

    声明: Technorati 标记: IT生活 本文档来自:http://developer.51cto.com/art/201203/321936.htm 宅男程序员给老婆的计算机课程之0:认清本质 ...

  7. 转自51CTO的帖子——宅男程序员给老婆的计算机课程

    在51CTO上闲逛的时候,看了这个系列的帖子.感觉不错,特转发于此,留做纪念. 原文链接: 宅男程序员给老婆的计算机课程之0:认清本质 宅男程序员给老婆的计算机课程之1:认清实际 宅男程序员给老婆的计 ...

  8. 命名自喜剧团体,宅男程序员三个月写出的编程语言是如何改变世界的?

    大数据文摘出品 来源:Zdnet 编译:洪颖菲.李可.Vicky.李雷 1989年,荷兰的一位叫Guido Van Rossum的宅男程序员觉得其他语言都不好用,于是花三个月创造了一种新的编程语言. ...

  9. 宅男程序员不会告诉你用Java实现用一张照片进行GPS定位这么简单

    从微信某个朋友圈随便找了一位美女发的照片 ​ Java对照片进行分析,效果如下 ​ 获得结果如下: {海拔=0 metres, 手机=Xiaomi, 纬度=24.41046111111111, 型号= ...

最新文章

  1. scanner怎样回到文件开头_Radare2逆向分析dex/so/二进制等文件的使用方法
  2. 安卓桌面软件哪个好_安卓模拟器哪个比较好?
  3. NeurIPS 2020 | 利用像素级别循环一致性解决领域自适应语义分割问题
  4. tomcat java环境配置
  5. c++builder tadoquery存储过程_Electron桌面应用程序从创建项目、启动项目到打包程序的详细过程...
  6. centos7 最小化安装 无 ifconfig,netstat 的安装
  7. Windows 7密码重设盘的内部原理浅析
  8. 嵌入式linux ntpd命令,嵌入式Linux网络编程之:实验内容——NTP协议实现
  9. Linux基础——为什么要学Linux?
  10. seurat提取表达矩阵_本周最新文献速递20200719
  11. rtabmap_ros安装---43
  12. java单例模式的7种实现方式
  13. 机器人防火墙出击 提升在线业务的安全未来
  14. 官方下载:slf4j-nop.jar slf4j-simple.jar, slf4j-log4j12.jar, slf4j-jdk14.jar
  15. 汽车智能化新赛道——CMS国标明年1月1日落地,供应链已提前布局
  16. Linux-v10.0
  17. 移动游戏运营必备的数据分析指标
  18. WWW 指南-万维网联盟(World Wide Web)
  19. 迅为iTOP-4418开发板烧写 Android 7.1 镜像
  20. 制作可执行的JAR文件包及jar命令详解

热门文章

  1. Java 比较相等 == or .equal()?
  2. 袁晖:C2B汽车电商模式创新
  3. Linux编程简介——动态链接库
  4. html5倒计时秒杀怎么做,vue 设计一个倒计时秒杀的组件
  5. 苹果天气不显示_iPhone6开机不显示苹果售后维修案例
  6. 【转载】回归模型的评价指标
  7. centos6 安装 mantisbt-1.2.8 —— (3)Linux系统下yum源配置(Centos 6)
  8. 小米7的传闻:这是我们迄今为止知道的
  9. linux 进程相关
  10. (转)HIBERNATE与 MYBATIS的对比