从零做软件开发项目系列之四——数据库设计

news2025/1/23 10:33:35

前言

在对软件进行设计的过程中,数据库的设计是一项重要的内容,软件中主要的处理对象就是各类业务数据,通过对业务数据的处理,实现各种功能。我们经常说的,写程序,说到底就是增删改查,而增删改查的对象就是各种数据。数据都存储在数据库中,其重要性不言而喻,对于数据库的设计也是软件设计的一个重要基础。

1 数据库选型

开发的软件,使用什么样的数据库,是由具体的业务数据要求决定。主要考虑的因素包括需要处理哪些数据,数据的规模如何,是否为结构化数据,对数据的安全性要求如何,数据是否需要实时进行处理等多个方面。
数据库类型有基于SQL的关系型数据库,主要用来处理结构化数据,由一个个表构成,可以通过SQL语句进行查询,如MySQL、PostgreSQL、Oracle、MS SQL Server等。
NoSQL数据库,用来处理非结构或半结构化数据,也有自己的查询语言。NoSQL数据库根据存储数据结构的不同,又可以分为文档存储数据库,常见的文档数据库有MongoDB、CouchDB、DocumentDB。列数据库,数据按列进行存储,常见的列存储数据库有 Cassandra。键值对存储数据库,用来存储键值对数据,常见的键值对数据库有 Redis、Memcached。图数据库,以三元组的形式,存储规模较大的数据,常见的图数据库有Neo4j、InfiniteGraph、virtuoso等。
在这里插入图片描述

选择合适的数据库,就是使用数据库的特点和优点,满足实际的业务场景。也有很多时候,是将多种数据库混合使用,结合多种数据库的优点。比如Mysql配合Redis使用,在软件开发中比较普遍,把Mysql表中经常访问的记录放在了Redis中,然后用户查询时先去查询Redis再去查询Mysql,实现了读写分离,也就是Redis只做读操作。由于缓存在内存中,所以查询会很快。

2 数据库设计原则

数据库的设计,遵循一定的规范,一般是按照三范式的规则进行设计。理论上还有第四范式和第五范式,实际中用的相对较少。
第一范式(1NF)是每一列不可再分,保证列的原子性。其实这也是和业务挂钩的,根据业务需要,没有必要再分,也就符合了1NF。比如人的姓名,一般情况就不用再分,已经是原子属性了。但对一些特殊业务场景,就可能会继续拆分,比如家谱系统,需要区分姓和名,这时候姓名就需要进一步划分,这里的原子性还是针对业务需求来说的。
第二范式(2NF)是在满足1NF的基础上,确保表的非主键列都和主键相关,也就是表的一行只记录一种数据,实际上是一个拆表的动作。这样行的所有数据都和主键相关。比如学生表中班级信息,如果班级包括多个字段(年级,班级名称,班主任等),班级信息需要单独做一个表。需要加外键的动作,将班级id加到学生表,建立学生与班级的关联。
第三范式(3NF)是在满足2NF的基础上,保证表的非主键列和主键直接相关,而不是间接相关,而且非主键列之间不能存在依赖关系。比如学生表:学号,姓名,年龄,班主任,班主任电话。其中关键字为单一关键字"学号"。存在依赖传递::(学号) → (班主任) → (班主任电话) 。将学生表与班主任表进行拆分,学生表:学号, 姓名, 年龄, 班主任;班主任表:班主任姓名,电话。
在这里插入图片描述

依据三范式设计规范,可以建立冗余较小、结构合理的数据库。在实际项目的数据库设计中,最重要的是看需求和性能,根据需求和性能来确定表的结构,也不能非常教条的去追求范式建立数据库。比如资产管理,最主要的资产信息和资产的资源,是两个表,由于前台显示需要将信息和资源一起显示,如果查询两个表,效率就会比较低,为了查询快速,可以将资产信息表和资产资源表合并为一个表,会有大量的冗余信息,是不符合三范式规则的,但有利于业务需求,还是合并处理比较好一些。

