文档章节

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

小马_wolf
 小马_wolf
发布于 2016/07/11 18:09
字数 968
阅读 25
收藏 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
博文 51
码字总数 32390
作品 0
朝阳
程序员
私信 提问
昨天去面试遇到一道java设计机试题,让写出最优设计代码,我用接口实现的,结果被鄙视

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

快乐鸟
2014/05/21
2.1K
19
【原】PHP从入门到精通2小时【图文并茂】

原创内容,转载请注明。 主要内容: 搭建PHP开发环境 第一个helloworld程序 变量 全局变量 循环结构 函数 数组 面向对象编程 继承 接口 多态 日志 文件的读写 时间格式和时区 创建图形 从远程...

乌云上
2018/09/16
0
0
北京金色世纪商旅网,诚聘ASP.NET,JAVA,SOA架构师,需求分析等

Email:linjiajing@jsj.com.cn Asp.net工程师(中级)8K 岗位职责: 1.基于Web应用的系统功能开发及技术支持工作; 2.参与架构设计,并负责详细设计和编码; 岗位要求: 1. 计算机或相关专业正...

林佳晶
2012/03/23
376
2
基于hive建设数据仓库的问题?

想建设一个数据仓库,查阅了很多数仓建设方案,现在分层方案已经有了,具体物理上基于hive如何构建还是比较迷惑。主要疑问这几点: 1、在hive中建立多个库来分别代表不同的层吗? 2、hive中可...

有一个分号是中文
2018/11/30
0
0
Step by Step-构建自己的ORM系列-开篇

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

何戈洲
2011/03/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Linux syslog相关函数详解

介绍 syslog是Unix系统的日志系统。可以将日志记录在本地系统中。 一个完整的syslong日志包含如下信息:程序模块 | 严重性 | 时间 | 主机名 | 进程名 | 进程ID | 正文。 syslong相关函数 1....

RongJinhui0
11分钟前
0
0
使用nsenter工具进入Docker容器

查看本机装没有nsenter whereis nsenter或者whatis nsenter 未安装先安装,网上有很多这样的脚本 vi nsenter.sh#!/bin/bashcurl https://www.kernel.org/pub/linux/utils/util-linux/v2....

问题终结者
12分钟前
0
0
MaxCompute安全管理指南-基础篇

背景及目的 方便和辅助MaxCompute的project owner或安全管理员进行project的日常安全运维,保障数据安全。 MaxCompute有安全模型,DataWorks也有安全模型,当通过DataWorks使用MaxCompute,而...

阿里云云栖社区
13分钟前
0
0
Retrofit设计模式源码解析

因为Retrofit做到了很强的解耦,因此就一定需要用到很多设计模式。所以,我觉得,通过阅读Retrofit源码来学习设计模式是再好不过的设计模式学习方法了。 大致看了一圈Retrofit源码,受益匪浅...

亭子happy
13分钟前
3
0
哈夫曼编码

哈夫曼编码的基本思想是以字符的使用频率作为权构建一颗哈夫曼树,然后利用 哈夫曼树对字符进行编码 哈夫曼算法采用的贪心策略是每次从树的集合中取出没有双亲权值最小的两棵作为左右子树, ...

writeademo
15分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部