以下哪个设计符合表设计规范

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了以下哪个设计符合表设计规范相关的知识,希望对你有一定的参考价值。

为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,必须满足一定的范式。

1.第一范式
确保每列保持原子性

列不可分
有主键
根据实际需求来定。比如某些数据库系统中需要用到“地址”这个属性,本来直接将“地址”属性设计成一个数据库表的字段就行。但是如果系统经常会访问“地址”属性中的“城市”部分,那么就非要将“地址”这个属性重新拆分为省份、城市、详细地址等多个部分进行存储,这样在对地址中某一部分操作的时候将非常方便。这样设计才算满足了数据库的第一范式
参考技术A 正确的表设计是具有可读性、易于理解和功能完备的设计。一个正确的表应该包括易于理解和记忆的标题,加上明确、精确的列名,应该使表格单元格内容简易且易于比较。此外,配色也是设计中不可忽视的因素,它可以帮助更好的展示数据的结构,将重要信息单独拿出来,并以适当的符号加以区分,这样读者就可以很容易地理解和比较数据。因此,正确的表设计能够更好地展示数据,让我们更容易地理解和分析数据。 参考技术B 一、三范式

为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,必须满足一定的范式。

1.第一范式
确保每列保持原子性

列不可分
有主键
根据实际需求来定。比如某些数据库系统中需要用到“地址”这个属性,本来直接将“地址”属性设计成一个数据库表的字段就行。但是如果系统经常会访问“地址”属性中的“城市”部分,那么就非要将“地址”这个属性重新拆分为省份、城市、详细地址等多个部分进行存储,这样在对地址中某一部分操作的时候将非常方便。这样设计才算满足了数据库的第一范式,如下表所示。

2.第二范式
确保表中的每列都和主键相关

每个表只描述一件事
主要针对联合主键而言,不存在部分依赖,每一列都跟联合主键有关系,而与联合主键中的其中一个键无关系
比如要设计一个订单信息表,因为订单中可能会有多种商品,所以要将订单编号和商品编号作为数据库表的联合主键,如下表所示。

这样就产生一个问题:这个表中是以订单编号和商品编号作为联合主键。这样在该表中商品名称、单位、商品价格等信息不与该表的联合主键相关,而仅仅是与商品编号相关。所以在这里违反了第二范式的设计原则。而如果把这个订单信息表进行拆分,把商品信息分离到另一个表中,把订单项目表也分离到另一个表中,就非常完美了。如下所示。

这样设计,在很大程度上减小了数据库的冗余。如果要获取订单的商品信息,使用商品编号到商品信息表中查询即可。

3.第三范式
确保每列都和主键列直接相关,而不是间接相关,不存在传递依赖。第三范式需要确保数据表中的,每一列数据都和主键直接相关,而不能间接相关解决间接相关,把不直接相关的再建一张表,采用外键形式将两张表关联.

比如在设计一个订单数据表的时候,可以将客户编号作为一个外键和订单表建立相应的关系。而不可以在订单表中添加关于客户其它信息(比如姓名、所属公司等)的字段,因为添加后就会出现传递依赖 :

订单编号–》客户编号, 客户编号–》客户详细信息

如下面这两个表所示的设计就是一个满足第三范式的数据库表。

这样在查询订单信息的时候,就可以使用客户编号来引用客户信息表中的记录,也不必在订单信息表中多次输入客户信息的内容,减小了数据冗余。

二、数据库表设计规范
1.表与字段的规范
(1)表达是与否概念的字段,必须使用 is _ xxx 的方式命名,数据类型是 unsigned tinyint( 1 表示是,0 表示否 ) 。

说明:任何字段如果为非负数,必须是 unsigned 。

正例:表达逻辑删除的字段名 is_deleted ,1 表示删除,0 表示未删除。

(2)表名、字段名必须使用小写字母或数字并以下划线分隔 , 禁止出现数字开头,禁止两个下划线中间只出现数字,名字要做到见名思意,不要超过32个字符。

说明:mysql 在 Windows 下不区分大小写,但在 Linux 下默认是区分大小写。

正例: aliyun _ admin , rdc _ config , level 3_ name

反例: AliyunAdmin , rdcConfig , level _3_ name

(3)小数类型为 decimal ,禁止使用 float 和 double 。