3 设计约定

在数据库设计过程中,遵守的一些设计约定,可以在设计原则的基础上,进一步规范数据库设计的细节要求。三范式可以认为是战略上的要求,是一个总的原则,设计约定则是战术上的要求,很具体,需要在实践中执行。
1)表达是/否概念的字段,必须使用 is_xxx 的方式命名,数据类型是 unsigned tinyint(0表示否,1表示是)。
说明: 检查is__xxx的命名方式是为了明确其取值含义与范围;任何字段如果为非负数,必须是 unsigned。
注意:使用tinyint类型,默认值为4,页可设为1,即tinyint(1)等价于boolean;POJO类中的任何布尔型的变量,都不允许加is前缀。
2)表名、字段名必须使用小写字母或数字,禁止出现数字开头,表的命名最好是加上“业务名称_表的作用”。
说明: MySQL 在 Windows 下不区分大小写,但在 Linux 下默认是区分大小写。因此,数据库名、表名、字段名,都不允许出现任何大写字母,避免节外生枝。
如,edu_teacher,sys_menu
3)表名不使用复数名词
说明: 表名应该仅仅表示表里面的实体内容,不应该表示实体数量,对应于 DO 类名也是单数形式,符合表达习惯。
4)varchar 是可变长字符串,不预先分配存储空间,长度不要超过5000,如果存储长度大于此值,定义字段类型为 text,独立出来一张表,用主键来对应,避免影响其它字段索引效率。
说明: 该表的命名以 原表名_字段缩写 的格式命名。
5)表必备字段: id, create_by,create_time,update_by, update_time,remark。也可以叫做Who字段,就是每个表里必须具备的字段。这些字段起到似metadata的作用。这些字段的作用很大,例如,数据分析的时候,可以使用update_time作为数据抽取的时间戳字段等。

  • id 必为主键,类型为 unsigned bigint、单表时自增、步长为 1。

  • create_time 是此条数据的创建时间,数据类型为datetime 类型。

  • update_time是此条数据的最后更新时间,数据类型为 datetime 类型。

  • create_by是此条数据的创建人。

  • update_by是此条数据的最后更新人。

  • remark是此条备注信息。

除特别说明外,所有字段默认都设置不充许为空,需要设置默认值。

4 数据库安全管理

数据库系统是整个系统的核心,是所有业务管理数据以及清算数据等数据存放的中心。数据库的安全直接关系到整个系统的安全。在本系统中对此考虑如下:
数据库管理员(SA)的密码应由专人负责,密码应该定期变换。
客户端程序连接数据库的用户绝对不能使用数据库管理员的超级用户身份。
客户端程序连接数据库的用户在数据库中必须对其进行严格的权限管理,控制对数据库中每个对象的读写权限。
利用数据库的审计功能,以对用户的某些操作进行记录。
充分使用视图以及存储过程,保护基础数据表。
对于不同的应用系统应建立不同的数据库用户,分配不同的权限。

5 数据库备份管理

在系统运行过程中,经常会由于设备以及其他因素的原因,导致系统的崩溃,数据库的毁坏。为了系统数据安全,无论采用何种系统备份方案,也必须进行数据备份。在系统设计中,应建立一套有效的备份策略,建立完善的备份制度。在本系统中考虑如下:
备份方式可采用完全备份与增量备份相结合方式进行备份;
备份时间频度应结合系统的数据增量来确定,如每天一次、每周一次等;
对系统数据库也需定期备份,但备份时间可以是每月一次,但在系统表有所变化时,必须当天进行备份;
备份介质可为磁带、可擦写光盘或MO等可移动介质,绝对避免使用本机硬盘;
备份设备以及介质必须定期检查和维护,保证备份工作不能由于设备以及介质的原因而耽误;
定期对于备份的正确性和完整性进行检验;
备份工作必须由专人负责,备份介质专人保管,确保备份数据的安全;
当系统发生故障时,应及时利用备份文件,该系统恢复至最近的完整状态,并通知用户及时补充故障期间丢失的数据,直至恢复到系统发生故障前正确的状态。

