数据库管理与开发期末作业

Author Avatar
Euan 9月 18, 2019
  • 在其它设备中阅读本文章

为亚马逊设计一个数据库,从一下5点入手

1.完成需求分析,给出概念模型(ER模型 ),认真讨论实体之间联系(1:1;1:n; m :n )
2.将概念模型映射为关系模型,{ 例如: Customer( id ,name, phone,……..)},并将关系模型的范式优化到3NF ( 通过模式分解算法消除非主属性对主属性的部分函数依赖,传递函数依赖 )。
3.根据优化后的关系模型建表(按ORACLE的语法),重点利用DBMS提供的约束和触发器来保证数据库的完整性。
4.分析数据库面对的用户的种类,完成数据库用户的权限授权(建议确定合理的角色来完成权限的分配和回收)
5.制定合理的数据库备份恢复策略。

1.1完成需求分析

引言

在软件工程中需求分析是极为重要的一个环节,需求分析的工作是分析系统的业务需求,确定系统的目的、功能范围和定义。先介绍项目的需求背景,接着分析系统的业务需求和定义系统的体系结构,然后依据系统结构将系统分成多个业务模块,最后着重说明主要功能模块的用例。

项目背景

  1. 现代社会正处在高速信息化的进程,人类生活在互联网的推动下正发生着超乎往常任何时代的变革,电子商务作为商业领域最先进的交易方式,已对传统经营理念和经营方式产生了巨大冲击。来自于中国电子商务协会数字服务中心(CECA)的数据显示,早在2011年世界各国电子商务市场规模总和已经突破40. 6万亿美元。目前,西方发达国家如美国、德国等,依然占据世界电子商务的主导地位,而中国等发展中国家的电子商务正处在蓬勃发展阶段,将在国际电子商务市场占据有力的地位”。近些年我国的电子商务能够快速发展,是因为中小企业在传统商业领域的生存和发展存在着资金短缺、技术落后、管理无序和人才素质不高等方面的障碍,而电子商务的出现很大程度地降低了中小企业的采购、营销和库存成本,帮助中小企业拓展市场、提升业务机会,提高运营效率,进一步优化企业服务,提升企业形象。

  2. 跨境电子商务作为电子商务发展的生力军,也是推动经济全球–体化的技术基础,具有极为重要的战略意义。发展跨境电子商务是国内企业缩小国外企业差距的一一个有效途径,对我国中小企业进入国际市场、充分利用整合国外各种有利资源是- - 个难得的机会,同时这也利于国外电子商务企业努力开拓中国市场。跨境电子商务构建的立体、开放的多边经贸合作模式,极大促进了企业优化整合多边资源以及企业间的互利共赢;同时跨境电商的发展和普及也使分散在全球各地的消费者能够容易地购买到其他国家和地区物美价廉的商品闻。

  3. 在众多的跨境电子商务平台中,亚马逊是全球用户数最多的网上零售平台,其规模远远超过了沃尔玛、苹果、eBay以及国内的阿里巴巴。来自ComScore的数据显示,早在2011年6月,亚马逊的独立用户数就已经位居全球首位,达到2.8亿人。越来越多的国内电商企业转战亚马逊平台,他们急切希望有基于亚马逊平台的电商系统,帮助他们整合生产厂家、IT 运营商、银行、物流公司形成的供应链,为企业在整个产业链上下游运作提供了创造新价值的驱动途径。

系统业务需求

基于亚马逊平台的电商ERP系统是为了提高商品上架速度、加快订单处理和物流派送、降低外贸电商操作人员的从业门槛,优化电商供应链。作者在开发系统前详细阅读、熟悉亚马逊平台经营管理政策、规定,深入考察亚马逊平台的多个运营商,详细了解他们生产运营过程和遇到的困难,确定系统的基本业务。通过不断深入交流以及结合亚马逊提供的商城服务API接口确定基于亚马逊平台电商ERP系统的基本功能,包括店铺管理、商品管理、订单管理和物流发货等核心业务功能。

系统功能需求

店铺管理功能

为了给消费者提供更好的本地化服务,亚马逊在全球多个国家和地区创建有独立运营的电商网站,如中国、德国、日本、加拿大、澳大利亚等,这些网站有独立的域名,在用户体验和商品类目上也存在一些差异。电商企业为了拥有更广泛的销售渠道和消费者群体,大多会入驻亚马逊的多个分站平台进行经营,为此系统需要支持接入多家店铺和管理多家店铺的商品、订单等。

店铺管理的功能包括:

  1. 添加店铺
    可以添加不同国家或地区的多个店铺,但不允许添加同名的店铺以便于区分管理。新增店铺时须调用亚马逊商城服务的API检验AppKey和AppSecret等信息是否有效,只有通过API验证的店铺才能成功添加到系统中。仅系统管理员才有权限添加店铺。
  2. 编辑店铺信息
    编辑店铺信息页面可用于修改店铺的名称和AppSecret,而AppKey由于是店铺的唯一标识,一经绑定并添加成功不允许修改。出于安全考虑商家会定期更改店铺的AppSecret,如果AppSecret有修改,在保存店铺信息时须再次校验店铺API账号的有效性,只有账号信息通过API验证的修改才能成功保存。仅系统管理员才有权限修改店铺信息。
  3. 锁定店铺
    商家在开启多家亚马逊店铺后,有可能由于在某些地区的经营状况不如预期,会做出暂停在该地区亚马逊平台上店铺的经营,譬如在西班牙亚马逊平台的店铺经营效益不佳,暂停该店铺的经营可节省西班牙语工作人员的投入。通过锁定店铺可以暂停店铺的经营活动,锁定店铺即停止该店铺同亚马逊商城服务的数据交换,只是更改店铺的状态,不影响店铺原有数据。仅系统管理员才有权限锁
    定店铺。店铺管理的用例图如图3-1所示。

根据亚马逊电商ERP系统的使用对象可以挖掘出店铺管理功能用例所涉及的参与者以及用例的前置条件、后置条件和具体操作的基本事件流店铺管理用

VD08CF.png

店铺管理用例说明
用例名:店铺操作的用例
用例的标识符: StoreManageCase001
参与者:系统管理员
店铺管理用例简要的描述:系统管理员进入系统管理店铺信息
前置条件:系统管理员登录系统并进入店铺管理页面
基本事件流:
1.系统管理员进入店铺管理页面
2.管理员点击新增店铺按钮
3.按照页面上提示信息逐个填写店铺配置数据4.点击完成按钮,系统进行验证并添加店铺5.店铺添加成功,用例终止
后置条件:新添加的店铺显示在店铺列表页面,用户可修改店铺信息

商品管理功能