说明: float 和 double 在存储的时候,存在精度损失的问题,很可能在值的比较时,得到不正确的结果。如果存储的数据范围超过 decimal 的范围,建议将数据拆成整数和小数分开存储。

(4)表必备三字段: id 主键, gmt _ create创建时间 , gmt _ modified更新时间 。

(5)不同表之间存储相同数据的列名和列类型必须一致(关联列)

(6)优先选择符合存储需要的最小、最简单的数据类型。

选择数据类型只要遵循小而简单的原则就好,越小的数据类型通常会更快,占用更少的磁盘、内存,处理时需要的CPU周期也更少。越简单的数据类型在计算时需要更少的CPU周期,比如,整型就比字符操作代价低,因而会使用整型来存储ip地址,使用DATETIME来存储时间,而不是使用字符串。

①尽量使用数字型字段

若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。

②尽量使用位数较少的类型 ,比如能使用TINYINT/SMALLINT就不使用int,能使用无符号位就不适用有符号数据类型

③尽可能的使用 varchar/nvarchar 代替 char/nchar

因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。只有在存储的字符串长度几乎相等,使用 char 定长字符串类型。

(7)不得使用外键与级联,一切外键概念必须在应用层解决。

(8)表和字段名要加注释

(9)将字段很多的表分解成多个表

将使用频率低的字段拿出来新建一个表,完成分表,从而提高效率

(10)增加冗余字段

适当的不遵循范式的要求,对于经查查询的外表字段可以在本表中增加冗余字段。比如经常要查一个学生的系名,就可以在学生表加一个系名的字段

2.索引规范
(1)业务上具有唯一特性的字段,即使是多个字段的组合,也必须建成唯一索引。

说明:不要以为唯一索引影响了 insert 速度,这个速度损耗可以忽略,但提高查找速度是明显的 。

(2)主键索引名为 pk_ 字段名;唯一索引名为 uk _字段名 ; 普通索引名则为 idx _字段名。

(3)在 varchar 字段上建立索引时,必须指定索引长度,没必要对全字段建立索引,根据实际文本区分度决定索引长度即可。

(4)限制每张表的索引数量,建议每张表的索引数量不超过5个,并且针对复合索引,最常用的、区分度最高的(列中不同值数量/列的总行数)、字段长度小的放到最左侧

(5)索引列定义为 not null

索引null列需要额外空间保存,需要占用更多地空间,运算和比较的时候会占用更多的空间

(6)值分布稀少的字段不适合建立索引,比如性别

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/151601.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!

本文分享自作者个人站点/博客
复制
如有侵权,请联系 cloudcommunity@tencent.com 删除。

数据库SQL编程算法存储
文章来自专栏
全栈程序员必看
55.1K 篇文章220 人关注
订阅
评论 (0)
写评论
暂无人发表评论

相关文章
数据库设计实战(一):数据库设计规范「建议收藏」
将现实世界的概念数据模型设计成数据库的一种逻辑模式,即适应于某种特定数据库管理系统所支持的逻辑数据模式

MySQL数据库表设计规范
1、一般都使用 INNODB 存储引擎,除非读写比率<1%,才考虑使用 MYISAM 存储引擎;其 他存储引擎请在 DBA 的建议下使用。 2、Stored p...

mysql数据库(一):建表与新增数据建议收藏
创建数据库和表都需要用到数据库脚本语言:sql,全称是:Structured Query Language,结构化查询语言

java实现excel表格导入数据库表「建议收藏」
导入excel就是一个上传excel文件,然后获取excel文件数据,然后处理数据并插入到数据库的过程

Oracle创建表空间和表「建议收藏」
Oracle创建表同SQL Server一样,使用CREATE TABLE命令来完成。创建约束则使用如下命令:

oracle创建数据库、表空间、用户并授权「建议收藏」
在安装完Oracle数据库软件之后可以使用默认的数据库orcl,也可以根据需要创建自定义的数据库。表空间用于对数据库中的资源进行分类,每个用户都有默认的表空间,...

shardbatis实现分表「建议收藏」
Shardbatis的名称由shard(ing)+mybatis组合得到,是谷歌的一款开源软件。旨在为mybatis实现数据水平切分的功能。数据的水平切分包括多...

Oracle创建表空间「建议收藏」
此步创建的是临时表空间,可以多个数据公用一个临时表空间,注意创建的大小即可,名称随意。

