数据处理: 如何设计数据?(反)规范化小结

1 规范化设计

设计合理的数据库使您可以访问最新、准确的信息。因为正确的设计对于实现使用数据库的目标至关重要。

一个基本原则是,减少重复冗余的数据,虽然现代很多数据表设计不得不设置冗余信息。

另一个基本原则是,保证数据的正确性和完整性以及可扩展。 如果数据被保存得不正确,那么从这里提取的信息将是无用的信息。

2 关系数据库定义

规范五个范式:1NF,2NF,3NF,4NF,5NF

常用的前三个定义

1NF 若关系模式 R 的每一个分量是不可再分的数据项,则关系模式 R属于第一范式

2NF 若关系模式 REINF,且每一个非主属性完全依赖主键时,则关系式R是第二范式

3NF 即当2NF 消除了非主属性对码 (候选键) 的传递函数依赖,则称为 3NF

主键(PrimaryKey):或称主键,若一个关系有多个候选码,则选定其中一个作为主码

外键(Foreign Key):如果关系模式R中的属性或属性组不是该关系的键,但它是其他 关系的码,那么该属性集对关系模式R而言是外键。

主属性(Prime Attribute):包含在任何候选码中的属性称为主属性。不包含在任何候选 码中的属性称为非主属性(Non-Prime Attribute)。

目或度(Degree);目或度指的是一个关系中属性的个数。

候选键:不含有多余属性的超键称为 候选键,是超键的最小子集。例如:学号,身份证号

函数依赖定义: 设R(U)是属性U的关系模式,X,Y是U的子集,对于R(U)的任意一个可能的关系r,r的任意两个元组在X上属性值相等,那么在Y上的属性值也相等,称"X函数确定Y" 或Y函数依赖X,记为 X->Y. X称为这个函数依赖的决定属性组,也称为决定因素。

2 反规范化设计

方法

markdown 复制代码
    增加冗余列

增加冗余列是指在多个表中具有相同的列,它常用来在查询时避免连接操作。

markdown 复制代码
    增加派生列
     

增加派生列指增加的列可以通过表中其他数据计算生成。 \n它的作用是在查询时减少计算量,从而加快查询速度。

markdown 复制代码
    重新组表
    

重新组表指如果许多用户需要查看两个表连接出来的结果数据,则把这两个表重新组成一个表来减少连接而提高性能。

markdown 复制代码
    水平分割
   

按记录进行分割,把数据放到多个独立的表中,主要用于表数据规模很大、表中数据相对独立或数据需要存放到多个介质上时使用:范围,列表,哈希。

markdown 复制代码
    垂直分割

对表进行分割,将主键与部分列放到一个表中,主键与其它列放到另一个表中, 在查询时减少 I/0 次:冷,热列拆表。

保障数据一致性方式:

markdown 复制代码
    触发器
    事务机制保证
    应用保证
    批处理脚本

反规范化优缺点:

优点:避免进行表之间连接操作,可以提高数据操作的性能 缺点:数据重复存储,浪费磁盘空间。可能导致数据不一致

3 数据设计步骤

一个基本的步骤如下:

复制代码
1 确定数据库的用途    

这有助于您为其余步骤做好准备。

复制代码
2 查找和组织所需信息    

收集您可能希望在数据库中记录的所有类型的信息,例如产品名称和订单号。

复制代码
3 将信息划分为表格    

将您的信息项划分为主要实体或主题,例如产品或订单。然后,每个主题都变成一个表。

复制代码
4 将信息项转换为列    

确定要在每个表中存储哪些信息。每个项目都将成为字段,并在表中显示为一列。例如,"雇员"表可能包含"姓氏"和"雇用日期"等字段。

复制代码
5 指定主键    

选择每个表的主键。主键是用于唯一标识每一行的列。例如,产品 ID 或订单 ID。

复制代码
6 设置表关系    

查看每个表,并确定一个表中的数据与其他表中的数据之间的关系。根据需要向表添加字段或创建新表以阐明关系。

复制代码
7 优化您的设计    

分析您的设计是否存在错误。创建表并添加一些示例数据记录。看看你是否能从你的表格中获得你想要的结果。根据需要对设计进行调整。

复制代码
8 应用规范化规则    

应用数据规范化规则以查看表的结构是否正确。根据需要对表进行调整.

小结

关于关系型数据库的经典设计工具可见此文 juejin.cn/post/727778... 规范化设计 juejin.cn/post/727779...

相关推荐
小乌龟不会飞1 小时前
Ubuntu 安装 etcd 与 etcd-cpp-apiv3
数据库·etcd
程序员张32 小时前
SpringBoot计时一次请求耗时
java·spring boot·后端
程序员岳焱8 小时前
Java 与 MySQL 性能优化:Java 实现百万数据分批次插入的最佳实践
后端·mysql·性能优化
计算机毕设定制辅导-无忧学长8 小时前
西门子 PLC 与 Modbus 集成:S7-1500 RTU/TCP 配置指南(一)
服务器·数据库·tcp/ip
麦兜*8 小时前
Spring Boot启动优化7板斧(延迟初始化、组件扫描精准打击、JVM参数调优):砍掉70%启动时间的魔鬼实践
java·jvm·spring boot·后端·spring·spring cloud·系统架构
大只鹅9 小时前
解决 Spring Boot 对 Elasticsearch 字段没有小驼峰映射的问题
spring boot·后端·elasticsearch
ai小鬼头9 小时前
AIStarter如何快速部署Stable Diffusion?**新手也能轻松上手的AI绘图
前端·后端·github
程序员柳9 小时前
基于微信小程序的校园二手交易平台、微信小程序校园二手商城源代码+数据库+使用说明,layui+微信小程序+Spring Boot
数据库·微信小程序·layui
梦在深巷、9 小时前
MySQL/MariaDB数据库主从复制之基于二进制日志的方式
linux·数据库·mysql·mariadb
IT乌鸦坐飞机9 小时前
ansible部署数据库服务随机启动并创建用户和设置用户有完全权限
数据库·ansible·centos7