电商吸引消费者的一个因素是款式全、选择多,所以电商店铺要频繁发布新款、更新商品。如此,商品管理就成了电商运营中既重要又繁琐的一项工作。对于有上千个单品在销售的商家,平均每天会上5-10个的新款,而在节假日或者平台活动大促到来之前还会大批量上新款。另外,根据销售情况和营销策略修改商品的标题、关键字、价格和库存也是商品操作人员每天需要重复进行的工作,商品管理涉及的业务比较多,为明确业务需求范围和功能定义,将商品管理划分为五个子功能:

  1. 商品分类管理
    用于管理商品的类目,合理的分类管理可以简化商品的其他操作,而且对生成销售报表并制定生产、营销策略有很大帮助。同时商品分类中也将作为商品名称在报关时使用。
  2. 商品规格管理
    商品规格是指同一款式的商品拥有不同的颜色、尺寸或某方面属性等,通常会使用商品的规格和商品的类目、款式等组成商品编码。商品编码在商品的生产、销售和运输中都会使用到,而且商品编码生成条形码并借助扫描器进行捡货将大大提高这些环节的效率。
  3. 商品档案管理
    商品的档案管理是指维护商品的标题、图片、价格、商品描述和搜索关键字等信息。消费者是否购买一款商品与商品档案的设置有着紧密的关系,另外合理地设置商品标题和搜索关键字等对商品的排名和曝光度也有很大的影响。
  4. 商品库存管理
    商品的库存管理主要管理商品在各个仓库的可售商品数量,同时也维护仓库所支持的物流公司和物流服务方式,以及派送商品的物流运费等信息。
  5. 商品上架。
    在系统中设置好商品的类目、规格、详细信息和库存之后,需要能够批量、快,速地将商品信息上传到亚马逊平台,从而取代手工在亚马逊后台逐个录入或者修改Excel文件上传。

VDgj9x.png

商品类别管理用例说明
用例名:商品类别管理用例
用例的标识符: ProductManageCase001
参与者:系统管理员
商品类别管理用例简要的描述:系统管理员进入商品类别管理页面,可进行商品类别的新增、修改、维护
店铺管理用例简要的描述:系统管理员进入系统管理店铺信息
前置条件:系统管理员登录系统并进入商品类别管理页面
基本事件流:
1.系统管理员进入商品类别管理页面
2.管理员点击“新增”商品类别按钮
3.按照页面上提示信息逐个填写类别信息
4.点击“保存”按钮,新添加到类别显示在类目列表中
5.系统管理员选择刚新增的类目,点击“编辑”按钮
6.修改商品类别的名称
7.点击“保存”按钮
8.类别列表中显示修改后类别的名称
9.商品类别添加和修改完成,用例终止。
后置条件:管理员可在商品列表页面中删除指定类别
商品档案用例说明
用例名:商品档案操作用例
用例的标识符: ProductManageCase002
参与者:商品操作员
商品类别管理用例简要的描述:商品操作员站商品档案页面新增、管理商品档案信息
前置条件:商品所属类别已经创建
基本事件流:
1.系统管理员进入商品类别管理页面
2.商品操作员进入系统访问商品档案管理页面
3.设置所属类别
4.设置商品标题
5.填写UPC或ean
6.填写商品品牌
7.填写制造商规格编码
8.设置商品价格
9.上传商品图片
10.填写商品关键字
11.设置商品详细描述
12. 设置运费信息
13.点击“保存”按钮
14.返回商品档案列表页面,在页面中可以查看到新增的商品档案
15. 商品档案添加成功,用例终止
后置条件:商品操作员可修改商品档案信息、删除商品档案信息、修改商品库存、商品上架
商品库存操作用例说明
用例名:商品库存操作用例
用例的标识符: ProductManageCase003
参与者:商品操作员
商品类别管理用例简要的描述:商品操作员进入商品库存管理页面,可进行商品库存的修改
店铺管理用例简要的描述:系统管理员进入系统管理店铺信息
前置条件:商品档案已经创建
基本事件流:
1.商品操作员登录系统,访问商品库存管理页面
2.查找需要设置库存的商品
3.在查找到的商品列表中选择要设置库存的商品
4.设置商品库存
5.点击“保存”按钮
6.列表中商品的库存为更新后的库存
7.用例终止
后置条件:商品操作员可将商品的库存同步到亚马逊平台上
商品上架的用例说明
用例名:商品上架的用例
用例的标识符: ProductManageCase004
参与者:商品操作员
商品上架用例简要的描述:商品操作员进入商品管理页面,将已经配置好的商品上传到亚马逊平台
前置条件:商品档案已经创建,商品库存己设置
基本事件流:
1.商品操作 员登录系统,访问商品上传管理页面
2.查找并选中需要设置库存的商品
3.点击“上传商品到亚马逊”按钮
4.选中上传的商品添加到待上传商品列表
5.在上传商品页面中可以看到刚选中上传的商品,状态为“待上传”
6.后台任务调度程序定期将需要上传的商品上传到亚马逊平台
7.间隔几分钟后刷新上传商品页面,商品状态更新为“已上传”
8.间隔几分钟后在亚马逊商品管理后台检查商品是否上传成功
9.上传用例终止
后置条件:商品操作员可将商品的库存同步到亚马逊平台上

订单管理功能

订单管理是从亚马逊平台获取最新的订单信息并保存到系统中,然后由操作人员进行订单审核和订单确认操作;订单在确认可以发货后将由仓储人员为订单进行捡货和打包装箱操作;在发货完成后将物流单号上传到亚马逊平台完成订单发货操作。个别情况下,如果有些订单所填写的收货地址物流无法送达或者所购买的商品在仓库中货源不足,在同买家沟通后需要对这些订单做取消操作。:
订单管理包含如下几个子功能:

  1. 订单下载
    由任务调度程序定时执行,将执行间隔期间亚马逊平台上买家新购买或者有修改的订单下载到系统中。下载订单的信息包括订单的付款时间、购买商品的编码和数量、买家账号、收货人姓名、收货人电话、收货人地址以及所选择的物流方式。新下载的订单须进行审核操作才能确定是否需要发货。
  2. 订单审核
    审单人员的工作是检查订单信息是否准确、商品库存是否充足、收货地址是否物流可以到达,当出现特殊情况无法按预期给买家发货时,则发出订单报警,由客服人员联系买家协商处理。通过审核的订单将进入订单确认操作,出现异常的订单会由买家修改订单或者取消订单。
  3. 订单确认
    订单审核通过后,将会从仓库中锁定该订单购买的商品,然后由仓储人员根据订单的商品清单从仓库捡货打包,并在发货成功后从库存中扣除相应商品数量。如果订单被取消,被锁定的商品将被解锁,订单回退到订单审核步骤。
  4. 取消订单
    若出现仓库中没有买家所选定商品的足够库存,或者买家填写的收货地址不在物流派送范围内等客户,客服人员会同买家沟通协商,取得同意后将取消订单。只有当订单处于审核环节时才能执行取消订单操作,取消后的订单不会出现在订单审核页面中,只能在订单查询页面中查看。
  5. 订单同步
    订单同步是将被取消的订单、已经发货或者有添加卖家备注的订单信息同步到亚马逊平台。该操作由任务调度系统定时检查系统中订单的状态,并调用亚马逊商城服务接口将有操作改动的订单同步到亚马逊平台。
  6. 订单查询
    订单查询是与订单处理流程相独立的操作,可用于查询整个系统中的订单信息,包括己取消的订单。订单查询功能有丰富的查询条件,可以根据店铺、订单状态、订单日期、订单编号、买家名称、订单收货信息、物流方式、订单商品等条件中的-一个或多个进行组合查询。

