PetShop 4数据库分析一

    虽然园子里面有很多是petShop方面的学习资料,尤其是在我的这个学习资料里面张逸老师所写的《解剖PetShop》系列,是相当精彩的,给大家展示了一个相对比较完整的.NET框架、技术以及相关的设计模式。我写本文也不是说明我把这整个框架理解的有多深刻,说实在话,我也是刚刚接触.NET,是一个初学者,我只是想把我策够理解到的东西记下来,这里面你如果看到有别人写的东西的影子,那说明我也理解到了那个程度,如果有没涉及到的或讲的太粗的,那说明我还没有理解的那么深刻。这是我技术文章的第一篇,请大家多多指教。 
     在下笔之前,我想对自己的学习过程作一个总结,以前,在没有接触到设计模式的时候,我总是认为面向对象就是把数据和方法封装起来,我封装起来了,就说明我已经面向对象了。学习了。NET之后,我又觉得,分层,就是把层序的层次分开了,数据访问,业务流程,分别放在一起,每一层都调用下一层的方法,这样的结构就是分层的了,说实在话,这个问题迷惑了很久,为什么我的代码总是不那么优雅,为什么,每次我都要更改很多东西。我记得一位老师曾经和我说,你把他们封装起来,和没封装都是一样的,没什么区别,只不过代码的位置发生了变化,我开始一直不了解我的为什么就是位置发生了变化,什么样的结构才是好的结构,我怎么样设计我的代码才算是好的。今天,我看到了petshop,我的感觉告诉我,他的设计比我的要好,不管有什么优缺点,我的理念是先吸收优点。
    废话少说,下面,我就以我的理解先从数据库开始学习整个petshop的结构。
    从整体上说,petshop分了四个数据库,他是从功能角度来说,把数据库分开,采用这种方式到底好不好,我觉得从功能上来说,在数据库级上达到了功能的单一,而且,分离了数据量大的定单出来。
    1、MSPetShop4。
    这一个数据库主要是对产品进行管理。这个数据库里面一个有6张表。如下图所示:
    

    AspNet_SqlCacheTablesForChangeNotification是缓存用的。关于这一点,以后再讨论。
    Category表产品分类表。这个分类主要对产品在大类别上进行分类,比如在petshop中,有鱼类,鸟类等。里面的字段的意思我想大家看得很明白,一个是分类ID,一个是类别名称,一个是他的描述,主键是分类ID。
    product表是产品表,这个产品并不是最终的产品,而是一个抽象意义上的产品,比如说鱼,有很多种类的鱼,比如鲨鱼等等,对于一个宠物商店,鲨鱼这个种类有好几个不同和名字的,那么摆在货架上的就是好几个不同的名字的。具体的每个名字的就要用item表来表示了。那么在product这张表中,他的字段是:产品ID,产品分类,产品名字,备注描述,此类产品对应的图片地址。在这张表中,以产品ID为主键,同时建立了四个索引:1.产品名称;2.分类ID;3.产品名称+分类ID;4.产品ID+产品名称+分类ID。有关索引的相关知识,请查阅数据库方面的资料。
    item表是具体的宠物。每一种产品(product)都对应有一种或几种具体的item。在这张表中productID为其对应的产品,并在这个字段上建立外键约束。这个表的字段从上到下的意思分别为:宠物项ID,对应产品ID,宠物价格,unitCost是什么意思我还没搞清楚,供应商ID,状态(我只看到里面的数据为P,但不知道怎么样修改),宠物名字,宠物所对应的图片地址。在这张表里面,itemID为主键,productid、supplier为外键,也就是他们的值是product表和supplier表中的值,建立了一个大的索引:itemid+productID+ListPrice+Name。
     supplier表是供应商表。这张表的作用,我还没看到有多大,只是在这里标识每一种宠物的供应者是谁,在标准的petshop安装后,里面只有两条数据,那么现在我来介绍一下这张表里面的字段的意思。上图中标识主键的为供应商ID,以下分别为供应商名字,status里面的值为AC,我搞不太清楚代表什么意思,Addr1,Addr2想必大家一看就明白是什么意思了,city从字面意思也可以搞清楚,state是代表美国的哪一个州,zip为邮政编码,后面的是电话号码。
    Inventory是宠物的库存表。ItemID为宠物的ID,下面为库存的数目。我个人认为这里的ItemID应该做一个外键约束,但是petshop并没有做,我不知道这是什么原因。
    根据上面的数据库表,petshop抽象出几个数据实体类。让我们先来分析一下,上面的数据库中,一共有六张表,可以表示这么几个概念,分别是缓存,类别,产品(我不知道这么叫好不好),宠物信息,供应商,库存。可以做为数据实体的肯定要去除缓存,库存,因为缓存只是一个技术,库存则是宠物信息里面可以包含的一个属性,我认为,余下的都可以抽象或是说映射。但是petshop中只对类别,产品,宠物信息进行了抽象实体,没有供应商的具体类,究其原因,可能是因为在petshop中,供应商并不是一个主要的矛盾,也就是说宠物商店和供应商没有太大关系,所以没有包含。那么就让我们看一看在程序中是怎么样来抽象的。如下图所示:

    大家可以看到,上图中的类,基本上是对数据库里面的表的一个抽象,除了Iteminfo又加了几个字段以外。这个图,我是用vs生成的类图,他们对应于petshop里面的model项目,在这个项目里面,不止抽象了这个数据库里面的表,还有像定单,定单项等,等分析到其它的数据库,我们再详细介绍。在model项目中,主要是对数据实体的抽象。他为业务层,以及数据访问层提供一个数据库抽象。我们可以简单的把他认为是一种实体关系映射。主要是为了装数据库的记录转换成面向对象里面的对象,并且提供了强类型数据访问。
    今天就写到这里吧,下面的几篇文章里面,我还会对另外的数据库进行分析,可能这并不能看到整个petshop的结构,但我想从最底层一层一层的向上拨,直到我们可以站在一个高的角度来审视这样的一个大的设计思想。

