Python Web 基础向(四) 浅谈数据层
数据层一般会给人带来一些困扰,在于其定位不准确。聚合Model的工作也可以放在逻辑层做,但会导致逻辑层变重,经常出现大段晦涩代码。因此我的建议是保留Model聚合层,尽管会导致工作量的略微增加,但却可以使代码逻辑更加清晰,即每一层都只做自己该做的事。

数据层可以不存在的理由在于逻辑层的业务聚合层已经做了类似的事。但区别在于,业务聚合层是以业务流程来划分的,而数据层则是更为细分的DB层上的聚合。
举个简单的例子,业务中经常会涉及到活动,一方面活动有自己的各类配置,比如规则、奖励、周期等,一方面活动又和用户、订单相关,因此你的数据库中至少需要两张表来储存活动相关的数据,activity表来储存活动配置,activity_tracking表来储存活动预订单的关系等,你的model层也会相应出现Activity和ActivityTracking对象。数据层的作用就在于此:将DB层中的多个同一抽象的model类聚合到一起,这样,逻辑层中将只会引用一个Activity的数据类。如果没有数据层,逻辑层中将引用这两个model层,并经常会在一个函数内对两个model进行操作,在业务逻辑复杂的情况下,逻辑层将变得臃肿不堪。
这里要注意逻辑层聚合和数据层聚合的区别。Activity和ActivityTracking虽然是两张表,但都记录着活动相关的数据,因此可以聚合到一个大专栏 Python Web 基础向(四) 浅谈数据层laintext highlighter-rouge">Acticity数据类中。而在活动的业务层中,聚合的范围则要大得多,可能会对用户、账户、余额、等级等多方面的东西都有操作,这是活动这一业务所决定的(之后会提到)。
# data/student.py
from my_project.models import auto_commit
from my_project.models.student import StudentModel
class Student(object):
@auto_commit
def insert_student(self, student):
return StudentModel.insert(student)
@auto_commit
def update_student(self, student):
return StudentModel.update(student)
def mget_student_with_id(self, student_id):
return StudentModel.mget_student_with_id(student_id)
# ...
(End)
Python Web 基础向(四) 浅谈数据层的更多相关文章
- 【ASP.NET MVC系列】浅谈数据注解和验证
[ASP.NET MVC系列]浅谈数据注解和验证 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google C ...
- 【.Net基础二】浅谈引用类型、值类型和装箱、拆箱
目前在看CLR via C#,把总结的记下来,索性就把他写成一个系列吧. 1.[.Net基础一] 类型.对象.线程栈.托管堆运行时的相互关系 2.[.Net基础二]浅谈引用类型.值类型和装箱.拆箱 引 ...
- web基础(四)严格模式与混杂模式
web基础(四)严格模式与混杂模式 一.介绍 DOCTYPE 标签是一种标准通用标记语言的文档类型声明,它的目的是要告诉标准通用标记语言解析器,它应该使用什么样的文档类型定义(DTD)来解析文档.DO ...
- Web Service进阶(七)浅谈SOAP Webservice和RESTful Webservice
浅谈SOAP Webservice和RESTful Webservice REST是一种架构风格,其核心是面向资源,REST专门针对网络应用设计和开发方式,以降低开发的复杂性,提高系统的可伸缩性.RE ...
- 视频基础知识:浅谈视频会议中H.264编码标准的技术发展
浅谈视频会议中H.264编码标准的技术发展 浅谈视频会议中H.264编码标准的技术发展 数字视频技术广泛应用于通信.计算机.广播电视等领域,带来了会议电视.可视电话及数字电视.媒体存储等一系列应用,促 ...
- Python 1基础语法四(数字类型、输入输出汇总和命令行参数)
一.数字(Number)类型 python中数字有四种类型:整数.布尔型.浮点数和复数. int (整数), 如 1, 只有一种整数类型 int,表示为长整型,没有 python2 中的 Long. ...
- 浅谈传输层协议TCP和UDP
在当今因特网的层次结构中,传输层的协议主要有两种,其一为Transmission Control Protocol,即TCP:其二为User Datagram Protocol,即UDP. 1.TCP ...
- Java基础:浅谈数据输入流/数据输出流《DataInputstream类与DataOutputstream类》
一.理论概述 数据输入/输出流(DataInputStream类与DataOutputStream类) 允许应用程序以与机器无关的方式从底层输入流中读取基本Java数据类型. 说白了就是,当读取一个 ...
- [Android 泥水匠] Android基础 之一:浅谈Android架构到HelloWorld案例的剖析
作者:泥沙砖瓦浆木匠网站:http://blog.csdn.net/jeffli1993个人签名:打算起手不凡写出鸿篇巨作的人,往往坚持不了完成第一章节. 交流QQ群:[编程之美 365234583] ...
随机推荐
- UML-如何使用层进行设计?
1.将代码组织映射为层和UML包 com.mycompany |_nextgen |_ui |_domain |_service |_util org.apache.log4j 2.使用对象设计应用 ...
- numpy(一)
ndarray np的一个核心类,它描述了相同类型的“项目”集合.可以使用例如N个整数来索引项目.每个项目占用相同大小的内存块, 并且所有块都以完全相同的方式解释. 如何解释数组中的每个项目由单独的数 ...
- 面向对象 part2 属性的特性
6.1.1理解对象 创建自定义对象最简单的方式就是创建一个object实例.然后添加方法和实例 var person = new Object() person.name = "hi&quo ...
- tensorflowlite 分类模型从训练到安卓部署
https://blog.csdn.net/qq_33200967/article/details/82773677
- MySQL--数据插入
1.创建表的同时插入其他表的数据 CREATE TABLE table_name SELECT ... FROM ... [...] 例: CREATE TABLE tabl_memory EN ...
- HTML5之FileReader小结
方法: 方法名 参数 描述 abort none 中断读取 readAsBinaryString file 将文件读取为二进制码 readAsDataURL file 将文件读取为 DataURL r ...
- 八、Shell脚本高级编程实战第八部
一.使用for循环在/oldboy目录下创建10个文件名为oldboy-x的文件 #!/bin/sh[ ! -d /oldboy ] && mkdir -p /oldbfor i in ...
- 10)global预定义变量
代码展示: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w ...
- js时间与日期
var box = new Date(); //创建了一个日期对象:构造方法里面可以传参数,指定时间.如果没有传,就是默认当前时间alert(box); alert(Date.parse('4/12/ ...
- matplotlib学习——设置线条颜色及形状
在图形表示中,不同的画布或画布中不同的函数,我们常常要用不同的形状或颜色来区分开,这里小编向大家介绍这些参数的表示方法: 一.控制颜色 b--blue c--cyan(青色) ...