当前位置: 首页 > news >正文

数据设计规范

目录

一、数据库设计的原则

二、表设计原则

三、其他设计规范

四、最佳实践


数据库设计(Database Design)是指对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,使之能够有效地存储数据,满足各种用户的应用需求(信息要求和处理要求)。以下是一些关键的数据库设计规范:

一、数据库设计的原则

  1. 数据独立性:数据与应用程序相互独立,改变数据存储结构或访问方法不影响应用程序。数据独立性分为逻辑数据独立性和物理数据独立性。逻辑数据独立性指数据库的逻辑结构改变不影响应用程序,物理数据独立性指数据在物理存储介质上的变化不影响数据库的逻辑结构。实现数据独立性的方法包括使用抽象层次、数据模型和视图。
  2. 数据完整性:数据的准确性和一致性。它包括实体完整性、参照完整性和域完整性。实体完整性要求每个表中的每一行都必须是唯一的,通常通过主键来实现。参照完整性要求外键值必须在参考表中存在,以确保数据的一致性。域完整性确保每列的数据类型、格式和范围的一致性。实现数据完整性的方法有使用约束(如主键、外键、唯一性约束)、触发器和存储过程。
  3. 数据一致性:多个用户同时访问和修改数据库时,数据保持一致的状态。数据一致性通常通过事务管理来实现。事务是一个逻辑操作单元,包含一个或多个SQL语句,具有原子性、一致性、隔离性和持久性(ACID属性)。
  4. 数据冗余最小化:在数据库设计中尽量减少数据的重复存储。过多的冗余数据不仅浪费存储空间,还容易导致数据的不一致。减少数据冗余的方法有规范化和数据库分区。
  5. 数据安全性:通过身份验证、访问控制和数据加密等方法保护数据的安全性,防止数据泄露和篡改。
  6. 性能优化:提高数据库的访问速度和处理能力。常见的性能优化方法有索引优化、查询优化和存储优化。

二、表设计原则

  1. 规范化与反规范化

    • 规范化:优点是减少了数据冗余,节约了存储空间,相应逻辑和物理的I/O次数减少,同时加快了增、删、改的速度。但是一个完全规范化的设计并不总能生成最优的性能,因为对数据库查询通常需要更多的连接操作,从而影响到查询的速度,而且范式越高性能就会越差。
    • 反规范化:为了提高某些查询或应用的性能,可以破坏规范规则。数据应当按两种类别进行组织,即频繁访问的数据和频繁修改的数据。对于频繁访问但是不频繁修改的数据,内部设计应当物理不规范化。对于频繁修改但并不频繁访问的数据,内部设计应当物理规范化。
  2. 数据表分类

    • 基本数据表:描述业务实体的基本信息,如人员基本信息、单位基本信息等。
    • 标准编码表:描述属性的列表值,如职称、民族、状态等。
    • 业务数据表:记录业务发生的过程和结果,如人员调动登记、变更通知单等。
    • 系统信息表:存放与系统操作、业务控制有关的参数,如用户信息、权限、用户配置信息等。
    • 统计数据表:存放业务数据统计值,如通知单统计、人员类别统计等。
    • 临时处理表:存放业务处理过程中的中间结果。
    • 其他类型表:存放应用层的日志、消息记录等。
  3. 字段设计

    • 应该使用能正确存储和表示数据的最小类型。如果不确定需要什么数据类型,则选择不会超出范围的最小类型。
    • 选择更简单的数据类型,例如比较整数的代价小于比较字符,因为字符集和排序规则使字符比较更复杂。
    • 尽可能把字段定义为NOT NULL。对于字段能否为NULL,应该在SQL建表脚本中明确指明,不应使用缺省。
    • 一个表中的字段不要太多,理论上不要超过80个。
    • 数据库中所有布尔型中数值0表示为假,数值1表示为真。
    • 当字段定义为字符串类型时使用VARCHAR2而不用NVARCHAR。
    • 字段尽可能有默认值,字符型的默认值为一个空字符值串,数字型的默认值为数值0。
  4. 键和索引设计

    • 为关联字段创建外键。
    • 所有的键都必须唯一。
    • 尽可能避免使用复合键。
    • 外键总是关联唯一的键字段。
    • 尽可能使用系统生成(如序列SEQUENCE产生)的主键。
    • 可选键有时可做主键。
    • 一个表中组合主键的字段个数尽可能少。
    • 如果一列出现在表达式或函数中,不会使用该列上的索引。
    • 要索引外键。
    • 对于索引选择性高的列使用B-Tree索引。
    • 对于索引选择性低的列使用位图索引。
    • HASH索引只适用于相等比较。
    • 不要索引大型字段(有很多字符的字段)。
    • 不要索引常用的小型表。如无特别需要,避免使用大字段(BLOB、CLOB、LONG等)。如使用时必须使用BLOB或CLOB类型。