6 结语

相对来说,数据库设计是一项比较复杂的工作,需要考虑的问题也比较多,当然也不是一成不变的,每个人可能从不同角度分析,会有不同的设计思路,最终还是以能够满足需求为目标。这里仅仅是做了一些比较简单的介绍,数据库设计过程中,会碰到很多问题,需要在实践中进行摸索总结。
参考资料
1) https://baijiahao.baidu.com/s?id=1708865229649682958&wfr=spider&for=pc(面对不同数据库类型,如何进行数据库选型 (baidu.com)
2) https://blog.csdn.net/qq_46138160/article/details/112168301,【阿里巴巴Java编程规范学习 五】MySQL数据库规约

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/924737.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IDEA远程开发

IDEA远程开发 前期准备 IDEA的远程开发是在本地去操昨远程服务器上的代码,所以我们先需要准备一台服务器,在此我使用vmware虚拟出ubuntu-20.04.6的Server版本,以便后面演示。 Ubuntu的Java环境配置 JDK8 sudo apt install openjdk-8-jdkmaven sudo apt instal…

NAT的配置实验

一、实验目的 学习如何配置NAT 二、预备知识: Net Address Translation:通过将内部用户的地址转换为1个公用的外部地址,然后再与外部的用户进行通信,从而既节省了IPv4地址,又实现了对内部用户的安全保护 三、实验过程: …

unity动画融合

1、抛砖引玉 在大型复杂的场景中,一定遇到过手在鼓掌,头在摇头,腿又是其他动作的要求,但是这些东西又不能做一起,因为有时候要把某个动画单独使用,这时候就用到了动画融合,利用动画状态机分层机…

taro react/vue h5 中的上传input onchange 值得区别