转载于:https://www.cnblogs.com/gang8246-q/archive/2008/04/12/1150296.html

、Model主要功能: 1、 将每个“业务实体”抽象成“(瘦数据)类”,可以很好地“划分”各个“对象”,操作更加清晰 2、 用于在应用程序各层之间传递数据,被用做传输数据的“容器” 3、 这就是所谓的“建模”过程! 4、 Model各个类(Model文件夹中的各个文件)划分或者说编制的原则,更趋向于模拟整个系统中的业务实体 二、实现细节: 1、 PetShop中Model的规划与数据库表的关系: (1) AccountInfo类——Account表 (2) AddressInfo类——无直接对应关系(对应Account表中部分字段) (3) CartItemInfo类——无直接对应关系 (4) CreditCardInfo类——无直接对应关系 (5) ItemInfo类——Item表 (6) LineItemInfo类——无直接对应关系 (7) OrderInfo类——Orders表 (8) ProductInfo类——Product表 2、 为每个Model中的类都标记了[Serializable],说明这些类可以被传行化,但是不能被继承! 3、 AccountInfo.cs文件:用户在网站注册的信息,及喜好选择情况 4、 使用构造函数可以初始化私有字段;使用属性可以读取私有字段(但使用属性不能设置私有字段的值) 5、 其中包含个AddressInfo类的私有变量,和个AddressInfo类的属性 6、 命名空间为PetShop.Model 7、 AddressInfo.cs文件:用户真实的个人姓名、住址和电话号码等信息 8、 与AccountInfo不同的是,AddressInfo类允许使用属性设置私有变量的值 9、 CartItemInfo.cs文件:描述购物车中每种所选商品的信息的类 10、 该“类”对象的某些信息(如这里的Subtotal属性)可能并不是此类的“自然信息”,而需要经过简单计算而得到!这些简单但必要的信息也要在类的设计中体现出来! 11、 CreditCardInfo.cs文件:表示特定张信用卡的信息 12、 ItemInfo.cs文件:个Item指的是category"product"item,如猫"波斯猫"成年男波斯猫(或成年女波斯猫)。这个文件表示个Item的所有信息 13、 productDesc字段的作用? 14、 LineItemInfo.cs文件:注意与CartItemInfo类的区别!LineItemInfo是用来描述用户最终确认的订单当中的某种类的产品的信息的类 15、 同样包括了Subtotal属性 16、 OrderInfo.cs文件:用于显示用户某个订单具体信息的类,在此个订单当中,可能包括多个商品种类,即包括多个LineItemInfo对象(实际上在OrderInfo类中也确实存在LineItemInfo类型对象的个数组!) 17、 ProductInfo.cs文件:包括个特定Product的信息,如波斯猫 三、启发: 1、 来自Directory项目结束后的启发,以后做设计的时候,要将每个实体抽象为个类,在整个系统中进行操作。 2、 在任意个类当中,可能不只包括此实体类的自然信息,也可以包括些对其他地方数据调用有用的属性信息,如根据数量和单价计算出来的总价属性,或者标志此实体的直属上级实体的属性 四、问题: 1、 忽然发现在MSDN上有文章,关于数据实体的:浏览 2、 抽象这些业务实体模型为瘦数据类的原则是什么?什么样的业务实体可以被抽象,或者说进行抽象后更有意义? 3、 ItemInfo类中,productDesc字段的作用? 、IDAL主要功能: 1、 这完全是“工厂模式”的部分实现而已 2、 这是组接口类,其中包括了每个要公开的数据访问方法。为每个数据库产品单独编写的DAL(数据访问层)都要实现这组接口所定义的方法 3、 也就是规定了在DAL中编写的“对用户账号进行操作的类”所必须执行的方法! 4、 IDAL要达到的目的是:实现业务逻辑(BLL)与数据库访问(DAL)的完全分离!!! 5、 IDAL各个类(IDAL文件夹中的各个文件)划分或者说编制的原则,更趋向于“将对数据库的不同操作进行归类”,考虑的主要方面是数据库操作!!!例如,有对用户账号进行的系列数据库操作,则将这系列操作统放置于IAccount接口(将来实现后的Account类)文件当中 二、实现细节: 1、 IAccount.cs文件:为针对不同数据库产品编写的“操作用户账号的类”所必须实现的系列方法定义契约 2、 IInventory.cs文件:定义“操作库存量的类”所必须实现的系列方法;或者说将操作库存量的系列(所有)方法做个汇总 3、 IItem.cs文件:定义“操作某Item的类”所必须实现的系列方法。(Item在Model中定义了,是指具体某类别的Product,如男猫或女猫) 4、 对于其中的GetItemsByProduct()方法,返回的是个ArrayList的接口类型(IList)的对象(见问题部分!) 5、 IOrder.cs文件:定义了组DAL层中“操作用户订单的类”必须执行的方法。其中包括“添加张新订单”的方法Insert()和根据个已有的订单号取得此订单详细信息的方法GetOrder(),此方法返回的是个OrderInfo对象。(Model中的OrderInfo类模型定义了用户的某张Order中相关的信息,如发货地点,总价,信用卡号码等等) 6、 IProduct.cs文件:定义类组在DAL层中编写的“对Product进行操作的类” 7、 IProfile.cs文件:定义组在DAL层编写的“对用户Profile进行操作的类” 三、启发: 1、 这样就可以让在BLL层只针对IDAL层定义的接口进行编程(使用IDAL接口定义的这些方法)就可以了!!!无论在底层使用了什么厂家的数据库产品,有区别的只是针对此数据库产品编写的DAL层(相同的方法,如SignIn()方法,对于不同的数据库产品,可能有不同的实现方式!),而不会影响到上层的BLL层已经编写好的内容! 2、 从这里可以看到软件架构师和程序员工作上的区别!架构师要负责的是搭建系统的层次结构,定义接口;而程序员要负责的是针对接口的具体代码实现过程! 3、 这个IDAL接口的使用,主要是为了保证在底层数据库实现,甚至数据库产品发生变化的时候,不需要对上层BLL层的业务逻辑进行大量的修改!BLL层针对IDAL接口编程即可!!! 4、 IDAL文件夹中定义的所有的接口中的所有的方法,包括了整个程序要对数据库进行操作的所有方法 5、 由于PetShop只是个演示程序,所以若对数据库操作的某类别(如对Account进行操作)中定义的“操作类”不够用(如除了接口中定义的几个方法外还需要其他Account操作),还可以在接口中追加其他的方法,用以约束DAL层的实现类(如Account类)必须执行这些新增加的方法! 四、问题: 1、 定义这组接口后,如何保证为每个单独的数据库产品编写的DAL都执行这组接口所定义的方法?(答案:编写DAL的时候必须刻意保证,否则就失去了定义IDAL层分割BLL和DAL层的意义!!!) 2、 既然在实现GetItemsByProduct()方法的时候,也是要把返回的所有Item对象添加到个ArrayList当中去,但为什么GetItemsByProduct()方法返回的不是个ArrayList对象,而是个IList接口的对象呢?仅仅是基类引用的方法吗?这里的基类引用有什么用呢?是否是由于为了不限制使用的数组形式?执行IList则可以使用ArrayList,也可以使用其他形式的数组??? 3、 IProduct.cs文件中为何要将查询条件参数定义为个string类型的数组?
关键是系统架构和代码学习两方面,对初学和提高有很大帮助 petshop5.0比较大,代码已经解压出来 4.0和3.0没有解压出来,自行安装解压(需要SqlServer数据做连接或者在安装到数据库连接时直接拷贝出来) petshop5.0 基于.NET Framework 3.5 ------------ 使用LINQ to SQL改进数据访问层 PetShop.Model.DataContext.MSPetShop4DataContext 继承System.Data.Linq.DataContext PetShop.Model.ProductInfo与PetShop.Model.CategoryInfo实体类分别映射数据库PetShop.Model.ProductInfo其中的Category属性存在的关系 PetShop.Model.CategoryInfo中的Products属性存在对多的关系 使用WCF来提供RSS, web/FeedService.svc目录下 PetShop.SyndicationFeeds 并在UI层上做些改进,如使用ASP.NET AJAX,ListView控件等。 在PetShop 5.0中引入了异步处理机制。 插入订单的策略可以分为同步和异步,两者的插入策略明显不同,但对于调用者而言,插入订单的接口是完全样的,所以PetShop 5.0中设计了IBLLStrategy模块。 虽然在IBLLStrategy模块中,仅仅是简单的IOrderStategy,但同时也给出了个范例和信息,那就是在业务逻辑的处理中,如果存在业务操作的多样化,或者是今后可能的变化,均应利用抽象的原理。或者使用接口,或者使用抽象类,从而脱离对具体业务的依赖。 不过在PetShop中,由于业务逻辑相对简单,这种思想体现得不够明显。 也正因为此,PetShop将核心的业务逻辑都放到了个模块BLL中,并没有将具体的实现和抽象严格的按照模块分开。所以表示层和业务逻辑层之间的调用关系,其耦合度相对较高: PetShop4.0源代码 .NET Pet Shop4 应用程序的设计说明了构建企业 n 层 .NET 2.0 应用程序的最佳做法,这种应用程序可能需要支持各种数据库平台和部署方案。 .NET Pet Shop 4 项目的目标是: 工作效率:减少了 .NET Pet Shop 3 的代码数量 - 我们减少了近 25% 的代码。 利用 ASP.NET 2.0 的新功能 - 我们利用母版页、成员身份和配置文件,并设计出个新的、吸引人的用户界面。 企业体系结构:构建个灵活的最佳做法应用程序 - 我们实现了设计模式,以及表示层、业务层和数据层的分离。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值