mysql清空表数据_mysql数据库之如何清空表中数据「建议收藏」
本篇文章主要讲述的是在数据库中使用清空命令,具有一定学习价值,有需要的朋友可以了解一下,希望能够对你有所帮助。

Redis底层详解(一) 哈希表和字典「建议收藏」
首先简单介绍几个概念:哈希表(散列表)、映射、冲突、链地址、哈希函数。

JS乘法口诀表(一行代码)「建议收藏」
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/116143.html原文链接:https://javaforall.cn

数据库表结构设计方法及原则「建议收藏」
http://www.cnblogs.com/RunForLove/p/5693986.html

Mysql truncate 清空表数据「建议收藏」
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/138902.html原文链接:https://javaforall.cn

数据字典表设计「建议收藏」
在实际项目开发过程中常遇到下面场景:某些变量在多个地方使用,而且一般是固定的,但是随着系统升级和后期变化,可能需要改变,如果这些变量写死在代码里面将会变得难以维...

Mysql清空表中数据「建议收藏」
第一种方法 是删除表中数据且主键ID是继续顺序排下去 第二种方法 是彻底清空表中数据 把数据结构恢复至刚建表的时候 数据全部清空

菜单权限表sql语句「建议收藏」
select m.* from t_menu m where m.state = ‘1’ ...

内存数据库「建议收藏」
相对于磁盘,内存的数据读写速度要高出几个数量级,将数据保存在内存中相比从磁盘上访问可以极大地提高应用的性能。同一时候。内存数据库抛弃了磁盘数据管理的传统方式,基...

.NET控件名称缩写一览表「建议收藏」
大家好,又见面了,我是你们的朋友全栈君。标准控件 1 btn Button 2 chk CheckBox 3 ckl ...

Mysql | 数据库锁表的原因和解决方法「建议收藏」
锁表的原因: 当多个连接(数据库连接)同时对一个表的数据进行更新操作,那么速度将会越来越慢,持续一段时间后将出现数据表被锁的现象,从而影响到其它的查询及更新。...

更多文章
社区活动
社区创作者年终回顾
参与活动,赢取限量周边礼品
邀请好友加入自媒体分享计划
邀请好友,同享奖励 30 / 100 / 180 元云服务器代金券

长按识别或截图保存
关注腾讯云开发者

Copyright © 2013-2023
Tencent Cloud. All Rights Reserved.
腾讯云 版权所有

点赞
2
评论
0
目录
转到阅读清单

