文档章节

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

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

场景

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

影响

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

比如:

  • 统计当前用户未付款订单总数
    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
粉丝 4
博文 45
码字总数 25915
作品 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
直播|易观CTO郭炜:精益化数据分析——如何让你的企业具有BAT一样的分析能力

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

51CTO编辑部
2017/11/17
0
0
鲜奶配送“客户地址与送奶员、配送顺序”数据存储关系建设(SQL Sever)

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

Lee_q_wen
2015/04/05
256
2
MySQL设计软件登录模块

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

郭璞
2016/04/22
0
0
短脚爸爸学Python入门 1.1

前几天看Python视频教程,老师学编程一定要做笔记发博客,这样可以提高你的兴趣和成就感。想了想也对!就打算发布51CTO上 在课上老师讲了一大堆Python术语。什么面向对象、面向过程、’类、包...

jamesbondaaa
06/26
0
0
关于php后台ajax与数据库交互功能求思路

关于php后台ajax与数据库交互功能求思路,以前直接用php文件,可这样没达到重用和数据,弄了好多if elseif else 语句,求各位大神有没有更好的办法,面向对象的更好。

杨太化
2014/07/13
975
5
清华大学视频课件:面向对象程序设计(C++)(自主模式)

清华大学视频课件:面向对象程序设计(C++)(自主模式) 课程简介 C++是从C语言发展演变而来的一种面向对象的程序设计语言。面向对象的程序设计方法将数据及对数据的操作方法封装在一起,作...

dragonscroll
2017/11/16
0
0
使用iOS原生sqlite3框架对sqlite数据库进行操作

使用iOS原生sqlite3框架对sqlite数据库进行操作 一、引言 sqlite数据库是一种小型数据库,由于其小巧与简洁,在移动开发领域应用深广,sqlite数据库有一套完备的sqlite语句进行管理操作,一些...

珲少
2016/01/13
2.7K
4

没有更多内容

加载失败,请刷新页面

加载更多

下一页

高效编写Dockerfile的几条准则

概述 Dockerfile 是专门用来进行自动化构建镜像的编排文件(就像Jenkins 2.0时代的Jenkinsfile是对Jenkins的Job和Stage的编排一样),我们可以通过 docker build 命令来自动化地从 Dockerfi...

小致dad
41分钟前
0
0
SpringBoot | 第十章:Swagger2的集成和使用

前言 前一章节介绍了mybatisPlus的集成和简单使用,本章节开始接着上一章节的用户表,进行Swagger2的集成。现在都奉行前后端分离开发和微服务大行其道,分微服务及前后端分离后,前后端开发的...

oKong
今天
9
0
Python 最小二乘法 拟合 二次曲线

Python 二次拟合 随机生成数据,并且加上噪声干扰 构造需要拟合的函数形式,使用最小二乘法进行拟合 输出拟合后的参数 将拟合后的函数与原始数据绘图后进行对比 import numpy as npimport...

阿豪boy
今天
7
0
云拿 无人便利店

附近(上海市-航南路)开了家无人便利店.特意进去体验了一下.下面把自己看到的跟大家分享下. 经得现场工作人员同意后拍了几张照片.从外面看是这样.店门口的指导里强调:不要一次扫码多个人进入....

周翔
昨天
1
0
Java设计模式学习之工厂模式

在Java(或者叫做面向对象语言)的世界中,工厂模式被广泛应用于项目中,也许你并没有听说过,不过也许你已经在使用了。 简单来说,工厂模式的出现源于增加程序序的可扩展性,降低耦合度。之...

路小磊
昨天
196
1
npm profile 新功能介绍

转载地址 npm profile 新功能介绍 npm新版本新推来一个功能,npm profile,这个可以更改自己简介信息的命令,以后可以不用去登录网站来修改自己的简介了 具体的这个功能的支持大概是在6这个版...

durban
昨天
1
0
Serial2Ethernet Bi-redirection

Serial Tool Serial Tool is a utility for developing serial communications, custom protocols or device testing. You can set up bytes to send accordingly to your protocol and save......

zungyiu
昨天
1
0
python里求解物理学上的双弹簧质能系统

物理的模型如下: 在这个系统里有两个物体,它们的质量分别是m1和m2,被两个弹簧连接在一起,伸缩系统为k1和k2,左端固定。假定没有外力时,两个弹簧的长度为L1和L2。 由于两物体有重力,那么...

wangxuwei
昨天
0
0
apolloxlua 介绍

##项目介绍 apolloxlua 目前支持javascript到lua的翻译。可以在openresty和luajit里使用。这个工具分为两种模式, 一种是web模式,可以通过网页使用。另外一种是tool模式, 通常作为大规模翻...

钟元OSS
昨天
2
0
Mybatis入门

简介: 定义:Mybatis是一个支持普通SQL查询、存储过程和高级映射的持久层框架。 途径:MyBatis通过XML文件或者注解的形式配置映射,实现数据库查询。 特性:动态SQL语句。 文件结构:Mybat...

霍淇滨
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部