如何设计一个数据库

2023-11-02

前言

我们知道,软件工程是为了解决软件危机的,它是采用工程的概念、原理、 技术和方法来开发与维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来。

在软件开发的过程中,数据库设计是非常重要的,它需要根据需求分析设抽象出E-R图,逻辑结构设计,数据库选型,物理设计,实施及运维。下面就聊聊那些年数据库设计的那些事。

软件工程

在问题定义和可行性分析都做好的前提下,就可以进入需求分析阶段了,通常来讲,一般都有产品部,需求分析往往都是由产品经理和客户去沟通落地形成PRD,跟开发沟通之后,就可以根据需求分析做数据库设计了,下面主要讨论下数据库设计的步骤以及每个阶段要完成的内容。

数据库设计基本步骤

需求分析阶段

要进行数据库设计首先要了解用户需求,参与到用户需求分析中去,需求分析常用SA(Structured Analysis:结构化分析方法)强调开发方法的结构合理性以及所开发软件的结构合理性的软件开发方法,是生命周期法的继承与发展,是生命周期法与结构化程序设计思想的结合。

其基本思想是用系统工程的思想和工程化得方法,根据用户至上的原则,自始自终按照结构化、模块化,自顶向下地对系统进行分析与设计。建立的主要步骤如下:

  1. 首先画系统的输入输出,先画顶层数据流程图(DFD:Data Flow Diagram),顶层数据流程图只包含一个加工,用以表示被开发的系统,然后考虑该系统有哪些输入、输出数据流。
  2. 画系统内部,即画下层数据流层图。

下面是一个交易系统的DFD,需要先画出顶层数据流图,主要包括系统子模块之间的交互,然后再进一步对子模块进行分解。

概念设计阶段

概念设计是整个数据库设计的关键,它是对需求分析阶段的成果进行综合,归档以及抽象出一个独立具体的DBMS模型,与具体的RDBMS产品无关。

在实际的开发中,常用E-R(Entity-Relationship:实体关系)图来表示,常用的工具PowerDesigner,可以实现CDM(概念数据模型)->LDM(逻辑数据模型)->PDM(物理数据模型)->Database的自动转换,这个过程称为正向工程,如果有database建库脚本,也可以通过PowerDesigner工具生成CDM,即Database->PDM->LDM->CDM,称为反向工程

概念设计通常采用自底向上,首先定义各系统局部的概念模型,然后再将他们集成合并起来,得到全局的概念模型。

举个例子说明下,现在负责交易系统的开发,主要涉及订单,价格模块,分别交给不同的开发去设计开发。

首先每个人要根据需求分析抽象出自己的实体Entity及之间的关系Relationship,设计初步完成之后就要开会讨论了,把每个开发的ER图合并起来,就得到全局交易系统的CDM。

名词动词形容词分析法

开发如何根据需求分析设计ER图,完成模块的详细设计,提供接口文档,最重要的是需求分析抽象CDM阶段的ER图,一种行之有效的方法就是名称动词形容词分析法,下面就详细解释下这种分析方法。

还是举例说明吧,现在让我负责交易系统的订单这块的开发,在需求分析文档里看到一句话实现订单的高效管理,分析的过程如下:

名称:订单,订单就是一个Entity,也可以拆分成多个Entity,抽象出每个Entity的Attribute(前期可能由于需求不明确,可以只做确认的内容),Entity通过PowerDesigner的正向工程转换成数据库里的数据表,Attribute就是表的字段;数据表通过ORM映射到Java里的就是Class,字段就是private属性。

动词:管理,也就是要对订单要进行增删改查CRUD操作。

形容词:高效,首先想到在订单表上创建合适的索引吧,其次根据业务的发展,订单表太大会影响写入性能,是否要进行读写分离,分库分表操作。

数据库设计三范式

第一范式1NF:确保每个字段保持原子性,不可分割。

对于用户表users来说,有用户姓名(一般由first_name和last_name组成),如果使用类似Oracle的复合数据类型,就违反了1NF。

很明显users的字段user_name是一个自定类型,是可分解的,这就违反了1NF。

第二范式2NF:确保字段完全依赖于主键。

一个表中只能保存一种数据,不可以把多种数据保存在一张表里,假如一张表既存储了用户信息,又存储商品信息,还存储了订单信息,这样就违反了2NF,而应该将用户表,商品表,订单表拆分成三张表,确保字段是该表拥有的。