三、其他设计规范

  1. 采用数据库系统实现数据的完整性:这不但包括通过标准化实现的完整性,而且还包括数据的功能性。在写数据的时候还可以增加触发器来保证数据的正确性。不要依赖于应用程序保证数据完整性,它不能保证表之间(外键)的完整性。每个表要求有主键,主键字段或组合字段必须满足非空属性和唯一性要求。

  2. 视图设计:为了在数据库和应用程序之间提供另一层抽象,可以为应用程序建立专门的视图而不必非要应用程序直接访问表。这样做还在处理数据库变更时提供了更多的自由。

    • 为简化查询,将复杂的检索或子查询通过视图实现。
    • 提高数据的安全性,只将需要查看的数据信息显示给权限有限的人员。
    • 视图中如果嵌套使用视图,级数不要超过3级。
    • 对于数据量较大或随时间的推移逐渐增多的表,不宜使用视图,可以采用实体化视图代替。
    • 除特殊需要,避免类似“SELECT * FROM [TableName]”而没有检索条件的视图。
    • 视图中尽量避免出现数据排序的SQL语句。
  3. 命名规范

    • 所有命名采用26个英文大小写字母和0~9这十个自然数,加上下划线_组成,不能出现其他字符(注释除外)。
    • 长度不超过30个字符。
    • 实际名字尽量描述实体的内容,由英文单词、单词组合或单词缩写组成,不以数字和_开头。
    • 命名中禁止使用SQL关键字。
    • 对象名尽量短。表以单数形式名词或名词短语命名。如果表名仅有一个单词,那么建议不使用缩写,而是用完整的单词。数据表t_inf_<系统标识>_<表标识>,编码表t_cod_<系统标识>_<表标识>,系统表t_sys_<系统标识>_<表标识>,统计表t_sta_<系统标识>_<表标识>,临时表t_tmp_<系统标识>_<表标识>,日志表t_log_<系统标识>_<表标识>。
    • 采用有意义的字段名,应该是易于理解、能表达字段功能的英文单词或单词缩写,一般不超过三个英文单词。
    • 系统中所有属于内码的字段(仅用于表示唯一性和程序内部用到的标识性字段),名称取为ID。
    • 系统中属于业务范围内的编号的字段,其代表一定的业务信息,这样的字段建议命名为CODE,其数据类型为VARCHAR,该字段需加唯一索引。
    • 不要在列的名称中包含数据类型。主键PK_<表名>,外键FK_<表名>_<主表名>_<外键字段名>。如果复合索引的构成字段较多,则只包含第一个字段,并添加序号。视图V_<系统标识>_<视图标识>,存储过程SP_<系统标识>_<存储过程标识>,函数F_<系统标识>_<函数标识>,触发器TR_<表名>_<i、u、d的任意组合>,用户定义数据类型UD_<自定义数据类型标识>,序列SEQ_<序列标识>,局部变量L_<变量标识>,全局变量G_<变量标识>,游标变量L_CUR_<变量标识>或G_CUR_<变量标识>,存储过程或函数定义中的参数(IN型参数P_<参数标识>,OUT型参数R_<参数标识>,函数返回值R_<变量标识>)。
  4. 安全性设计:在生产环境中,必须严格管理SYS和SYSTEM用户,必须修改其默认密码,禁止用该用户建立应用数据库对象。删除或锁定SCOTT等默认安装但不使用的用户。