VD2puD.png

订单审核用例说明
用例名:订单审核用例
用例的标识符: OrderManageCase001
参与者:订单操作员
订单审核用例简要的描述:订单操作员登录系统,访问“待审核订单”页面,对订单是否可进行后续流程进行审核
前置条件:订单从亚马逊平台下载到系统
基本事件流:
1.订单操作员登录系统,进入待审订单页面!
2.在订单列表中选择要审核的订单3.检查订单支付状态和付款金额
4.检查订单购买商品在仓库中的数量是否满足购买数量
5.检查订单收货地址信息,用户选择的物流方式是否提供指定收货地区的派送服务、收货人姓名清晰、联系电话符合规范
6.如果#3、#4、#5均满足,则该订单审核通过
7.如果#3、#4、#5有-项不满足,则审核不通过
8.订单审核完毕,用例终止
后置条件:订单取消,订单确认

物流发货功能

订单经过前面的审核、确认之后,流程将进入仓储部门的操作。仓储部门的主要工作根据订单内的商品信息和数量从仓库中捡货并送到包装区,在包装区对商品进行打包、物流面单打印和报税等操作。

订单发货功能包含如下几个子功能:
1。 捡货扫描
仓储人员根据前面订单处理流程中订单确认流程生成的出货单,在仓库中挑拣订单指定数量的商品,并连同出库单运送到打包区等待打包。

  1. 打包称重
    打包人员依据商品数量和商品大小,选择合适的包装箱将商品打包装箱,并对打包后的箱子称重和量体积,供后面申请国际物流快递单使用。
  2. 打印快递单
    物流操作人员根据出库单中商品的类目生成报关单和收据,并使用打包称重流程中记录的重量和体积等信息向物流服务提供商申请物流单号,再使用热敏打印机打印报关单和物流单。打印的报关单和物流单粘贴在包装箱上,等待物流人员上门收货。生成的物流单号将会填写到订单的发货信息中并由调度系统同步到亚马逊平台。;
  3. 线上物流填单
    将生成的物流单号录入到订单的发货信息,然后更改订单在系统中的状态为“已发货”,该订单将会由任务调度系统同步到亚马逊平台。

VDgv36.png

打印快递单用例说明
用例名:打印快递单用例
用例的标识符: LogsticsManageCase001
参与者:仓储操作员
打印快递单用例简要的描述:
前置条件:订单已经完成“扫描捡货”和打包操作
基本事件流:
1.仓储操作员进入系统,并访问打印快递单页面
2.在待打印快递单的订单列表中选择-一个订单
3.点击“打印快递单”,在弹出的窗口中会显示订单商品详情
4.确认、修改商品的出入关商品名称,过海关时只需显示商品的核心信息,且长度有限制
5.依据订单买家给定的收货地址和物流服务,选择物流方式(如UPS、DHL等)
6.点击“打印快递单”,系统会将商品信息、买家地址信息、卖家地址信息等发送给物流公司,并返回物流电子面单
7.点击“打印发票”打印发票
8.将快2份递单贴在商品包装上
9.打印快递单操作完毕,用例终止
后置条件:线上发货,修改订单中亚马逊上的状态

系统非功能性需求

除了对基于亚马逊平台电商ERP系统的业务功能进行确定外,在需求阶段还要考虑软件的安全性、易用性和性能等非功能性需求。

  1. 安全性
    基于亚马逊平台的电商ERP系统的数据涉及商业机密和客户隐私,保护数据安全性及其重要;
    另外系统被广泛用于电商企业的日常工作,确保系统的安全和稳定运行才能确保企业正常有序运营;
    使用B/S模式,服务器暴露在互联网中,且客户端的请求和操作容易被模拟和纂改,为了确保安全性须在服务器端设置网络防火墙;
    对服务器收到的每条请求做有效性验证和权限验证:在代码编写时做好防范SQL注入和跨域攻击的工作和代码审查涉及商业账号、密码等重要信息或用户敏感信息的页面使用https加密,确保页面在传输过程中的数据安全;
    另外,重要数据的操作步骤要有记录,当出现重大操作失误时可快速排除错误根源,这类操作账号登录、商品价格修改、收货信息修改、订单操作等。
  2. 易用性
    该系统的直接使用人员包含电商运营过程中各环节的参与者,其计算机操作水平差异较大,且熟练程度也各有不同。因此要求系统的界面良好,信息简明易懂、可操作性强,商品管理和订单管理等流程操作要准确、清晰、不容易出错。
  3. 高性能
    电商平台在全年的运营中会有-些如节假日、电商促销活动等时间段出现井喷似的高成交量,此时系统将可能承载数倍于平时的订单处理负荷。为确保高订单情况下系统能稳定顺畅运行,要求系统在性能方面能够支持每秒500次以上请求的响应能力,核心业务功能如订单处理功能的响应请求数不低于每秒300次。在保证服务器响应速度的同时,使用多服务器集群的部署方式,可以在业务量暴增时通过扩展服务器集群提升服务器端的响应能力。

用例需求小结

本章主要阐述了基于亚马逊电商系统需求的主要内容,包括系统研发的总体流程、系统各业务模块的功能需求以及系统数据库模型等,为后面的系统设计提供了准确的需求信息。

1.2概念模型(ER图)

  1. 看了一下亚马逊的官网注册界面如下
    Vwuj6s.png
    VwuvXn.png

为此设计用户实体 customer

  1. 顾客根据购买力分为不同等级
    用户等级 customer_level
    VDeiBq.png
  2. 用户地址 customer_address
    VDePun.png
  3. 用户积分 customer_point
    VDepcj.png
  4. 用户登陆 costomer_login
    VDe9js.png
  5. 用户余额 customer_account_balance
    VDeENT.png
  6. 用户权限 costomer_auths
    VDZz9g.png

VwMY24.png
VwM7Rg.png

  1. 店铺基本信息 shop_basic_info
    VDeFH0.png
  2. 用户店铺权限 costomer_shop_premission
    VDeAEV.png

Vwt3Is.png

  1. 商品类别 commodity_catory
    VD8AsO.png
  2. 商品规格信息 commodity_type_info
    VDZI9e.png

VwtAIA.png

  1. 商品档案 commodity_archives
    VDZI9e.png
  2. 品牌信息 brand_info
    VDZ4hD.png
  3. 商品图片 commodity_picture
    VDZo1H.png
  4. 商品评论 commodity_comment
    VDZbnI.png
  5. 供应商信息 supplier_info
    VDZTcd.png
  6. 订单信息 order_note_info
    VDZ7jA.png
  7. 子订单信息 child_order_note_info
    VDZLHP.png
  8. 购物车 shopping_cart
    VDZqBt.png
  9. 订单物流信息 order_logistics_info
    VDZXAf.png
  10. 仓库信息 warehouse_info
    VDeeCF.png
  11. 商品库存commodity_stock
    VDZfAK.png
  12. 物流信息 shipping_info
    VDZhtO.png

