.Net Petshop详解(二):petshop三层结构之DataTier
交互的三层综述
在前面的文章中,我们丛整个系统的角度了解了petshop的三层部署结构物理上的一个概貌,没有从应用程序的角度来说明是如何划分的,也不清楚数据展示层,中间层,数据层是如何交互的。为了更好的说明这个三层的结构以及每一层的具体细节问题,也让大家对整个应用有一个walkthrough,在这里我将说明从系统的角度来看(见参考图1),顾客在购物的过程中,系统的三层是如何的工作以及如何的交互。这个东西有点象UML里面的实例情景故事,对需求和分析的进一步是大有帮助的。
图1 .NET Petshop 架构
从这个情景中,我们可以很清晰的了解到Internet Customer在购物时系统的运作情形。首先通过数据展示层的用户交互界面Cart.aspx页面输入顾客购买的商品以及数量,然后这些购物清单由后台的应用程序(cart.aspx.cs)做相应的预处理(如安全验证,校验,数据的格式化等等),接着调用中间件(在程序结构里面就是一些.NET Assembly,封装了购物的商业逻辑),最后通过数据访问接口来更新数据库里面的数据(数据层)。
数据层(Database)
.NET Petshop的数据库并不是十分的庞大,总共有12个用户表和23个存储过程。Petshop数据库里面存储的是用户数据,帐号数据,产品数据,用户配置数据,订单数据,库存数据以及供应商的数据。应用程序访问数据库的数据并不是直接的与数据库表打交道,而是通过存储过程的运行来获取所需要的数据。这样的设计有一个好处就是,避免了频繁的表操作,而通过运行在服务器端的存储过程可以极大的提高运作效率和提升访问数据的速度,同时也很好的屏蔽了数据库表的逻辑,使得数据库访问变成了数据库提供的服务访问。当然,也有人指责说这些存储过程迁移性是值得怀疑的。
下面我将通过表格把这些数据库的基本表列出来(见表1),并一一做说明,希望对大家深入的理解有帮助。
表名称 |
备注信息 |
Account |
基本用户信息。 |
BannerData |
存储的是系统界面的banner图片的设置信息。 |
Category |
宠物的类别目录表(比如鱼类,狗类等等)。 |
Inventory |
宠物产品的存货信息。 |
Item |
单个产品的详细信息。 |
LineItem |
订单的每一项的详细信息,包括产品名称和数量,价格等。 |
Orders |
用户购物的订单,一个订单可以包括多项LineItem |
OrderStatus |
订单的状态 |
Product |
宠物的产品列表,一条Product可能包括多个Item |
Profile |
用户配置表,用于记录他们的favorites。 |
Signon |
用户帐号登陆表,因为常用,故从Account独立出来。 |
Supplier |
供应商信息。 |
通过上表我们知道了petshop数据库的数据库表的一些信息,但是这些表之间到底是一种什么样的关系呢?关心数据库建模和设计的人可能对这个问题比较感兴趣。在这里,我将给出图表(图2)说明这些数据库表之间的关系。图2中列出了这些表之间的关系和主键信息。
图2:petshop数据库物理设计模式
技巧:其实对于从事过数据库建模和设计的人都知道,得到上面的数据库模型图形并不是一件很困难的事情。正如我们前面提到的一样,我们可以用Visio做工程反转就可以得到上面这么美观的设计模型图了。同时,我们也可以在模型图中做修改设计,可以马上应用到你的物理数据库,使其保持同步。
说完了基本的数据库表,接下来我们看看存储过程。用微软的话说,只有设计称存储过程,才算是”cleaner separation of code from the middle-tier”,我个人觉得这样做是很好的。同样的,我把它列在一个表格里(表2)。
存储过程名称 |
备注信息 |
upAccountAdd |
增加一个帐号。 |
upAccountGetAddress |
获取用户的地址,主要用于下订单时注册地址与送货地址不一。 |
upAccountGetDetails |
获取帐号的详细信息。 |
upAccountLogin |
用户登陆验证。 |
upAccountUpdate |
更新用户帐号。 |
upCategoryGetList |
获取某个类别的产品列表。 |
upInventoryAdd |
增加指定的项到存活信息。 |
upInventoryGetList |
获取存货列表。 |
upItemAdd |
增加一项产品。 |
upItemGetDetails |
获取指定产品项的详细信息。 |
upItemGetList |
获取某一特定类别的产品的具体项目列表。 |
upItemGetList_ListByPage |
功能与上同,但是分页获取数据。 |
upOrdersAdd |
增加一项订单。 |
upOrdersGet |
获取某一订单的信息。 |
upOrdersGetDetails |
获取某一订单的详细信息。 |
upOrderStatusGet |
获取订单的状态。 |
upProductAdd |
增加一类别产品。 |
upProductGetList |
返回某类产品的列表。 |
upProductGetList_ListByPage |
与上同,但是分页获取结果数据。。 |
upProductSearch |
产品搜索。 |
upProductSearch_ListByPage |
与上同,但是翻页获取结果数据。 |
upProfileGetBannerOption |
Banner的配置信息。 |
upProfileGetListOption |
获取用户配置信息。 |
表2:petshop存储过程列表
在这些存储过程里面使用了SQL Server2000的OpenXML的特性来代替传统的行集结果,使用在非常频繁的数据访问操作,可以减轻系统的负担。
好了,petshop的Datatier就说到这里了,在后面的文章我会就一个数据访问的实例再次解说存储过程的执行。接下来我将就中间层做介绍了。
转载于:https://www.cnblogs.com/xoray007/archive/2010/05/22/1741789.html
.Net Petshop详解(二):petshop三层结构之DataTier相关推荐
- .NET Petshop详解(五):petshop输出缓存设置 (转)
.NET Petshop详解(五):petshop输出缓存设置 (转)[@more@] .NET Petshop详解(五):petshop输出缓存设置XML:namespace prefix = o ...
- PopUpWindow使用详解(二)——进阶及答疑
相关文章: 1.<PopUpWindow使用详解(一)--基本使用> 2.<PopUpWindow使用详解(二)--进阶及答疑> 上篇为大家基本讲述了有关PopupWindow ...
- 安卓 linux init.rc,[原创]Android init.rc文件解析过程详解(二)
Android init.rc文件解析过程详解(二) 3.parse_new_section代码如下: void parse_new_section(struct parse_state *state ...
- [转]文件IO详解(二)---文件描述符(fd)和inode号的关系
原文:https://www.cnblogs.com/frank-yxs/p/5925563.html 文件IO详解(二)---文件描述符(fd)和inode号的关系 ---------------- ...
- Android init.rc文件解析过程详解(二)
Android init.rc文件解析过程详解(二) 3.parse_new_section代码如下: void parse_new_section(struct parse_state *state ...
- linux 进程间通信 dbus-glib【实例】详解二(下) 消息和消息总线(ListActivatableNames和服务器的自动启动)(附代码)
linux 进程间通信 dbus-glib[实例]详解一(附代码)(d-feet工具使用) linux 进程间通信 dbus-glib[实例]详解二(上) 消息和消息总线(附代码) linux 进程间 ...
- linux 进程间通信 dbus-glib【实例】详解二(上) 消息和消息总线(附代码)
linux 进程间通信 dbus-glib[实例]详解一(附代码)(d-feet工具使用) linux 进程间通信 dbus-glib[实例]详解二(上) 消息和消息总线(附代码) linux 进程间 ...
- OS--进程间通信详解(二)
OS–进程间通信详解(二) 文章目录 OS--进程间通信详解(二) 一.进程间通信 1.互斥量 Futexes Pthreads中的互斥量 2.管程 3.消息传递 消息传递系统的设计要点 用消息传递解 ...
- 数据结构--图(Graph)详解(二)
数据结构–图(Graph)详解(二) 文章目录 数据结构--图(Graph)详解(二) 一.图的存储结构 1.图的顺序存储法 2.图的邻接表存储法 3.图的十字链表存储法 4.图的邻接多重表存储法 二 ...
- Pytorch|YOWO原理及代码详解(二)
Pytorch|YOWO原理及代码详解(二) 本博客上接,Pytorch|YOWO原理及代码详解(一),阅前可看. 1.正式训练 if opt.evaluate:logging('evaluating ...
最新文章
- 社会网络计算与社会网络分析、核心指标有哪些?社会网络计算有什么意义?
- 课时 30:理解 RuntimeClass 与使用多容器运行时(贾之光)
- python读取文件r_python 文件读写模式r,r+,w,w+,a,a+的区别(附代码示例)
- Docker上部署GitLab , 搭建私有Git仓库 (基于Docker镜像sameersbn/docker-gitlab)
- 厦门大学数学专业考研试题参考解答
- 魔法方法——Python
- Mybatis学习(2)—— 对象关系映射
- 多空对比(DKDB)指标
- python+django+mysql电影院选座订票系统毕业设计毕设开题报告
- VMware虚拟机Mac OS X 扩展内存方法
- mess组网 中继_想全屋覆盖还用中继器?out啦!Mesh组网才是最佳方案
- clang-format代码格式化风格选项详细说明
- 极光笔记 | 极光推送业务无中断迁移上云实践
- Material Design控件使用(二)
- 从提示框:适用于Windows的iPad接口仿真,Easy Access iPhone手电筒和Kindle收藏管理...
- 浅谈毕业院校对程序员的影响--蝴蝶如何飞的过沧海?
- Java实现线性回归模型算法
- python汉诺塔递归算法流程图,python实现汉诺塔递归算法经典案例
- CanOpen and EtherCAT
- maskrcnn_benchmark 代码详解(更新中...)
热门文章
- JZOJ 3418. 【NOIP动态规划专题】选课
- 线性筛法 与 线性求欧拉函数 的计算模板
- JZOJ 4932. 【NOIP2017提高组模拟12.24】B
- qt之键盘的设计及QlineEdit内容读取
- python 读取大文件_Python读取大文件
- [codevs 1237] 餐巾计划问题
- Codeforces 576D Flights for Regular Customers (图论、矩阵乘法、Bitset)
- 抽象类可用于创建对象吗_野芝麻,见过吗?可用于肺热咳血、血淋、跌打损伤...
- php+堆排序算法,排序算法-堆排序-php
- Nginx Mac笔记