MaxCompute中不同类型计算任务的操作对象(输入、输出)都是表。表设计是否合理将影响存储和计算的性能,进而影响到存储和计算的计费。
声明
本文中介绍的非功能性规范均为建议性规范,产品功能无限制,仅供参考。
表设计主要目标
降低存储成本
合理的表设计可以降低数据分层设计上的冗余存储,减少中间表的数据量大小。对表数据的生命周期进行正确地管理,也能够直接降低存储的数据量及存储成本。
降低计算成本
规范化的表设计可以帮助您优化数据的读取,从而减少计算过程中的冗余读写和计算,提升计算性能,降低计算成本。
降低维护成本
规范化的表分层设计能够直接体现业务的特点。例如,在规范化设计表的同时对数据通道中的数据采集方式进行优化,可以减少分布式系统中小文件的问题,降低表和分区的维护数量。
表设计主要影响
表设计影响的操作有:创建表、导入数据、更新表、删除表及管理表。
其中,导入数据场景按照实时数据采集和离线导入批量数据的方式分为如下三种:
导入立即查询与计算。导入后立即查询与计算,需要考虑每次导入的数据量,减少流式小量数据导入。
多次导入并定时查询与计算。
导入后生成中间表进行计算。
合理的表设计和数据集成周期管理能够降低数据在存储期间的成本。不合理的数据导入及存储(小文件)会影响整体的存储性能、计算性能、运维稳定性。MaxCompute优先按照业务逻辑对批量数据进行计算,例如,按照分区进行计算。
表设计步骤
确定所属项目空间,依据业务过程规划表类型,分析数据层次。
定义表描述,进行权限定义与Owner定义。
依据数据量、数据集成特点定义分区表或非分区表。
定义字段或分区字段。
创建表和转换表。
明确导入数据场景的相关因素(包括批量数据写入、流式数据写入、周期性条式数据插入)。
定义表和分区的生命周期。
说明
创建完表后,您可以根据业务变化修改表的Schema。例如,设置生命周期RangeClustering。
在表设计阶段,需要特别注意区分数据的场景(批量数据写入、流式数据写入、周期性条式数据插入)。
合理使用非分区表和分区表。建议采用分区表来设计日志表、事实表和原始采集表等,并按照时间进行分区。
注意表和分区的限制条件。
表数据存储规范
按数据层规划数据的生命周期:
源表ODS层:每天从业务系统同步过来的数据,全部保留,生命周期定义永久保存。当下游数据受损时,可以从ODS恢复数据。若ODS每天同步过来的是全量表,则可以通过全表拉链的方式来压缩存储。
数据仓库(基础)层:至少保留一份完整的全量数据(不必像ODS那样存储冗余的全量表)。您可以通过拆表或者做分区来提升性能。
数据集市层:数据将被按需保留1~3年。数据集市的数据比较容易生成,所以无需保留久远的历史数据。
按数据变更规划数据的保存方式:
记录客户属性、产品属性的历史变化情况,以便追溯某个时点的值。
在事实表里冗余维表的字段,即把事件发生时的各种维度属性值与该事件绑定起来。使用者无需关联多张表就可以使用数据。此方式仅可应用于数据应用层。
任意用拉链表或者日快照的形式,记录维表的变化情况。这使得数据结构变得灵活、易于扩展,数据一致性得到了增强,数据加工者可以更加方便地管理数据。此方式仅可应用于数据基础层。
数据导入通道与表设计
通道类型有以下几种:
DataHub
规划写入的分区与写入流量之间的关系。数据达到64 MB会执行1次Commit。
数据集成或DataX
规划写入表分区的频率。数据达到64 MB会执行1次Commit,以免Commit空目录。
DTS
规划写入的表存量分区与增量分区的关系。设置Commit频率。
客户端(Run SQL or Tunnel upload)
需要避免高频小数据量文件的插入或者上传。
SDK
SDK执行INSERT INTO语句,数据上传至表或者分区后,使用MERGE语句整理小文件。
说明
MaxCompute导入数据的通道只能是Tunnel SDK或执行INSERT INTO语句,请避免流式插入数据。
以上各通道本身均由自身逻辑进行流式数据写入、批量数据写入和周期调度写入。
当使用数据通道写入表或分区时,需将1次写入的数据量控制在合理范围,例如,64 MB以上。
分区设计与存储逻辑
一张表里有很多个一级分区,每个一级分区都会按时间存储二级分区,每个二级分区都会存储所有的列,如下图所示。分区设计需要注意:
设置分区的数量上限。
避免每个分区中只存少量数据。
以方便数据查询和计算为前提设置分区列。
避免每个分区中出现多次数据写入。
表和分区设计的基本规则
所有的表和字段名要使用统一的命名规范。命名要求如下:
能区分该表的业务类型。
能区分该表是事实表、维度表、日志表或极限存储表。
能区分该表的实体信息。
不同表中具有相同业务含义的字段要定义成统一的数据类型,避免不必要的类型转换。
分区设计及使用规则如下:
支持新增分区,不支持新增分区字段。
单表支持的分区数量上限为6万个。
对于多级分区的表,如果想添加新的分区,则必须指明全部的分区值。
不支持修改分区列的列名,只能修改分区列对应的值。修改多级分区的一个或者多个分区值时,多级分区的每一级的分区值都必须写上。
分区设计
在计算的时候可以使用分区裁剪是分区的优势。分区设计需要关注如下内容:
分区字段和普通字段选择
通过分区字段,您可以划分数据扫描范围,更加方便地管理数据。
您可以在创建表时设置普通字段和分区字段。普通字段可以被理解为数据文件的数据,而分区字段可以被理解为文件系统的目录。表的存储空间主要是普通字段占用的空间。设置分区字段时,您可以从数据管理和数据扫描方面考虑,来选择对应的字段。不具备规律、类型数量大于10000且不经常作为查询条件的字段,应该被设置成普通字段。
分区列虽不直接存储数据,但如同文件系统里的目录,可以方便您管理数据。例如,在计算时如果指定具体的分区,则计算过程中只需查询对应分区,从而减少计算输入量。
分区表的分区列级数不能超过6级,即底层存储数据的目录层数不能超过6层。因此应为分区表设置合适的生命周期。当部分数据的生命周期与其它数据不同时,您可以通过细粒度分区实现对部分数据的管理。
分区字段定义依据
按优先级高低排序如下:
分区列的选择应充分考虑时间因素,尽量避免更新存量分区。
如果有多个事实表(不包括维度表)进行JOIN,应将作为查询条件的字段置为分区列。
选择GROUP BY或DISTINCT包含的列作为分区列。
选择值分布均匀的列,而不要选择数据倾斜的列作为分区列。
常用SQL语句中如果包含某列的等值或IN的查询条件,则选择该列作为分区列。
select … from table where id=123 and ….;
分区个数定义依据
时间分区
建议按天或月进行分区。如果按小时进行分区,则二级分区的平均数量不应超过8个。
地域分区
如果对省、市、县进行分区,则应考虑进行多级分区。23个省,5个自治区,4个直辖市,2个特别行政区,50个地区(州、盟),661个市(其中直辖市4个、地级市283个、县级市374个),1636个县(自治县、旗、自治旗、特区和林区),按照最细粒度县进行分区后,不应再按照更细粒度的小时进行分区。
单分区与多级分区
在单分区下,建议每次写入的数据量不超过64 MB。如果为多级分区,则需保证每个最细粒度级分区下的二级分区数据都遵循单分区个数规则。
单表分区
单表分区数(包括下级分区)不能超过6万。
分区数量和数据量建议
建议单个分区中的数据量不要太大。
应尽量避免分区数据倾斜,避免单个表不同分区的数据量差异超过100万。
分区设计时应合理规划分区个数,较细粒度的分区在跨分区扫描时会影响SQL的执行性能。
单个分区中数据量较大的情况下,MaxCompute执行任务时会进行分片处理而不影响分区裁剪的优势。
单个分区中文件数较多时,会影响MaxCompute Instance数量,造成资源浪费和SQL性能的下降。
采用多级分区时,建议先按日期分区,然后按交易类型分区。
多种交易类型混合的表,建议您拆表,一种交易类型独立成一张表,然后每张表按日期分区。
维度表不进行分区。
反馈
上一篇:表概述
下一篇:表设计最佳实践
文档推荐
云原生大数据计算服务 MaxCompute-表操作
通用数据上传场景与工具
什么是MaxCompute
常见问题
SQL脚本模式
分区和列操作
MaxCompute湖仓一体
更多
热门产品
新人特惠专场云服务器轻量应用服务器网站建设对象存储关系型数据库短信服务
关于我们
关注我们:
新浪微博
售前咨询:95187转1
©2023 Aliyun All rights reserved