最终ER图 各实体之间的关系
VDGYjK.png

2.1概念模型映射为关系模型

由于找了好久语法才知道md的波浪线怎么打,而且还是调用Latex公式进行编辑,不太美观

  1. customer(customer_id,costomer_name,role,level,customer_create_time)
  2. customer_level(level,level_name,min_point,max_point,create_time)
  3. customer_address(address_id,customer_id,consignee_zipcode,country,province,city,district,address,default_or,create_time)
  4. customer_point(point_id,customer_id,point_source,point_source_id,chang_point,create_time)
  5. costomer_login(login_id,login_time,customer_id,login_ip,login_type,create_time)
  6. customer_account_balance(balance_id,customer_id,source,source_bill_id,amount,create_time)
  7. costomer_auths(wechat_id,access_token,head_sculptre,wechat_name,customer_id,identity_type(phone,password,email),create_time)
  8. shop_basic_info(shop_id,shop_name,App_key,App_Secret,merchant_id,marketplaced,sale_sites,create_time)
  9. costomer_shop_premission(premission_id,customer_id,shop_id,permission,create_time)
  10. commodity_catory(category_id,category_name,category_code,parent_category_id,category_level,category_status,create_time)
  11. commodity_type_info(type_id,type_name,type_parameter,commodity_id,weigh,length,width,color,production_date,expriy_date,create_time)
  12. commodity_archives(commodity_id,commodity_core,shop_id,brand_id,publish_status,audit_status,category_id,business_id,UPC,leadtime,logistics_template,commodity_stock,price,keywords,commodity_describe,commodity_title,create_time)
  13. brand_info(brand_id,brand_name,telephone,brand_web,brand_logo,brand_description,brand_status,brand_order,create_time)
  14. commodity_picture(commodity_pic,commodity_id,pic_describe,pic_url,master_or,pic_status,create_time)
  15. commodity_comment(comment_id,commodity_id,order_id,customer_id,comment_title,comment_content,audit_status,audit_time,create_time)
  16. supplier_info(supplier_id,supplier_code,supplier_name,supplier_type,supplier_persion,phone_number,bank_name,bank_account,address,supplier_status,create_time)
  17. order_note_info(order_id,order_code,customer_id,country,province,city,district,shop_id,consignee_name,consignee_phone,consignee_address,buyer_remark,order_system_state,order_online_state,pay_way,discount_amount,pay_money,pay_time,order_time,pay_amount,order_amount,platform_order_id,create_time,freight_amount,receive_time,order_point,invoice_time)
  18. child_order_note_info(child_order_id,commodity_num,commodity_title,commodity_price,average_cost,order_id,commodity_id,weigh,free_money,warehouse_id,create_time)
  19. shopping_cart(cart_idcustomer_id,commodity_id,commodity_num,commodity_price,create_time)
  20. order_logistics_info(logistics_id,order_id,consignee_name,consignee_phone,consignee_zipcode,consignee_address,duty,logistics_code,package_num,logistics_state,logistics_way,logistics_company,create_time)
  21. warehouse_info(warehouse_id,warehouse_code,warehouse_name,warehouse_phone,contact,country,province,city,distract,address,warehouse_status,warehouse_persion,create_time)
  22. commodity_stock(commodity_stock_id,commodity_id,warehouse_id,commodity_stock,create_time)
  23. shipping_info(ship_id,logistics_id,ship_persion,telephone,ship_price,create_time)

2.2 将关系模型的范式优化到3NF(通过模式分解算法消除非主属性对主属性的部分函数依赖,传递函数依赖)

第一范式(1NF):数据表中的每一列(每个字段)必须是不可拆分的最小单元,也就是确保每一列的原子性

由于之前设计了主键,且设计过程中保证每一个数据都是最小单元,所以为第一范式
例如:之前是把用户登陆作为一个表,但是由于用户可以通过微信等其他方式进行登陆,所以需要划分出微信登陆的表,即costomer_auths,且customer_level,customer_address,customer_point,costomer_login,customer_account_balance均为用户表拆分出来,保证了字段的原子性
后来又翻了MYSQL深入浅出对范式优化知识进行了解,里面秒速通过拆分提高表的访问效率,其中包括垂直拆分和竖直拆分,对其他冗余数据表进行拆分,而本次数据库设计就是基于这种原则进行竖直拆分,把用户表字段等进行一范式优化

  1. customer(customer_id,costomer_name,role,level,customer_create_time)
  2. customer_level(level,level_name,min_point,max_point,create_time)
  3. customer_address(address_id,customer_id,consignee_zipcode,country,province,city,district,address,default_or,create_time)
  4. customer_point(point_id,customer_id,point_source,point_source_id,chang_point,create_time)
  5. costomer_login(login_id,login_time,customer_id,login_ip,login_type,create_time)
  6. customer_account_balance(balance_id,customer_id,source,source_bill_id,amount,create_time)
  7. costomer_auths(wechat_id,access_token,head_sculptre,wechat_name,customer_id,phone,password,email,create_time)
  8. shop_basic_info(shop_id,shop_name,App_key,App_Secret,merchant_id,marketplaced,sale_sites,create_time)
  9. costomer_shop_premission(premission_id,customer_id,shop_id,permission,create_time)
  10. commodity_catory(category_id,category_name,category_code,parent_category_id,category_level,category_status,create_time)
  11. commodity_type_info(type_id,type_name,type_parameter,commodity_id,weigh,length,width,color,production_date,expriy_date,create_time)
  12. commodity_archives(commodity_id,commodity_core,shop_id,brand_id,publish_status,audit_status,category_id,business_id,UPC,leadtime,logistics_template,commodity_stock,price,keywords,commodity_describe,commodity_title,create_time)
  13. brand_info(brand_id,brand_name,telephone,brand_web,brand_logo,brand_description,brand_status,brand_order,create_time)
  14. commodity_picture(commodity_pic,commodity_id,pic_describe,pic_url,master_or,pic_status,create_time)
  15. commodity_comment(comment_id,commodity_id,order_id,customer_id,comment_title,comment_content,audit_status,audit_time,create_time)
  16. supplier_info(supplier_id,supplier_code,supplier_name,supplier_type,supplier_persion,phone_number,bank_name,bank_account,address,supplier_status,create_time)
  17. order_note_info(order_id,order_code,customer_id,country,province,city,district,shop_id,consignee_name,consignee_phone,consignee_address,buyer_remark,order_system_state,order_online_state,pay_way,discount_amount,pay_money,pay_time,order_time,pay_amount,order_amount,platform_order_id,create_time,freight_amount,receive_time,order_point,invoice_time)
  18. child_order_note_info(child_order_id,commodity_num,commodity_title,commodity_price,average_cost,order_id,commodity_id,weigh,free_money,warehouse_id,create_time)
  19. shopping_cart(cart_idcustomer_id,commodity_id,commodity_num,commodity_price,create_time)
  20. order_logistics_info(logistics_id,order_id,consignee_name,consignee_phone,consignee_zipcode,consignee_address,duty,logistics_code,package_num,logistics_state,logistics_way,logistics_company,create_time)
  21. warehouse_info(warehouse_id,warehouse_code,warehouse_name,warehouse_phone,contact,country,province,city,distract,address,warehouse_status,warehouse_persion,create_time)
  22. commodity_stock(commodity_stock_id,commodity_id,warehouse_id,commodity_stock,create_time)
  23. shipping_info(ship_id,logistics_id,ship_persion,telephone,ship_price,create_time)

