1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第二篇 设 计 篇,数据库设计实例网上书店,1,)需求分析,2,)概念结构设计,3,)逻辑结构设计,4,)数据库的物理设计,5,)数据库实施,6,)数据库运行与维护,网上书店,需求分析,用户提出以下要求:,1,)我希望我的用户可以浏览书目,并在因特网上提交订单。,2,)目前,我通过电话获取订单,我让大多数的公司客户给我打电话并指出所要书的,ISBN,和数量。用户通常使用信用卡来支付。,3,)然后我准备一项出货,其中包括他们所定购的书。如果我没有足够数量的库存,我会再增加定购所需书目,并推迟出货直到新订的书
2、到货。,网上书店,需求分析,用户提出以下要求:,4,)我喜欢一次发出一个客户的所有订单。,6,)对于每一本书,书目信息包括该书的,ISBN,,书名,作者,购入价,卖出价,以及该书的出版年份。,5,)我在网上的书目中包括我所卖的所有的书。,7,)我的大多数客户都是常客,我有他们的姓名和地址的记录。,网上书店,需求分析,用户提出以下要求:,8,)新的顾客必须先打电话给我并建立一个账号,然后才能使用我的网站。,9,)在我的网站上,顾客必须首先通过他们唯一的顾客标识号来确认身份,然后他们就可以浏览书目,并可以在线提交订单。,网上书店,概念结构设计,最初概念结构设计(,E-R,图)如下图所示:,书,IS
3、BN,书名,作者,现存数量,出版年份,价格,Cid,客户,姓名,地址,数量,订单,订货日期,发货日期,信用卡号,网上书店出现的新问题,A,:如果一个客户在一天之内给同一本书提交两笔订单会怎样?,B,:第一笔订单将被处理为生成一个新的“,订单,”联系,而第二笔订单将被处理为更新这个联系的,数量,属性。,A,:如果一个客户在一天之内给不同的书提交两笔订单呢?,B,:没问题,每一个订单关系集的实例将这个用户关联到不同的书上去。,A,:但是,如果一个客户在不同的日子里给同一本书提交两笔订单会怎样呢?,网上书店出现的新问题,B,:书和客户的属性必须共同为订单包含一个关键字。因此,这个设计不允许一个客户在
4、不同的日期里为同一本书提交多笔订单。,A,:你说的有道理,我们暂且以这个设计为准。,这次讨论到此为止。,网上书店逻辑结构设计,逻辑结构设计:将,E-R,图映射为关系模型,生成如下表格:,Create Table,Books,(,isbn,char(10),title,char(80),author,char(80),qty_in_stock,integer,price,real,year_published,integer,primary key(,isbn,),),网上书店逻辑结构设计,逻辑结构设计:将,E-R,图映射为关系模型,生成如下表格:,Create Table,Orders,(,i
5、sbn,char(10),cid,integer,cardnum,char(16),qty,integer,order_data,data,ship_data,data,Primary key(,isbn,cid,),Forgign,key(,isbn,)references,books,Forgign,key(,cid,)references,customers,),网上书店逻辑结构设计,逻辑结构设计:将,E-R,图映射为关系模型,生成如下表格:,Create Table,customers,(,cid,integer,cname,char(80),address,char,(,200,),
6、primary,key(cid),网上书店逻辑结构设计,此时,书店主人又提出以下一些要求:,1,)客户应该能够在一个订单中购买若干不同的书。例如:一个客户想买,3,本“数据库系统概论”和,5,本“计算机网络”,那么他可以在一笔订单中购买这两本书。,网上书店逻辑结构设计,此时,书店主人又提出以下一些要求:,3,)客户应该可以在一天中提交不止一笔订单,而且他们可以区分出这些提交的订单。,2,)发货方法如下:一旦有一种书的存货足够,则将其发货,即使一个订单中包含多种书。因此如果书店现在有,3,本“数据库系统概论”,那么就可以发货,而“计算机网络”不够,5,本,则等到新定购书到货后再发货。,网上书店
7、逻辑结构设计,数据库设计人员对用户的需求进行了分析,得到如下两个新的需求:,1,)客户可以在一个订单中定购若干种不同的书;,2,)一个客户可以区分其在一天中提交的若干笔订单。,为了满足这些新需求,在,orders,表中引入了一个新的属性,ordernum,(,订单号,),它唯一的标识了一笔订单,并且客户据此提交订单。,但是,因为在一笔订单中可以购买若干种书,需要,ordernum,和,isbn,一起来确定,orders,表中的,qty,(定购数量)和,ship_data,(发货日期)。,修改后的,orders,表如下定义:,网上书店逻辑结构设计,修改后的,orders,表:,Create Ta
8、ble,Orders,(,ordernum,integer,isbn,char(10),cid,integer,cardnum,char(16),qty,integer,order_data,data,ship_data,data,Primary key(,isbn,cid,),Forgign,key(,isbn,)references,books,Forgign,key(,cid,)references,customers,),网上书店逻辑结构设计,此时,书店老板再次提出新的要求:老板希望他的雇员能够查看客户订单的细节,这样他们就可以对客户的查询进行响应了。但是,用户信用卡信息是保密的,不能
9、被雇员看到。,数据库分析设计员提出如下解决方法:生成一个如下的视图:,定义雇员可以看到的视图,Create view,orderinfo,(,ordernum,isbn,cid,qty,order_data,ship_data,),AS,select,O.ordernum,O.isbn,O.cid,O.qty,O.order_data,O.ship_data,),From orders O,这样,老板的雇员只能查看这张视图(通过授权),而不是整个,Orders,表。,网上书店逻辑结构设计,因此得到了网上书店的数据库模式如下:,Customers,(,cid,:integer,cname,:ch
10、ar(80),address char(200),Books,(,isbn,:char(10),title:char(80),author:char,(,80,),,qty_in_stock,:integer,price:real,year_published,:integer),Orders,(,ordernum,:integer,isbn,:char(10),cid:integer,cardnum:char(16),qty:integer,order_data:data,ship_data:data,),对以上关系模式进行分析,考虑其规范化程度,可能出现的冗余、插入删除异常等。,Books
11、关系模式中只有一个码,isbn,,并且所有属性都是依赖于,isbn,的,因此它属于,BCNF,。,customers,关系模式中只有一个码,cid,,并且在该表上没有其他函数依赖,因此属于,BCNF,。,关系模式的规范化,orders,关系模式中,定义,(,ordernum,isbn,),为码。此外,因为某个订单由某个客户在某天用某个信用卡号定下的,所以在,orders,表中还有以下函数依赖:,ordernumcid,ordernum,order_data,ordernum,cardnum,因此,,orders,不是,2NF,(存在非主属性对码的部分函数依赖。,关系模式的规范化,于是将,or
12、ders,分解为如下,2,个关系模式:,1,),Orders,(,ordernum,:integer,cid:integer,cardnum:char(16),order_data:date,),2,),Orderlists,(,ordernum,:integer,isbn,:char(10),qty:integer,ship_date:date,),订单实体,联系,这,2,个关系模式都是,BCNF,。,对应的,给出关系模式,Orders,和,Orderlists,的,SQL,定义语句:,Create table,orders,(,ordernum,integer,cid,integer,ca
13、rdnum,char(16),order_date,date,Primary key(,ordernum,),Foreign,key(cid,)references customers),对应的,给出关系模式,Orders,和,Orderlists,的,SQL,定义语句:,Create table,orderlists,(,ordernum,integer,isbn,char(10),qty integer,Ship_date,date,Primary key(,ordernum,isbn,),Foreign,key(isbn,)references books),思考:如何确定,orderl
14、ists,上包含哪些属性?,修改后的,E-R,图如下:,books,ISBN,书名,作者,现存数量,出版年份,价格,Cid,客户,姓名,地址,Place_order,order_date,orders,ordernum,cardnum,qty,Order_lists,Ship_date,网上书店物理结构设计,对于,books,表,:,1,)书店主任希望大部分客户能够在订书之前通过,ISBN,号查询,因此,为了加速通过,ISBN,的查询,可以在,ISBN,上建立一个,非聚簇的哈希索引,。,2,)客户还有可能通过书名,title,和作者,author,进行查询,因此在,title,和,author,上也建立,非聚簇的哈希索引,。,网上书店物理结构设计,对于,customers,表,:,1,)主码是客户编号,cid,,最常用的查询就是根据,cid,进行查询,因此可以在,cid,上建立,聚簇哈希索引,。,网上书店物理结构设计,对于,orderlists,表,,大部分是插入操作,偶尔有对发货日期的修改以及查询某个特定订单的所有项目。,因此可以在,ordernum,上建立哈希索引或,B,树索引。,