四、最佳实践

  1. 考量所有相关利益者:在构建数据库之前,先去收集信息,了解他们对数据库的期望以及对数据库的操作熟练度。这样就能得出数据库应当采用的技术水平,以及是否要就数据库的功能来训练用户。
  2. 选择正确的数据库类型:数据库有多种类型,选择正确类型则是数据库设计的关键。可以将数据库以两种方式分类,一是基于数据库用以定义和操作数据的查询语言,二是基于数据模型。研究数据库的不同类型,并针对应用需求作出选择,是必要的初始步骤。
  3. 文档化:文档化对于良好的数据库设计至关重要,可以追踪所有的小细节。数据库设计应当附有指示说明、ER图、存储过程及所有其他相关的信息。文档还应当为编程者和终端用户提供足够信息量,确保他们能够理解并使用。
  4. 考虑隐私和安全性:为了获得最大程度的安全性,应当对密码加密,使用身份验证来限制数据库的访问,

相关文章:

数据设计规范

目录 一、数据库设计的原则 二、表设计原则 三、其他设计规范 四、最佳实践 数据库设计&#xff08;Database Design&#xff09;是指对于一个给定的应用环境&#xff0c;构造最优的数据库模式&#xff0c;建立数据库及其应用系统&#xff0c;使之能够有效地存储数据&#…...

基于SpringBoot的宠物寄养系统的设计与实现(源码+SQL+LW+部署讲解)

文章目录 摘 要1. 第1章 选题背景及研究意义1.1 选题背景1.2 研究意义1.3 论文结构安排 2. 第2章 相关开发技术2.1 前端技术2.2 后端技术2.3 数据库技术 3. 第3章 可行性及需求分析3.1 可行性分析3.2 系统需求分析 4. 第4章 系统概要设计4.1 系统功能模块设计4.2 数据库设计 5.…...

深度学习中的HTTP:从请求到响应的计算机网络交互

在现代深度学习应用中&#xff0c;HTTP&#xff08;超文本传输协议&#xff09;不仅仅是网页浏览的基础协议&#xff0c;它也在机器学习和人工智能的服务架构中扮演着至关重要的角色。本文将深入探讨HTTP在深度学习中的应用&#xff0c;并阐明它如何支持模型的训练、推理及API服…...

Agent系列:AppAgent v2-屏幕智能Agent(详解版)

引言 简介 方法 Agent 框架 Agent 交互 探索阶段 部署阶段 文档生成 高级功能 实验结果 总结 局限性 未来工作 1. 引言 大语言模型&#xff08;LLM&#xff09;如 ChatGPT 和 GPT-4 显著提升了自然语言处理能力&#xff0c;并且推动了智能体在自主决策中的应用。…...

艾体宝方案丨全面提升API安全:AccuKnox 接口漏洞预防与修复

一、API 安全&#xff1a;现代企业的必修课 在现代技术生态中&#xff0c;应用程序编程接口&#xff08;API&#xff09;扮演着不可或缺的角色。从数据共享到跨平台集成&#xff0c;API 成为连接企业系统与外部服务的桥梁。然而&#xff0c;伴随云计算的普及与微服务架构的流行…...

开源的Vue低代码表单设计器 form-create-designer v3.2.9 版本发布,新增10多种功能

form-create-designer 是一款开源的低代码表单设计器&#xff0c;通过数据驱动表单渲染。可以通过拖拽的方式快速创建表单&#xff0c;提高开发者对表单的开发效率&#xff0c;节省开发者的时间。并广泛应用于在政务系统、OA系统、ERP系统、电商系统、流程管理等领域。 项目采…...

Android Killer 无法调用jd-gui.exe

在Android Killer 时&#xff0c;点击图标转换为java代码时&#xff0c;调用jd-gui.exe 弹窗无法验证发布者&#xff0c;点击运行没反应 第一种方案&#xff1a;开启组策略&#xff08;网上找的&#xff0c;没有效果&#xff09; 键盘WinR &#xff0c;在弹出窗口中输入gped…...

24.01.01 MyBatis

对sql拆分简化之后,更适合使用MyBatisPlus 搭建项目 引入依赖 <!--Mysql 驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!--Druid数据库连接池--><dependenc…...

游戏引擎学习第70天

这一节没讲什么主要是关于接下来要干的任务 开发过程概览 我们正在进行最后的总结&#xff0c;并计划接下来的步骤。目前的目标是创建一个包含所有必要组件的游戏引擎原型版本&#xff0c;目的是让这些部分能够协同工作并展现预期效果。通过这一过程&#xff0c;可以实验和探…...

深入理解 Spring Cloud 中的 Eureka、Ribbon 和 Feign