第二范式(2NF):满足1NF后,要求表中的所有列,都必须依赖于主键,而不能有任何一列与主键没有关系,也就是说一个表只描述一件事情

翻开上学期的数据库系统概念,查找相关概念
设R(U)是一个属性集U上的一个关系模式,X和Y是U的子集。若对于R(U)的任意两个可能的具体关系r1、r2,若r1[x] == r2[x]则r1[y] == r2[y],或者若r1[x] != r2[x]则r1[y] != r2[y],称X决定Y,或者Y函数依赖于X,记作X→Y。就像函数一样,给一个确定的输入(属性集X),有一个确定的输出(属性集Y)。
通俗的讲就是:存在主键(具有唯一性)

设计过程中已自动把主键标志出来,并且对与主键完全依赖

  1. customer(customer_id,costomer_name,role,level,customer_create_time)
  2. customer_level(level,level_name,min_point,max_point,create_time)
  3. customer_address(address_id,customer_id,consignee_zipcode,country,province,city,district,address,default_or,create_time)

在customer_point表中,发现存在point_source和point_source_id字段,point_source对id为唯一标识,所以需要继续垂直拆分,

  1. customer_point(point_id,customer_id,point_source_id,chang_point,create_time)
  2. point_source(point_source_id,point_source)
  3. costomer_login(login_id,login_time,customer_id,login_ip,login_type,create_time)
  4. customer_account_balance(balance_id,customer_id,source,source_bill_id,amount,create_time)
    8 costomer_auths(wechat_id,access_token,head_sculptre,wechat_name,customer_id,phone,password,email,create_time)
  5. shop_basic_info(shop_id,shop_name,App_key,App_Secret,merchant_id,marketplaced,sale_sites,create_time)
  6. costomer_shop_premission(premission_id,customer_id,shop_id,permission,create_time)
  7. commodity_catory(category_id,category_name,category_code,parent_category_id,category_level,category_status,create_time)
  8. commodity_type_info(type_id,type_name,type_parameter,commodity_id,weigh,length,width,color,production_date,expriy_date,create_time)
  9. commodity_archives(commodity_id,commodity_core,shop_id,brand_id,publish_status,audit_status,category_id,business_id,UPC,leadtime,logistics_template,commodity_stock,price,keywords,commodity_describe,commodity_title,create_time)
  10. brand_info(brand_id,brand_name,telephone,brand_web,brand_logo,brand_description,brand_status,brand_order,create_time)
  11. commodity_picture(commodity_pic,commodity_id,pic_describe,pic_url,master_or,pic_status,create_time)
  12. commodity_comment(comment_id,commodity_id,order_id,customer_id,comment_title,comment_content,audit_status,audit_time,create_time)
  13. supplier_info(supplier_id,supplier_code,supplier_name,supplier_type,supplier_persion,phone_number,bank_name,bank_account,address,supplier_status,create_time)
  14. order_note_info(order_id,order_code,customer_id,country,province,city,district,shop_id,consignee_name,consignee_phone,consignee_address,buyer_remark,order_system_state,order_online_state,pay_way,discount_amount,pay_money,pay_time,order_time,pay_amount,order_amount,platform_order_id,create_time,freight_amount,receive_time,order_point,invoice_time)
  15. child_order_note_info(child_order_id,commodity_num,commodity_title,commodity_price,average_cost,order_id,commodity_id,weigh,free_money,warehouse_id,create_time)
  16. shopping_cart(cart_idcustomer_id,commodity_id,commodity_num,commodity_price,create_time)
  17. order_logistics_info(logistics_id,order_id,consignee_name,consignee_phone,consignee_zipcode,consignee_address,duty,logistics_code,package_num,logistics_state,logistics_way,logistics_company,create_time)
  18. warehouse_info(warehouse_id,warehouse_code,warehouse_name,warehouse_phone,contact,country,province,city,distract,address,warehouse_status,warehouse_persion,create_time)
  19. commodity_stock(commodity_stock_id,commodity_id,warehouse_id,commodity_stock,create_time)
  20. shipping_info(ship_id,logistics_id,ship_persion,telephone,ship_price,create_time)

第三范式(3NF):必须先满足第二范式(2NF),要求:表中的每一列只与主键直接相关而不是间接相关(表中的每一列只能依赖于主键)

波浪线可能只有md格式的文件才可以看到

  1. customer(customer_id,costomer_name,role,$\underset{\sim}{level}$,customer_create_time)
  2. customer_level(level,level_name,min_point,max_point,create_time)
  3. customer_address(address_id,$\underset{\sim}{customer_id}$,consignee_zipcode,country,province,city,district,address,default_or,create_time)
  4. customer_point(point_id,$\underset{\sim}{customer_id}$,$\underset{\sim}{point_source_id}$,chang_point,create_time)
  5. costomer_login(login_id,login_time,$\underset{\sim}{customer_id}$,login_ip,login_type,create_time)
  6. customer_account_balance(balance_id,$\underset{\sim}{customer_id}$,source,source_bill_id,amount,create_time)
  7. costomer_auths(wechat_id,$\underset{\sim}{shop_id}$,access_token,head_sculptre,wechat_name,$\underset{\sim}{customer_id}$,phone,password,email,create_time)
  8. shop_basic_info(shop_id,shop_name,App_key,App_Secret,merchant_id,marketplaced,sale_sites,create_time)
  9. costomer_shop_premission(premission_id,$\underset{\sim}{customer_id}$,$\underset{\sim}{shop_id}$,permission,create_time)
  10. commodity_catory(category_id,category_name,category_code,parent_category_id,category_level,category_status,create_time)
  11. commodity_type_info(type_id,type_name,type_parameter,$\underset{\sim}{commodity_id}$,weigh,length,width,color,production_date,expriy_date,create_time)
  12. commodity_archives(commodity_id,commodity_core,$\underset{\sim}{shop_id}$,$\underset{\sim}{brand_id}$,publish_status,audit_status,$\underset{\sim}{category_id}$,business_id,UPC,leadtime,logistics_template,commodity_stock,price,keywords,commodity_describe,commodity_title,create_time)
  13. brand_info(brand_id,brand_name,telephone,brand_web,brand_logo,brand_description,brand_status,brand_order,create_time)
  14. commodity_picture(commodity_pic,$\underset{\sim}{commodity_id}$,pic_describe,pic_url,master_or,pic_status,create_time)
  15. commodity_comment(comment_id,$\underset{\sim}{commodity_id}$,$\underset{\sim}{order_id}$,$\underset{\sim}{customer_id}$,comment_title,comment_content,audit_status,audit_time,create_time)
  16. supplier_info(supplier_id,supplier_code,supplier_name,supplier_type,supplier_persion,phone_number,bank_name,bank_account,address,supplier_status,create_time)
  17. order_note_info(order_id,order_code,$\underset{\sim}{customer_id}$,country,province,city,district,$\underset{\sim}{shop_id}$,consignee_name,consignee_phone,consignee_address,buyer_remark,order_system_state,order_online_state,pay_way,discount_amount,pay_money,pay_time,order_time,pay_amount,order_amount,platform_order_id,create_time,freight_amount,receive_time,order_point,invoice_time)
  18. child_order_note_info(child_order_id,commodity_num,commodity_title,commodity_price,average_cost,$\underset{\sim}{order_id}$,$\underset{\sim}{commodity_id}$,weigh,free_money,warehouse_id,create_time)
  19. shopping_cart(cart_id,$\underset{\sim}{customer_id}$,$\underset{\sim}{commodity_id}$,commodity_num,commodity_price,create_time)
  20. order_logistics_info(logistics_id,$\underset{\sim}{order_id}$,consignee_name,consignee_phone,consignee_zipcode,consignee_address,duty,logistics_code,package_num,logistics_state,logistics_way,logistics_company,create_time)
  21. warehouse_info(warehouse_id,warehouse_code,warehouse_name,warehouse_phone,contact,country,province,city,distract,address,warehouse_status,warehouse_persion,create_time)
  22. commodity_stock(commodity_stock_id,$\underset{\sim}{commodity_id}$,$\underset{\sim}{warehouse_id}$,commodity_stock,create_time)
  23. shipping_info(ship_id,$\underset{\sim}{logistics_id}$,ship_persion,telephone,ship_price,create_time)
  24. point_source(point_source_id,point_source)

