文档章节

用面向对象的思路建设计数据库

小马_wolf
 小马_wolf
发布于 2016/07/11 18:09
字数 968
阅读 24
收藏 1

场景

我们有多种类型订单:实物订单、特享商户订单、核销订单、生活缴费订单、电影票订单、机票订单、以及以后会持续新增的未知类型订单,它们都存放在不同的订单类型表中

影响

导致有些业务做起来会比较痛苦

比如:

  • 统计当前用户未付款订单总数
    1. 统计各类订单中该用户未支付的订单数
    2. 计算总数量
  • 在列表中显示当前用户在某个时间段内所有未支付订单的信息(实现方式如上)
    1. 统计各类订单中该用户在这个时间段内所有未支付的订单信息
    2. 在业务代码里面进行按时间排序(这里还会有各种订单里面的相同字段信息可能会不同命名造成业务代码里面的转换[如:核销订单叫order_id,生活缴费订单叫orderId],将要根据订单类型来分别判断..............各种痛苦)

例外还会有个未知因素:持续新增的未知类型订单
每新增一种内型订单,上面的实现都将随之新增业务代码。各种蛋疼。

思路

上次换工作,面试遇到一道面试题,如下:

请设计数据库,用来存放 老师、学生等人员的信息,尽量满足以后的扩展。(提示:请写出3种方式,并分别写出优缺点)

  1. 入门实现

    思路:设计一张表,用来存放人员信息,定义type字段,用来区分老师 和 学生
    - 优点:简单,能应对以后的各种查询
    - 缺点:数据冗余字段太多,查询速度慢

  2. 常见的实现

    思路:设计两张表:一张存放老师、一张存放学生(最常见的方式)
    - 优点:都这样搞,优点自然多多
    - 缺点:某些查询有些难以实现。(如:查询最近一个时间段的新加入的老师和学生并按时间排序)

  3. 面向对象的方式来实现

    思路:设计3张表:人员表、老师特有属性表、学什特有属性表
    - 优点:以上两种方式的优点总和
    - 缺点:未知

解决方案

转回来看 我们商城的订单表跟上面的无比相识,目前是使用第二种方式来实现,导致有些业务做起来有些不是很

如果换种方式按第三种方式来实现,一切又将美好起来。

第三种方式使用面向对象的方式来实现:

  1. 先把所有订单的公有的属性抽象集合起来(如:订单编号、下单时间、订单状态、订单类型等)创建一张父订单表
  2. 创建各种订单专有属性表(各类订单特有属性)
  3. 关系:父类订单表 与 订单表 一对一的关系(每张订单表里面都能在父订单表里面有1条与之对应)

以上方式将能满足绝大多数业务情况

如上面的两种查询情况:

  1. 统计各类订单中该用户未支付的订单数
  2. 在列表中显示当前用户在某个时间段内所有未支付订单的信息

这里实现起来因为都能在父订单表中获取到,将会无比 easy,业务代码里面的排序、字段转换等问题也迎刃而解

优点

  • 实现业务需求能力强
  • 可扩展性的特点,以后新增一种内型订单,只需要在父订单表中给订单类型新增个值,在新增加张订单特有属性表
  • 业务代码将改动小或者不用改动

本文转载自:https://www.webdevs.cn/article/92.html

共有 人打赏支持
小马_wolf
粉丝 5
博文 50
码字总数 31951
作品 0
朝阳
程序员
昨天去面试遇到一道java设计机试题,让写出最优设计代码,我用接口实现的,结果被鄙视

题目是这样的,市场上所有商品都要交销售税10%,除了书籍、食品和药品,进口商品还有交5%的进口税,税种和商品种类以后都要变化 给出了一份商品名单表,计算出本商品单总价和总共要交的税 设...

快乐鸟
2014/05/21
2.1K
19
基于面向对象(OO)的数据库设计模式探讨

前言 软件开发中面临的问题 在软件开发过程中,几乎没有几个程序员喜欢报表开发,报表多、杂,需求多变,特别是给人感觉没有什么技术含量,大家对报表都是退避三舍。如果 采用 BI 工具开发,...

IBMdW
2011/06/08
1K
2
Step by Step-构建自己的ORM系列-开篇

一、开篇 首先、园子里面之前的很多同仁已经讨论过了ORM相关的框架及其优点和缺点。虽然我本篇讨论的有点晚,但是其毕竟优点大于缺点,本文只是简单的介绍我讨 论ORM的目的,及为什么要讨论这...

何戈洲
2011/03/16
0
0
鲜奶配送“客户地址与送奶员、配送顺序”数据存储关系建设(SQL Sever)

要做一个学习的小项目,需要建一个鲜奶配送系统,服务于送奶员,现要为“购奶客户的地址、鲜奶送奶员、及送奶员关于这个地址的配送顺序”的数据存储关系建立一个数据库,此关系存在变更(例如...

Lee_q_wen
2015/04/05
256
2
直播|易观CTO郭炜:精益化数据分析——如何让你的企业具有BAT一样的分析能力

每一个企业建设大数据平台时都希望建设的大而全,但是实践证明可持续的大数据平台都通过精益化数据分析理论逐步建立而成的。精益化数据分析的理论就是通过建立最小的商业闭环,逐步验证和扩大...

51CTO编辑部
2017/11/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

一次由HandlerInterceptor进行的深入思考

HandlerInterceptor 是SpringFramework为我们提供的拦截器,一般我们可以用来鉴权或者日志记录等。 它是一个interface,主要方法有: /** * Intercept the execution of a handler. Called...

kipeng300
27分钟前
1
0
cmd中查询mysql表出现中文乱码

问题:在pycharm中正常的fetchall拉取数据,能够正常显示,而在cmd中直接select却出现中文乱码。 解决思路:右键查看cmd命令窗口属性得到,cmd窗口默认编码是gbk(如下图所示),而设置的mys...

fang_faye
53分钟前
2
0
centOS 安装Python3与python2并存

centOS 安装Python3与python2并存 如果本机安装了python2,尽量不要管他,使用python3运行python脚本就好,因为可能有程序依赖目前的python2环境, 比如yum!!!!! 不要动现有的python2环...

MedivhXu
今天
2
0
Spring JdbcTemplate模板模式与回调结合分析

在看Spring的JdbcTemplate的时候,看到其将模板模式和回调模式结合使用的实现,可以精妙的解决很多的问题。详见Spring中涉及的设计模式总结中的关于模板模式和回调模式结合的具分析,本文利用...

宸明
今天
1
0
docker update:更新一个或多个容器的配置

更新容器的配置 docker update:更新一个或多个容器的配置。 具体内容请访问:https://docs.docker.com/engine/reference/commandline/update/#options 语法:docker update [OPTIONS] CONTA...

lwenhao
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部