文档章节

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

小马_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
【原】PHP从入门到精通2小时【图文并茂】

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

乌云上
09/16
0
0
Step by Step-构建自己的ORM系列-开篇

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

何戈洲
2011/03/16
0
0
MySQL设计软件登录模块

学了一段时间的Java了,思量着做一点简单的小模块的东西吧,于是就有了下面的这个简单的小案例。 大致实现的功能就是注册于登录还有就是用到了一点,分层思想。仅此而已,所以非常的适合新手...

郭璞
2016/04/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

升压变换器 Boost

工作特点 输入输出极性相同。 开关管 MOS 和负载构成并联,在MOS 导通时,电流通过 L 滤波,电源对 L 充电。 当 MOS 断开时,L 向负载及电源放电,输出电压将是 Ui+U L ,达到升压的目的。 ...

colinux
27分钟前
1
0
OSChina 周一乱弹 —— 你狗命在我手上

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 小小编辑:推荐歌曲,《I.W.A.B.N》- Lil Ghost 《I.W.A.B.N》- Lil Ghost 手机党少年们想听歌,请使劲儿戳(这里) 几天没见, 大王(@罗马的...

小小编辑
28分钟前
169
6
轻量级 memcached缓存代理 twemproxy实践

本文内容脑图如下: 文章共 533字,阅读大约需要 2分钟 ! 概 述 twemproxy(nutcracker) 是 Twitter开源的轻量级 memcached / redis 代理服务器,本质就是一个集群管理工具,主要用来弥补 ...

CodeSheep
48分钟前
7
0
Apache日志不记录访问静态文件,访问日志切割,静态元素过期时间设置

Apache配置不记录访问静态文件的日志 网站大多元素为静态文件,如图片、css、js等,这些元素可以不用记录 vhost原始配置 <VirtualHost *:80> ServerAdmin test@163.com DocumentRoo...

野雪球
今天
3
0
聊聊storm的ICommitterTridentSpout

序 本文主要研究一下storm的ICommitterTridentSpout ICommitterTridentSpout storm-core-1.2.2-sources.jar!/org/apache/storm/trident/spout/ICommitterTridentSpout.java public interface......

go4it
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部