3.根据优化后的关系模型建表(按ORACLE的语法),重点利用DBMS提供的约束和触发器来保证数据库的完整性。

建表+约束

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
create table customer_table
(
customer_id NUMBER PRIMARY KEY,
customer_name VARCHAR2(20) not null,
customer_level VARCHAR2(20) not null,
costomer_create_time DATE not null,
constraint fk_customer_level foreign key(customer_level) references customer_level(customer_level)
);
CREATE TABLE customer_level_table
(
customer_level NUMBER PRIMARY KEY not null,
level_name VARCHAR2(20) not null,
max_point NUMBER not null,
create_time DATE not null
);
CREATE TABLE customer_address_table
(
address_id NUMBER PRIMARY KEY,
customer_id NUMBER not null,
consignee_zipcode NUMBER not null,
country VARCHAR2(20) not null,
province VARCHAR2(20) not null,
city VARCHAR2(20) not null,
district VARCHAR2(20) not null,
concrete_address VARCHAR2(100) not null,
default_or NUMBER(1) not null,
create_time DATE not null,
constraint fk_customer_id foreign key(customer_id) references customer_table(customer_id)
);
CREATE TABLE customer_point_table
(
address_id NUMBER PRIMARY KEY,
customer_id NUMBER not null,
point_source VARCHAR2(20),
point_source_id NUMBER not null,
chang_point NUMBER not null,
create_time DATE not null,
constraint fk_customer_id foreign key(customer_id) references customer_table(customer_id)
);
CREATE TABLE costomer_login_table
(
login_id NUMBER PRIMARY KEY,
login_time DATE not null,
customer_id NUMBER not null,
login_ip VARCHAR2(20) not null,
logintype VARCHAR2(20) not null,
create_time DATE not null,
constraint fk_customer_id foreign key(customer_id) references customer_table(customer_id)
);
CREATE TABLE customer_account_balance_table
(
balance_id NUMBER PRIMARY KEY,
customer_id not nullNUMBER,
source VARCHAR2(20) not null,
source_bill_id not nullNUMBER,
amount NUMBER,
create_time DATE not null,
constraint fk_customer_id foreign key(customer_id) references customer_table(customer_id)
);
CREATE TABLE costomer_auths_table
(
wechat_id NUMBER PRIMARY KEY,
customer_id NUMBER not null,
shop_id NUMBER not null,
access_token NUMBER not null,
head_sculptre NUMBER,
phone NUMBER not null,
customer_id NUMBER not null,
login_password VARCHAR2(20) not null,
email VARCHAR2(20) not null,
create_time DATE not null,
constraint fk_customer_id foreign key(customer_id) references customer_table(customer_id),
constraint fk_shop_id foreign key(shop_id) references shop_basic_info_table(shop_id)
);
CREATE TABLE shop_basic_info_table
(
shop_id NUMBER PRIMARY KEY,
shop_name VARCHAR2(20) not null,
app_key VARCHAR2(50) not null,
app_Secret VARCHAR2(50) not null,
merchant_id NUMBER not null not null,
marketplaced VARCHAR2(10), not null
sale_sites VARCHAR2(10) not null,
create_time DATE not null,
);
CREATE TABLE costomer_shop_premission_table
(
premission_id NUMBER PRIMARY KEY,
customer_id NUMBER not null,
shop_id NUMBER not null,
permission VARCHAR2(20), not null
create_time DATE not null,
constraint fk_customer_id foreign key(customer_id) references customer_table(customer_id),
constraint fk_shop_id foreign key(shop_id) references shop_basic_info_table(shop_id)
);
CREATE TABLE commodity_catory_table
(
category_id NUMBER PRIMARY KEY,
category_name VARCHAR2(20) not null,
category_code NUMBER not null,
category_level VARCHAR2(20) not null,
category_status VARCHAR2(20) not null,
create_time DATE,
);
CREATE TABLE commodity_type_info_table
(
commodity_type_id NUMBER PRIMARY KEY,
commodity_type_name VARCHAR2(20) not null,
type_parameter VARCHAR2(20) not null,
commodity_id NUMBER not null,
weigh NUMBER,
commodity_length NUMBER,
width NUMBER,
color VARCHAR2(10),
production_date DATE,
expriy_date DATE,
create_time DATE not null,
constraint fk_customer_id foreign key(customer_id) references customer_table(customer_id),
);
CREATE TABLE commodity_archives_table
(
commodity_id NUMBER PRIMARY KEY,
customer_id NUMBER not null,
commodity_core NUMBER, not null
shop_id NUMBER not null,
brand_id NUMBER, not null
publish_status NUMBER(1) not null,
audit_status NUMBER(1) not null,
category_id NUMBER, not null
business_id NUMBER not null,
UPC VARCHAR2(20) not null,
leadtime DATE, not null
logistics_template VARCHAR2(20),
commodity_stock NUMBER not null,
price NUMBER not null,
keywords VARCHAR2(20),
commodity_describe VARCHAR2(50),
commodity_title VARCHAR2(20) not null,
create_time DATE,
constraint fk_customer_id foreign key(customer_id) references customer_table(customer_id),
constraint fk_shop_id foreign key(shop_id) references shop_basic_info_table(shop_id),
constraint fk_category_id foreign key(category_id) references commodity_catory_table(category_id)
);
CREATE TABLE brand_info_table
(
brand_id NUMBER PRIMARY KEY,
brand_name VARCHAR2(20) not null,
telephone VARCHAR2(20) not null,
brand_web NUMBER,
brand_logo NUMBER,
brand_description NUMBER,
brand_status NUMBER not null,
brand_order VARCHAR2(10),
create_time DATE not null,
);
CREATE TABLE commodity_picture_table
(
commodity_pic NUMBER PRIMARY KEY,
commodity_id NUMBER not null,
pic_url VARCHAR2(50),
pic_describe VARCHAR2(50),
master_or NUMBER(1), not null
pic_status NUMBER(1) not null,
create_time DATE not null,
constraint fk_commodity_id foreign key(commodity_id) references commodity_archives_table(commodity_id)
);
CREATE TABLE commodity_comment_table
(
comment_id NUMBER PRIMARY KEY,
order_id NUMBER,
customer_id NUMBER not null,
commodity_id NUMBER not null,
comment_title VARCHAR2(20), not null
comment_content VARCHAR2(50),
audit_status NUMBER(1) not null,
audit_time DATE(10) not null,
create_time DATE not null,
constraint fk_commodity_id foreign key(commodity_id) references commodity_archives_table(commodity_id),
constraint fk_corder_id foreign key(order_id) references order_note_info_table(order_id),
constraint fk_customer_id foreign key(customer_id) references customer_table(customer_id)
);
CREATE TABLE supplier_info_table
(
supplier_id NUMBER PRIMARY KEY,
supplier_code NUMBER not null,
phone_number NUMBER,
supplier_persion VARCHAR2(20), not null
supplier_name VARCHAR2(20) not null,
supplier_type VARCHAR2(20) not null,
bank_name VARCHAR2(20) not null,
bank_account VARCHAR2(50) not null,
supplier_status NUMBER(1) not null,
create_time DATE, not null
constraint fk_customer_id foreign key(customer_id) references customer_table(customer_id),
);
CREATE TABLE order_note_info_table
(
order_id NUMBER PRIMARY KEY,
order_code NUMBER not null,
customer_id NUMBER not null,
country VARCHAR2(20) not null,
province VARCHAR2(20) not null,
city VARCHAR2(20) not null,
district VARCHAR2(20) not null,
shop_id NUMBER not null,
consignee_name VARCHAR2(20) not null,
consignee_phone NUMBER not null,
consignee_address VARCHAR2(100) not null,
buyer_remark VARCHAR2(50),
order_system_state NUMBER(1) not null,
pay_way VARCHAR2(10) not null,
discount_amount NUMBER not null,
pay_money NUMBER not null,
pay_time DATE not null,
order_time DATE not null,
pay_amount NUMBER not null,
order_amount NUMBER, not null
platform_order_id NUMBER not null,
freight_amount NUMBER not null,
receive_time DATE not null,
order_point NUMBER not null,
create_time DATE not null,
invoice_time DATE not null,
constraint fk_customer_id foreign key(customer_id) references customer_table(customer_id),
constraint fk_shop_id foreign key(shop_id) references shop_basic_info_table(shop_id),
);
CREATE TABLE child_order_note_info_table
(
child_order_id NUMBER PRIMARY KEY,
commodity_num NUMBER not null,
commodity_price NUMBER not null,
commodity_title VARCHAR2(20) not null,
average_cost NUMBER,
order_id NUMBER not null,
commodity_id NUMBER not null,
commodity_num NUMBER not null,
commodity_price NUMBER not null,
create_time DATE not null,
constraint fk_customer_id foreign key(customer_id) references customer_table(customer_id),
constraint fk_commodity_id foreign key(commodity_id) references commodity_archives_table(commodity_id)
);
CREATE TABLE shopping_cart_table
(
cart_id NUMBER PRIMARY KEY,
customer_id NUMBER not null,
commodity_id NUMBER, not null
commodity_num NUMBER not null,
commodity_price NUMBER not null,
create_time DATE not null,
constraint fk_customer_id foreign key(customer_id) references customer_table(customer_id),
constraint fk_commodity_id foreign key(commodity_id) references commodity_archives_table(commodity_id)
);
CREATE TABLE order_logistics_info_table
(
logistics_id NUMBER PRIMARY KEY,
consignee_phone NUMBER,
consignee_zipcode NUMBER,
consignee_name VARCHAR2(20) not null,
consignee_address VARCHAR2(20),
order_id NUMBER not null,
duty NUMBER not null,
logistics_code NUMBER not null,
package_num NUMBER not null,
logistics_state NUMBER(1) not null,
logistics_way VARCHAR2(20) not null,
logistics_company VARCHAR2(20), not null
consignee_address VARCHAR2(20) not null,
create_time DATE not null,
constraint fk_order_id foreign key(order_id) references order_note_info_table(order_id)
);
CREATE TABLE warehouse_info_table
(
warehouse_id NUMBER PRIMARY KEY,
warehouse_code NUMBER not null,
warehouse_phone NUMBER,
warehouse_name VARCHAR2(20) not null,
contact VARCHAR2(20) not null,
country VARCHAR2(20) not null,
province VARCHAR2(20) not null,
city VARCHAR2(20) not null,
district VARCHAR2(20) not null,
concrete_address VARCHAR2(100),
warehouse_persion NUMBER not null,
warehouse_status NUMBER(1) not null,
create_time DATE not null,
);
CREATE TABLE commodity_stock_table
(
commodity_stock_id NUMBER PRIMARY KEY,
commodity_id NUMBER not null,
warehouse_id NUMBER not null,
commodity_stock NUMBER not null,
create_time DATE not null,
constraint fk_commodity_id foreign key(commodity_id) references commodity_archives_table(commodity_id),
constraint fk_warehouse_id foreign key(warehouse_id) references warehouse_info_table(warehouse_id)
);
CREATE TABLE shipping_info_table
(
ship_id NUMBER PRIMARY KEY,
logistics_id NUMBER not null,
ship_persion VARCHAR2(20) not null,
telephone NUMBER,
ship_price NUMBER,
create_time DATE not null,
constraint fk_logistics_id foreign key(logistics_id) references order_logistics_info_table(logistics_id)
);