1.eureka自我保护机制是什么? Eureka的自我保护机制是一种针对网络异常情况的安全保护措施&#xff0c;旨在防止因为网络问题导致的服务注册中心&#xff08;Eureka Server&#xff09;与微服务实例之间的通信故障。当网络分区或其他形式的网络故障发生时&#xff0c;即使微服…...

DVWA靶场Brute Force (暴力破解) 漏洞low(低),medium(中等),high(高),impossible(不可能的)所有级别通关教程

目录 暴力破解low方法1方法2 mediumhighimpossible 暴力破解 暴力破解是一种尝试通过穷尽所有可能的选项来获取密码、密钥或其他安全凭证的攻击方法。它是一种简单但通常无效率的破解技术&#xff0c;适用于密码强度较弱的环境或当攻击者没有其他信息可供利用时。暴力破解的基…...

山高路陡,无人机代替滑轨吊运物资极大提高做作业效率降低成本

在山高路陡的地区&#xff0c;无人机代替传统的滑轨吊运物资&#xff0c;极大地提高了作业效率并降低了成本。以下是对这一现象的详细分析&#xff1a; 一、无人机吊运的优势 1. 提高作业效率&#xff1a; 无人机能够快速响应并执行吊运任务&#xff0c;尤其在高山、陡峭或交…...

数据的高级处理——pandas模块进阶——数据的统计运算

今天的学习用有好几处与书上的内容有出入&#xff0c;不只是因为pycharm中函数更新、弃用的问题&#xff0c;还是作者有些疏忽。不过影响不大&#xff0c;运行报错&#xff0c;GPT分析一下&#xff0c;原因很简单。这里不进行详细书名&#xff0c;在下边的代码上已经进行详细的…...

【Leetcode】3280. 将日期转换为二进制表示

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接&#x1f517; 给你一个字符串 date&#xff0c;它的格式为 yyyy-mm-dd&#xff0c;表示一个公历日期。 date 可以重写为二进制表示&#xff0c;只需要将年、月、日分别转换为对应的二进制表示&a…...

Vue3 中自定义hook

什么是hook&#xff1f;—— 本质是一个函数&#xff0c;把setup函数中使用的Composition API进行了封装&#xff0c;类似于vue2.x中的mixin。 自定义hook的优势&#xff1a;复用代码, 让setup中的逻辑更清楚易懂。 场景需求&#xff1a;现在我需要获取当前鼠标所点击的地方的…...

嵌入式系统 第七讲 ARM-Linux内核

• 7.1 ARM-Linux内核简介 • 内核&#xff1a;是一个操作系统的核心。是基于硬件的第一层软件扩充&#xff0c; 提供操作系统的最基本的功能&#xff0c;是操作系统工作的基础&#xff0c;它负责管理系统的进程、内存、设备驱动程序、文件和网络系统&#xff0c; 决定着系统的…...

音视频入门基础:MPEG2-PS专题(2)——使用FFmpeg命令生成ps文件

一、错误的命令 通过FFmpeg命令可以将mp4文件转换为ps文件&#xff0c;PS文件中包含PS流数据。 由于PS流/PS文件对应的FFInputFormat结构为&#xff1a; const FFInputFormat ff_mpegps_demuxer {.p.name "mpeg",.p.long_name NULL_IF_CONFIG_SMALL…...

Embedding

Embedding 在机器学习中&#xff0c;Embedding 主要是指将离散的高维数据&#xff08;如文字、图片、音频&#xff09;映射到低纬度的连续向量空间。这个过程会生成由实数构成的向量&#xff0c;用于捕捉原始数据的潜在关系和结构。 Text Embedding工作原理 词向量化&#x…...

Android Studio学习笔记

01-课程前面的话 02-Android 发展历程 03-Android 开发机器配置要求 04-Android Studio与SDK下载安装 05-创建工程与创建模拟器...

Git的使用流程(详细教程)

目录 01.Git是什么&#xff1f; 1.1 Git简介 1.2 SVN与Git的最主要的区别 1.3 GIt主要特点 02.Git是干什么的&#xff1f; 2.1.Git概念汇总 2.2 工作区/暂存区/仓库 2.3 Git使用流程 03.Git的安装配置 3.1 Git的配置文件 3.2 配置-初始化用户 3.3 Git可视化…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...