宅男程序员给老婆的计算机课程之9:数据模型
这次来讲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系列:
- 宅男程序员给老婆的计算机课程之0:认清本质
- 宅男程序员给老婆的计算机课程之1:认清实际
- 宅男程序员给老婆的计算机课程之2:怎么看待牛人
- 宅男程序员给老婆的计算机课程之3:架构比较
- 宅男程序员给老婆的计算机课程之4:SQL vs NoSQL
- 宅男程序员给老婆的计算机课程之5:设计模式
- 宅男程序员给老婆的计算机课程之6:模版引擎
- 宅男程序员给老婆的计算机课程之7:运维的重要性
- 宅男程序员给老婆的计算机课程之8:控制器
- 宅男程序员给老婆的计算机课程之9:数据模型
- 宅男程序员给老婆的计算机课程之10:做,就对了!
- 宅男程序员给老婆的计算机课程之11:域模型
转载于:https://blog.51cto.com/wuvist/847715
宅男程序员给老婆的计算机课程之9:数据模型相关推荐
- 宅男程序员给老婆的计算机课程之8:控制器
设计模式再"高级"一点,便是所谓的"框架"了. 从事Web开发,一般都会接触到MVC框架这个概念. M:也就是Model,直接跟网站数据库相关. V:也就是Vi ...
- 宅男程序员给老婆的计算机课程之4:SQL vs NoSQL
男主角:Wuvist(新浪微博),真名翁伟,自称胖程序员一个,幸好已婚.学习.NET出身,现常用Python做服务器端开发,曾任新加坡某创业公司主程.公司被Techcrunch blog过后,觉得新加 ...
- 宅男程序员给老婆的计算机课程之5:设计模式
设计模式,应该是很多ED心目中牛B的编程方式. 上回说到ED的好书POEE,实际上便是一本专门讲企业开发中使用的设计模式中的书. 设计模式,并不多,基本上看完GoF的这边<Design Patt ...
- 宅男程序员给老婆的计算机课程之6:模版引擎
[51CTO独家特稿]设计模式再"高级"一点,便是所谓的"框架"了. 从事Web开发,一般都会接触到MVC框架这个概念. M:也就是Model,直接跟网站数据库 ...
- 宅男程序员给老婆的计算机课程之10:做,就对了!
[51CTO独家特稿]学以致用,很多时候,学习一样东西最好需要能够在实际中应用起来. 所以我在第2课"怎么看待牛人"中强调的必须"看代码 + 写代码". 不过我 ...
- 宅男程序员给老婆的计算机课程
声明: Technorati 标记: IT生活 本文档来自:http://developer.51cto.com/art/201203/321936.htm 宅男程序员给老婆的计算机课程之0:认清本质 ...
- 转自51CTO的帖子——宅男程序员给老婆的计算机课程
在51CTO上闲逛的时候,看了这个系列的帖子.感觉不错,特转发于此,留做纪念. 原文链接: 宅男程序员给老婆的计算机课程之0:认清本质 宅男程序员给老婆的计算机课程之1:认清实际 宅男程序员给老婆的计 ...
- 命名自喜剧团体,宅男程序员三个月写出的编程语言是如何改变世界的?
大数据文摘出品 来源:Zdnet 编译:洪颖菲.李可.Vicky.李雷 1989年,荷兰的一位叫Guido Van Rossum的宅男程序员觉得其他语言都不好用,于是花三个月创造了一种新的编程语言. ...
- 宅男程序员不会告诉你用Java实现用一张照片进行GPS定位这么简单
从微信某个朋友圈随便找了一位美女发的照片 Java对照片进行分析,效果如下 获得结果如下: {海拔=0 metres, 手机=Xiaomi, 纬度=24.41046111111111, 型号= ...
最新文章
- scanner怎样回到文件开头_Radare2逆向分析dex/so/二进制等文件的使用方法
- 安卓桌面软件哪个好_安卓模拟器哪个比较好?
- NeurIPS 2020 | 利用像素级别循环一致性解决领域自适应语义分割问题
- tomcat java环境配置
- c++builder tadoquery存储过程_Electron桌面应用程序从创建项目、启动项目到打包程序的详细过程...
- centos7 最小化安装 无 ifconfig,netstat 的安装
- Windows 7密码重设盘的内部原理浅析
- 嵌入式linux ntpd命令,嵌入式Linux网络编程之:实验内容——NTP协议实现
- Linux基础——为什么要学Linux?
- seurat提取表达矩阵_本周最新文献速递20200719
- rtabmap_ros安装---43
- java单例模式的7种实现方式
- 机器人防火墙出击 提升在线业务的安全未来
- 官方下载:slf4j-nop.jar slf4j-simple.jar, slf4j-log4j12.jar, slf4j-jdk14.jar
- 汽车智能化新赛道——CMS国标明年1月1日落地,供应链已提前布局
- Linux-v10.0
- 移动游戏运营必备的数据分析指标
- WWW 指南-万维网联盟(World Wide Web)
- 迅为iTOP-4418开发板烧写 Android 7.1 镜像
- 制作可执行的JAR文件包及jar命令详解
热门文章
- Java 比较相等 == or .equal()?
- 袁晖:C2B汽车电商模式创新
- Linux编程简介——动态链接库
- html5倒计时秒杀怎么做,vue 设计一个倒计时秒杀的组件
- 苹果天气不显示_iPhone6开机不显示苹果售后维修案例
- 【转载】回归模型的评价指标
- centos6 安装 mantisbt-1.2.8 —— (3)Linux系统下yum源配置(Centos 6)
- 小米7的传闻:这是我们迄今为止知道的
- linux 进程相关
- (转)HIBERNATE与 MYBATIS的对比