<inputclassNamebase-input-file-h5typefileacceptimage/*capturecameraonChange{onChangeInput} />1、taro3react 2、taro3vue3

Android12之ABuffer数据处理(三十四)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

【1267. 统计参与通信的服务器】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 这里有一幅服务器分布图&#xff0c;服务器的位置标识在 m * n 的整数矩阵网格 grid 中&#xff0c;1 表示单元格上有服务器&#xff0c;0 表示没有。 如果两台服务器位于同一行或者同一列&#xff…

docker可视化工具

安装Portainer 官方安装说明&#xff1a;https://www.portainer.io/installation/ [rootubuntu1804 ~]#docker pull portainer/portainer[rootubuntu1804 ~]#docker volume create portainer_data portainer_data [rootubuntu1804 ~]#docker run -d -p 8000:8000 -p 9000:90…

深入理解 Vue Router:构建可靠的前端路由系统

目录 01-什么是前端路由以及路由两种模式实现原理02-路由的基本搭建与嵌套路由模式03-动态路由模式与编程式路由模式04-命名路由与命名视图与路由元信息05-路由传递参数的多种方式及应用场景06-详解route对象与router对象07-路由守卫详解及应用场景 01-什么是前端路由以及路由两…

XShell 使用命令登陆主机

以root&#xff08;管理者&#xff09;身份登录主机 假设&#xff1a; root的ip&#xff1a;111.00.111.000 root的密码&#xff1a;123456 命令格式&#xff1a; ssh root(这里填ip) //接着回车&#xff0c;输入密码即可实操&#xff1a; enter回车后&#xff0c;在弹出的窗口…

基于Roop视频换脸

Roop 是一个强大的一键换脸工具&#xff0c;允许用户在视频中替换面部&#xff0c;只需要目标面部的一张图片&#xff0c;无需数据集&#xff0c;无需训练。 相对于之前的 Simswap 来说效果要好很多&#xff0c;不过需要注意的是没有授权不要商用。 文章目录 环境搭建使用方法…

使用Hydra进行密码暴力破解

Hydra是一款强大的密码暴力破解工具&#xff0c;可用于尝试使用不同的用户名和密码组合来破解各种登录系统&#xff0c;如SSH、FTP、HTTP等。 步骤&#xff1a; 选择目标&#xff1a; 首先&#xff0c;选择 要尝试破解的目标系统&#xff0c;例如SSH服务器、FTP服务器或Web应用…

Python用 tslearn 进行时间序列聚类可视化

全文链接&#xff1a;https://tecdat.cn/?p33484 我们最近在完成一些时间序列聚类任务&#xff0c;偶然发现了 tslearn 库。我很想看看启动和运行 tslearn 已内置的聚类有多简单&#xff0c;结果发现非常简单直接&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09…

python基础—python6种基本数据类型及数据类型之间转换

文章目录 一、python标准数据类型&#xff08;一&#xff09;数字类型整型&#xff1a;int浮点型&#xff1a;flaot布尔型&#xff1a;bool复数类型&#xff1a;complex &#xff08;二&#xff09;字符串&#xff08;三&#xff09;列表类型&#xff08;四&#xff09;元组类型…

cvc-complex-type.2.4.a: 发现了以元素 ‘base-extension‘ 开头的无效内容。应以 ‘{layoutlib}‘ 之一开头

不能飞的猪只是没用的猪。 —— 宫崎骏 《红猪》 常见的1种case 记录一下&#xff0c;新电脑安装android studio导入公司那些gradle还是5.5左右的工程以后&#xff0c;各种不适应。编译问题出现了。老电脑都是好好的。 cvc-complex-type.2.4.a: 发现了以元素 ‘base-extensi…

jvm的内存划分区域

jvm划分5个区域&#xff1a; java虚拟机栈、本地方法栈、堆、程序计数器、方法区。 各个区各自的作用&#xff1a; 1.本地方法栈&#xff1a;用于管理本地方法的调用&#xff0c;里面并没有我们写的代码逻辑&#xff0c;其由native修饰&#xff0c;由 C 语言实现。 2.程序计数…

生成式人工智能的潜在有害影响与未来之路(三)

产品责任法的潜在适用 背景和风险 产品责任是整个二十世纪发展起来的一个法律领域&#xff0c;旨在应对大规模生产的产品可能对社会造成的伤害。这一法律领域侧重于三个主要危害&#xff1a;设计缺陷的产品、制造缺陷的产品和营销缺陷的产品。产品责任法的特点有两个要素&…

PHPEXCEL 导出excel

$styleArray [alignment > [horizontal > Alignment::HORIZONTAL_CENTER,vertical > Alignment::VERTICAL_CENTER],];$border_style [borders > [allborders > [style > \PHPExcel_Style_Border::BORDER_THIN ,//细边框]]];$begin_date $request->beg…

一种采用KeePass+自建webdav服务的密码管理方案

一、概述 出于密码管理需求&#xff0c;查找了几种密码方案&#xff0c;发现KeePass坚果云keepass2android是大家反馈比较好的一种&#xff0c;支持电脑手机同步管理密码&#xff0c;深入使用后发现体验还不错&#xff0c;恰巧本身有公网ip&#xff0c;遂决定自建webdav服务来…

Elasticsearch 集成---框架集成SpringData-集成测试-索引操作

1.Spring Data 框架介绍 Spring Data 是一个用于简化数据库、非关系型数据库、索引库访问&#xff0c;并支持云服务的 开源框架。其主要目标是使得对数据的访问变得方便快捷&#xff0c;并支持 map-reduce 框架和云计 算数据服务。 Spring Data 可以极大的简化 JPA &a…

VR防地质灾害安全教育:增强自然灾害知识,提高自我保护意识

VR防地质灾害安全教育系统是一种虚拟仿真技术&#xff0c;可以通过虚拟现实技术模拟地震、泥石流、滑坡等地质灾害的发生和应对过程&#xff0c;帮助人们提高应对突发自然灾害的能力。这种系统的优势在于可以增强自然灾害知识&#xff0c;提高自我保护意识&#xff0c;锻炼人们…