第三范式3NF:必须满足2NF,实体中每个属性与主键直接相关而不能间接相关。

这个也不难理解,对于订单表orders来讲,是要存储用户表users的user_id,要明确哪个用户下的单,有些业务场景是要获取users表的用户姓名user_name,为了减少orders和users表的关联查询,将user_name冗余到orders表中,这种设计就违反了3NF,减少数据冗余,可以通过主外键进行表之间连接。

到底该不该使用外键Foreign Key

外键目的是为了保证数据完整性和一致性,避免产生脏数据,设置外键有啥缺点呢。

  1. 影响写入性能:对于insert来说,每次都要判断从表的外键列是否在主表中存在(例如每次插入orders表,都要判断下user_id是否在users中存在),会降低数据库的写入性能,对于MySQL本来就只有Master输出写能力的数据库,就不太合适了,MySQL开发规范规定不允许使用外键也是有一定道理的。

  2. 并发问题:在使用外键的情况下,每次修改数据都需要去另外一个表检查数据,需要获取额外的锁。在高并发大场景,使用外键造成死锁或锁等几率更大。

实际开发中,更多的是不靠外键来保证数据的完整性和一致性,而是通过的业务逻辑,比如用户要下单,必须先登录系统,下单只需要将登录的用户编号写入到订单表,这个用户必然是存在于用户表的,对于一个用户友好的系统来说,尽量让用户选择,不要人工输入,这样可以保证数据一致性,避免脏数据的产生。

逻辑设计阶段

逻辑设计阶段是将概念数据模型转换为具体的DBMS所支持的数据模型,并将进行优化。虽然LDM独立于DBMS的,但可以进行外键,索引,视图等对象的设计工作。

在此阶段,各子模块的E-R图之间的冲突主要有三类:属性冲突,命名冲突和结构冲突,同时E-R图向关系模型的转换,要解决如何将实体性和实体间的联系转换为关系模式,确定这些关系模式的属性和码,实际开发中,逻辑设计阶段不是必须的,有些是从CDM直接到PDM了。

数据库选型

数据库选型是非常重要的环节,一般在需求分析完成之后,通过架构评审会进行确认,数据库方面主要包括数据存储,检索,安全,读写分离,分库分表,数据归档,接入数据仓库都要进行确认,根据业务的场景对相关的数据库产品进行调研比对,选择最适合业务场景的数据库作为存储。

举个例子:对于一个DAU 1000W TPS 3W的交易的业务场景,如果使用MySQL来存储,我们知道原生的MySQL写入瓶颈,以及订单相关表数据量增长过快导致的性能问题,不太适合这种高并发写的场景,可以考虑使用分布式MySQL,例如常见的DRDS,TiDB,OceanBase。既可以解决原生MySQL写入瓶颈,同时也可以处理单表数据量大导致的分库分表问题。

同样对于优酷,爱奇艺这种视频类系统,使用MySQL来存储就不太合适了,应该采用MongoDB集群来存储;对于京东,淘宝的这种搜索服务采用ElastSearch数据库集群处理会更高效。

物理设计阶段

逻辑设计阶段和数据库选型完成之后,就可以通过LDM生成PDM了,在物理设计阶段,需要设计跟RDBMS相关的对象,例如设计存储过程,触发器,用户自定义函数,表空间等。

数据库实施阶段

例如选择的是MySQL数据库,通过PDM生成数据库的建库脚本之后,需要进行规范性检查,通过之后就可以创建表结构,规范性检查可以借助开源的SQL审核工具,如Yearning,Archery都可以设置规则,检查之后会给出整改建议,能够帮我们自动实现SQL Review。Yearning是用go开发,目前只支持MySQL数据库,Archery可以支持多种数据库。下面是Yearning自动化SQL审核平台的一个DDL工单的检测示例。

检测通过后就可以提交工单了,审核通过后就会自动执行DDL脚本建库。

数据库维护阶段

数据库维护阶段主要包括业务支撑和数据库运维,简单总结了下,如下图所示。

总结

实际开发中,数据库设计阶段是非常重要,通常都是开发自己根据业务模块的需求去分析,抽取成CDM中的E-R图,转换成LDM,经过数据库选型及生成PDM,最终生成数据库表,然后才能开始coding,测试、发布上线以及版本迭代,为了保证线上业务的安全稳定高效,就需要对数据库进行精细化管理和维护。