创表语句转实体类


为何规范化开发

对于一些企业级别的开发来说,开发必须规范,因为表太多了,相关的关联关系错综复杂。不规范将难以维护。

如何规范化开发

1.规范的接口设计。第一要符合rest,第二要命名规范优雅,第三要单一职责,第四要可扩展性,第五要文档描述清晰


2.规范的代码风格,比如命名的各种规范,属性,方法的命名规范,总之要符合开发要求


3.规范的表设计,由于表比较多,字段复杂,表之间的关联也很多,那么就要使用powerdesigner等uml来设计表,这样的话可以完整的保留表之间的关系。

一些小工具

  我是做erp开发的,所以遇见了一些比较大的表,一个表光字段就有60多个,而且一个功能有很多表相互关联,我只能使用powerdesigner这样的UML来设计表,设计完表之后,powerdesigner之类的会提供sql语句来创建表,但是最后的实体类就要我们来自己写,一想要写这么多字段,就很绝望,于是我在周末设计了一个小工具来帮助我开发。


  这个工具类可以帮助我们利用创表语句创建出基本的实体类,包含了注解,以及注释,至于get,set方法就交给IDE来创建了。


  下面是我的gitbub链接。


  点我一下就到了

 
  如果对这个小工具这个有好的建议,可以发我邮箱一起研究改进下。[email protected]






















以上是关于以下哪个设计符合表设计规范的主要内容,如果未能解决你的问题,请参考以下文章

创表语句转实体类

大厂通用的MySQL开发规范设计,包括“存储引擎字符集 命名规则等公共约定”,“表设计约定”,“字段设计约定”,“索引设计约定”,“SQL约定”,“开发人员行为约定”

架构之路数据库基础- 设计的等级规范化

MySQL设计规范

[设计]GUI设计规范的规范

MaxCompute 表(Table)设计规范