创建触发器

首先对建立的表进行分析,对需要的触发器进行设计

  1. 每个表创建后都自动生成修改时间并且存储
    这里只对最后一个表shipping_info_table进行创建,其他表的原理一样。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
create or replace trigger "TR_CREATE_TIME"
before update on shipping_info_table
for each row
begin
if :ship_id.facescore<>:new.facescore then
insert into shipping_info_table values(shipping_info_table.ship_id,:old.ship_persion,:old.telephone,:old.ship_price,:new.createuser,sysdate);
end if;
if :logistics_id.writerscore<>:new.writerscore then
insert into shipping_info_table values(shipping_info_table.logistics_id,:old.ship_id,:old.telephone,:old.ship_price,:new.createuser,sysdate);
end if;
if :ship_persion.facescore<>:new.facescore then
insert into shipping_info_table values(shipping_info_table.ship_persion,:old.logistics_id,:old.telephone,:old.ship_price,:new.createuser,sysdate);
end if;
if :telephone.writerscore<>:new.writerscore then
insert into shipping_info_table values(shipping_info_table.telephone,:old.ship_id,:old.logistics_id,:old.ship_price,:new.createuser,sysdate);
end if;
if :ship_price.facescore<>:new.facescore then
insert into shipping_info_table values(shipping_info_table.ship_price,:old.ship_persion,:old.telephone,:old.logistics_id,:new.createuser,sysdate);
end if;
end;
  1. 订单完成后status变为1[number(1)]类型

  2. 物流成功后status变成1

  3. 订单完成后status变为1

  4. 对运行成功通过触发器进行检验,打印出相应的语句再日志表中