仔细观察不难发现,数据库设计的核心就是对需求分析的理解以及抽取沉底出E-R图,这就需要对行业及相关业务有深刻立即及抽象能力

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何设计一个数据库 的相关文章

  • 【计算机开题报告】基于JAVA的酒店管理系统的设计与实现

    1 毕业设计 论文 综述 随着社会经济和科技的迅速发展 人们对衣食住行的要求也逐渐提高 酒店 宾馆在服务行业中扮演着越来越重要的角色 本课程设计的内容旨在以管理系统的方式给人们出行提供酒店预订服务 从而能够更方便快捷的帮助酒店工作人员办理客
  • 【计算机开题报告】图书管理系统

    一 选题依据 简述国内外研究现状 生产需求状况 说明选题目的 意义 列出主要参考文献 国内外研究现状 国外研究现状 在很多发达国家 图书管理系统的应用和技术发展已经相对完善 并且还建立了数字图书馆 各方面的情况也非常成熟 而图书管理的应用价
  • ERROR 5025 (HY000): Insert has filtered data in strict mode, tracking_url=http://IP

    通过http api批量插入数据的时候报Reason null value for not null column column xxx src line 解决方法 检查是否有null值存在 增加数据库字段长度 如下语句更改长度 ALTER
  • Hive操作命令上手手册

    内容来自于 大数据Hive离线计算开发实战 Hive原理 Hive是一个基于Hadoop的数据仓库和分析系统 用于管理和查询大型数据集 以下是Hive的原理 数据仓库 Hive将结构化的数据文件映射成一张表 并提供类SQL查询功能 用户可以
  • Kali Linux 安全渗透核心总结,444页核心知识点

    就像IT人离不开Linux系统一样 网安人也离不开Kali Linux 作为攻击性防御和渗透测试的代名词 越来越多的人开始学习Kali 如果你也对kali感兴趣 又想深入了解这方面内容 不妨收藏一下这份Kali Linux安全渗透教程 共4
  • python按列写入数据到excel

    要将数据按列写入 Excel 可以使用 Python 的 openpyxl 库 首先 需要安装 openpyxl 库 可以使用以下命令在终端或命令提示符中安装 pip install openpyxl 然后 可以按照以下步骤编写代码 1 导
  • 成为一个黑客,就按照这个路线来!

    前几天一个同学在聊天中提到毕业后想要从事网络安全方向的工作 虽然他本身也是学计算机的 但是又怕心有余而力不足 因为 从事网络安全方面的工作向来起点都比较高 大学里少有开设这类课程的 在学校能够学到的知识比较有限 网上的关于这方面课程的质量又
  • Qt源码分析:Qt程序是怎么运行起来的?

    一 从 exec 谈起 一个标准的Qt gui程序 在启动时我们会coding如下几行简洁的代码 include widget h include
  • 亚信安慧AntDB引领数字化转型:浙江移动成功实现CRM系统全域改造

    数字时代 通信运营商在不断迭代的背景下 需要不断探索数字化转型的路径 以适应快速发展的市场和技术环境 在这一浪潮中 浙江移动站在前沿 率先完成了其CRM系统的全域改造 采用了亚信安慧公司研发的AntDB数据库 为整个行业树立了数字化转型的标
  • 【计算机毕业设计】校园体育赛事管理系统

    身处网络时代 随着网络系统体系发展的不断成熟和完善 人们的生活也随之发生了很大的变化 人们在追求较高物质生活的同时 也在想着如何使自身的精神内涵得到提升 而读书就是人们获得精神享受非常重要的途径 为了满足人们随时随地只要有网络就可以看书的要
  • 【计算机毕业设计】线上招聘问答系统

    计算机网络发展到现在已经好几十年了 在理论上面已经有了很丰富的基础 并且在现实生活中也到处都在使用 可以说 经过几十年的发展 互联网技术已经把地域信息的隔阂给消除了 让整个世界都可以即时通话和联系 极大的方便了人们的生活 所以说 线上招聘问
  • 【计算机毕业设计】北关村基本办公管理系统

    在如今社会上 关于信息上面的处理 没有任何一个企业或者个人会忽视 如何让信息急速传递 并且归档储存查询 采用之前的纸张记录模式已经不符合当前使用要求了 所以 对北关村基本办公信息管理的提升 也为了对北关村基本办公信息进行更好的维护 北关村基
  • 基于java的饮食分享平台系统设计与实现

    基于java的饮食分享平台系统设计与实现 I 引言 A 研究背景和动机 近年来 随着人们生活水平的提高和健康意识的增强 饮食健康已经成为越来越多人的关注焦点 因此 一个方便快捷的饮食分享平台就显得尤为重要 基于Java的饮食分享平台系统设计
  • 面试官问,如何在十亿级别用户中检查用户名是否存在?

    面试官问 如何在十亿级别用户中检查用户名是否存在 前言 不知道大家有没有留意过 在使用一些app注册的时候 提示你用户名已经被占用了 需要更换一个 这是如何实现的呢 你可能想这不是很简单吗 去数据库里查一下有没有不就行了吗 那么假如用户数量
  • 30天精通Nodejs--第二十天:express-操作mysql

    目录 前言 安装依赖并配置MySQL连接 安装mysql2库 配置连接信息 在Express应用中使用MySQL 结合Express路由实现CRUD操作 整合到主应用 结语 前言 在Node js中使用Expre
  • Mysql中设置只允许指定ip能连接访问(可视化工具的方式)

    场景 Mysql中怎样设置指定ip远程访问连接 Mysql中怎样设置指定ip远程访问连接 navicat for mysql 设置只有某个ip可以远程链接 CSDN博客 前面设置root账户指定ip能连接访问是通过命令行的方式 如果通过可视
  • MongoDB - 库、集合、文档(操作 + 演示 + 注意事项)

    目录 一 MongoDB 1 1 简介 a MongoDB 是什么 为什么要使用 MongoDB b 应用场景 c MongoDB 这么强大 是不是可以直接代替 MySQL d MongoDB 中的一些概念 e Docker 下载 1 2
  • 毕业设计:基于python人脸识别系统 LBPH算法 sqlite数据库 (源码)✅

    博主介绍 全网粉丝10W 前互联网大厂软件研发 集结硕博英豪成立工作室 专注于计算机相关专业 毕业设计 项目实战6年之久 选择我们就是选择放心 选择安心毕业 感兴趣的可以先收藏起来 点赞 关注不迷路 毕业设计 2023 2024年计算机毕业
  • 温室气体排放更敏感的模型(即更高的平衡气候敏感性(ECS))在数年到数十年时间尺度上也具有更高的温度变化(Python代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Python代码 数据
  • SAP ERP系统是什么?SAP好用吗?

    A公司是一家传统制造企业 公司曾先后使用过数个管理软件系统 但各部门使用的软件都是单独功能 导致企业日常管理中数据流与信息流相对独立 形成了 信息孤岛 随着公司近年业务规模的快速发展以及客户数量的迅速增加 企业原有的信息系统在销售预测及生产

随机推荐

  • 低功耗技术(一)动态功耗与静态功耗

    原创 AndyICer Andy的ICer之路 1月5日 低功耗技术 一 动态功耗与静态功耗 一 动态功耗 翻转功耗 Switching Power 翻转功耗是由充放电电容引起的动态功耗 其推导过程很简单 但是这个最终的结果却十分重要 sw
  • Jedis使用java连接Redis

    Maven创建 创建一个maven的项目 其中pom xml依赖为
  • 在Ubuntu中安装eclipse

    1 下载JDK和eclipse jdk下载网址 http www oracle com technetwork java javase downloads jdk8 downloads 2133151 html eclipse下载网址 ht
  • AD20铺铜操作及设置

    AD20铺铜方法 首先 建议铺铜前 先滴泪 提高信号完整性 1 铺铜 放置 gt 铺铜 2 铺铜时 先设置属性 如果以前设置过 不用重设 点键盘上的 Tab 键 调出 属性 界面 3 操作 沿着四个点 到第4点时 点鼠标左键 完成划区域 如
  • stm32同芯片但不同flash工程更换Device出现报错

    目录 1 问题描述 2 解决方案 1 问题描述 stm32同芯片但不同flash工程更换Device出现报错 2 解决方案 更换Device 我是从ZE换为C8 把这个从HD更换为MD 解决
  • Three.js - 透视相机(PerspectiveCamera)(三)

    简介 在three js中 摄像机的作用就是不断的拍摄我们创建好的场景 然后通过渲染器渲染到屏幕中 想通过不同的角度观看场景 就需要修改摄像机的位置来拍摄场景 本文详细介绍的是透视相机 PerspectiveCamera 它是用来模拟人眼所
  • OpenWrt自定义luci页面来修改配置文件

    在使用OpenWrt路由器的过程中 经常需要根据需要改改配置文件然后重新启动服务什么的 一般的做法是SSH登录路由器后台 使用vi编辑器修改文件 然后使用 etc init d xxxx restart 来重启服务 次数多了就会觉得很繁琐
  • 一步步写嵌入式操作系统 中断处理

    简单的中断处理程序 简单的中断处理程序 1 获取被中断模式的将要执行的指令的地址到LR 2 将LR压入中断模式栈 3 将pc置为公共的中断服务函数入口地址 并记录下一条指令地址到LR 4 从公共的中断服务函数返回 5 从spsr恢复被中断模
  • Ribbon负载均衡器

    两种 1 1 集中式负载均衡 服务端负载均衡 硬件 nginx 轮询 负载 哈希 随机 权重 为什么要做负载均衡 1 2 客户端负载均衡器 用客户端 负载均衡器 很多机制可以自定义 小知识 不想让别人调自己 只想用别人的 怎么做 只需要不注
  • 用simulink 模型自动生成代码之 SPWM

    正弦PWM的信号波为正弦波 就是正弦波等效成一系列等幅不等宽的矩形脉冲波形 其脉冲宽度是由正弦波和三角波自然相交生成的 正弦波波形产生的方法有很多种 但较典型的主要有 对称规则采样法 不对称规则采样法和平均对称规则采样法三种 第一种方法由于
  • qt工具栏和菜单栏

    以前用过qt 但是老是忘 得现查 现记录如下 1 一个menubar可以有多个menu 2 一个menu可以有多个action 菜单栏里的各项叫做action 而不是Menu action可以当作实体 3 每个action对应事件 比如 1
  • Git 介绍

    一 理解 Git 1 分布式版本控制 Git 版本控制系统的设计思想是 去中心化 传统的 CVS SVN 等工具采用的是 C S 架构 只有一个中心代码仓库 位于服务器端 而一旦由于服务器系统宕机 网络不通等各种原因造成中心仓库不可用 整个
  • 使用taro框架注意避免的一些问题

    1 参数名的问题 Taro request url path data prams header 这里注意header是没有s的 不然消息体里的数据就会是 object Object Content Type application jso
  • com.google.zxing.NotFoundException 问题分析

    这仅仅是一篇问题分析哈 提供理解这个问题的思路 并不是解决这个问题的方法 背景 先说背景 项目中需要一个扫描二维码的功能 网上找了一个比较火的 BGAQRCode Android 用了一圈感觉还不错 但是在扫描页面 logcat 总是报 W
  • redhat中文文件名、文件夹乱码问题解决

    redhat在没有安装中文rpm包之前 中文会显示为乱码的小方块字样 利用ssh客户端在上传中文文件名的文件或文件夹时 均不能识别中文 给开发应用造成很大的困扰 首先安装fonts chinese 3 02 9 6 el5 noarch r
  • 在服务器上安装vasp如何得到输出文件,科学网—VASP各输出文件解读-更新中 - 叶小球的博文...

    PROCAR file For static calculations the file PROCAR contains the spd and site projected wave function character of each
  • 单片机MPU9250/6050陀螺仪芯片驱动

    单片机MPU9250 6050陀螺仪芯片驱动 CubeMX配置 驱动代码 项目需要陀螺仪检测设备位置角度信息 所以就有了本文章 代码借鉴了github上大佬写的应用了卡尔曼滤波 关于寄存器的说明参考 当然驱动代码中也附带了说明 https
  • 用jquery实现仿淘宝焦点图的动画

  • 百万前端之js生成用户登录图形验证码

    用户登录的图形验证码 jquey生成引入图形验证码 和前端判断是否正确 参考代码如下 css login title width 20 height 3rem margin 0 auto margin top 2rem text align
  • 如何设计一个数据库

    前言 我们知道 软件工程是为了解决软件危机的 它是采用工程的概念 原理 技术和方法来开发与维护软件 把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来 在软件开发的过程中 数据库设计是非常重要的 它需要根据需求分析设抽