分析数据库面对的用户的种类,完成数据库用户的权限授权(建议确定合理的角色来完成权限的分配和回收)

DBA:拥有全部特权,是系统最高权限,只有DBA才可以创建数据库结构。RESOURCE:拥有Resource权限的用户只可以创建实体,不可以创建数据库结构。CONNECT:拥有Connect权限的用户只可以登录Oracle,不可以创建实体,不可以创建数据库结构。系统权限授权命令的使用语法:GRANT权限名TO用户 角色 PUBLIC其中,PUBLIC表示将权限赋给数据库中所有

分析过程

以亚马逊网商系统为背景进行Oracle数据库设计,首先以工领域中的用户操作人员分析出角色并为角色分配初始权限,然后针对具体岗位设置创建具体用户账号,最后根据该岗位的职能进行用户权限的具体配制。

角色设计

根据图书管的行政编制和岗位行政职能,分析出图书管理系统的角色包括master,开发者,测试员,管理员,普通用户,Primer用户六个角色。
master能够操作整个数据库的对象,并且具有创建和修改权限的权利。
开发者具有对表的修改权限。
测试员具有对表的修改权限。
普通用户具有普通权限。
Primer用户具有会员权限。

master:sys(超级管理员)

开发者:增删查改等开发权限
grant [grant_develop_privileges] to developer;
REVOKE[grant_develop_privileges] from developer;
测试员:增删查改等开发权限
grant [grant_develop_privileges] to developer;
REVOKE[grant_develop_privileges] from developer;
管理员:增删查改等管理权限
grant [grant_develop_privileges] to developer;
REVOKE[grant_develop_privileges] from developer;
普通用户:系统普通使用权限
grant [grant_develop_privileges] to developer;
REVOKE[grant_develop_privileges] from developer;
Primer用户:系统会员使用权限
grant [grant_develop_privileges] to developer;
REVOKE[grant_develop_privileges] from developer;

制定合理的数据库备份恢复策略。

备份策略确立

备份需求分析

根据亚马逊公司网商系统数据建设现状,分析威胁数据安全的主要因素,得出数据备份系统应该满足如下要求:

  1. 具备灵活方便的可扩展能力。 数据库日益增长的数据量要求数据备份系统能在现有设备和运行环境的基础上顺利进行升级和扩容。
  2. 备份数据具备良好的可恢复性。 可以实现数据库统一、集中、安全的备份和管理,确保备份数据的可靠性和可恢复性,为进行数据恢复操作奠定 基础。
  3. 保持业务连续性。 在满足油田勘探系统业务连续性要求的前提下实施数据备份,避免数据存储设备长时间中断对应用系统的使用造成严重的影响。

备份设备选型

根据对数据库进行备份需求分析,IBM TSM作为备份管理软件系统,用于支持备份数据管理。TSM 软件是为解决企业级的数据及系统安全而设计的备份解决方案,而亚马逊作为全球领先电商企业,该设备可以解决困扰信息技术部门的备份管理问题。TSM 的管理架构以其高度的扩展性和广泛的操作平台支持、集中式的自动存储管理等优势,为企业提供高效、自动、可扩展的备份管理体系。 TSM 的数据传输格式为经过加密处理的 TSM 独有的二进制格式,在每次数据备份和恢复时,TSM 自动进行 CRC数据校验,从而保证数据在备份和恢复过程中的完整性和安全性。

备份策略制定

通过详细分析亚马逊Oracle数据库存储结构、数据库运行方式、数据存储文件、数据增长速度和数据增长密度时段等实际情况,结合 Oracle 数据库几种备份方式的优缺点,本文制定了以下备份策略:

  1. 由于该数据库复杂,采用Oracle提供的备份工具RMAN与冷备份、逻辑备份相结合的方式,其中,RMAN备份为主要备份方式,冷备份、逻辑备份为辅助备份方式。
  2. RMAN 备份包括全备份和增量备份2种方式。本文采用了备份数据量小、存储空间要求较低的Differential增量备份方式。在进行一次级别n的Differential增量备份时,RMAN只会对那些与最近一次级别等于或小于n的增量备份相比发生变化的数据块进行备份。Differential 方式 RMAN 增量备份策略的实施,设定在每周日、周三进行 0 级数据库备份(相当于全备份)及归档日志备份;周一、周二、周四、周五、周六进行1级增量备份及归档日志备份。
  3. 备份触发方式:Unix 计划任务定时启动。建立系统CRON 任务,按照备份策略编辑命令,定时启动系统的计划任务(crontab)进程,调用 RMAN 备份或逻辑备份启动文件。
  4. 数据库归档方式:在 Archivelog(归档)模式下,数据库不仅可以进行一致备份,还可以在数据库打开的情况下进行联机备份。将所有使用 RMAN 备份的目标数据库全部切换为 Archivelog 模式,建立归档文件系统/oraarch,各 Oracle实例的归档目录统一设置为:/oraarch/$ORACLE_SID。

参考文献

[1]刘意凡.基于Spring MVC的亚马逊物流信息平台的设计与实现[D].北京:北京交通大学,2017.

[2]刘锦木.基于亚马逊平台电商管理信息系统的设计与实现[D].厦门:厦门大学,2015.

[3]骆斌,丁二玉.需求工程[M].第二版.北京:高等教育出版社,2015.

[4]孙风栋,王澜.Oracle 11g数据库基础教程[M].第二版.北京:电子工业出版社,2015.

[5]王珊,萨师煊.数据库系统概论[M].第五版.北京:高等教育出版社,2014.

[6]张云帆.Oracle数据库备份与恢复策略浅析[C].计算机工程,2009

[7]赵晓娟.基于角色的ORACLE用户权限管理设计[D].湘潭:湖南城建职业技术学院信息工程系,2009

[8]王立新.Oracle 数据库备份与恢复策略浅析[D]长春.汽车工业高等专科学校

[8]唐汉明,翟振兴,关宝军,王洪权.深入浅出MySQL[M].北京:人民邮电出版社,2014

本文使用 CC BY-NC-SA 3.0 中国大陆 协议许可
具体请参见 知识共享协议

本文链接:https://zyhang8.github.io/2019/09/18/amazon-oracle/