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

数据库设计军规

1.表名字

1.1.建表的时候,给表起个好名字。要做到见名知意,言简意赅,能够提高沟通和维护成本。

1.2.名字用小写字母+下划线,更容易让人读懂。全部大写,看起来有点不太直观。大小写混着用,就很不爽了。

1.3.表名,在言简意赅,见名知意的基础之上,建议带上业务前缀。例如,系统相关加上前缀“sys_”,产品相关加前缀“product_”。好处是方便归类,相同业务的表聚集到一起。

2.字段名字

2.1.字段名字,也要做到言简意赅,见名知意。使用名字用小写字母+下划线。

2.2.主键:一定要创建主键。因为主键自带了主键索引,相比于其他索引,主键索引的查询效率最高,因为它不需要回表。在单个数据库中,主键可以通过AUTO_INCREMENT,设置成自动增长的。或者UUID。但在分布式数据库中,分库分表的业务库中,主键由外部算法(比如:雪花算法)生成,它能够保证生成的id是全局唯一的。

2.3.外键:一般不用物理外键,因为耦合性强,建议使用逻辑外键。如果使用另一个表的主键,字段定义为:前缀是另一张表名称+“id”

2.4.表中一般有很多公共字段,可以使用全局统一的命名规则,定义成相同的名称。创建时间:create_time,创建人:create_by_id,修改时间:update_time修改人:update_time_id,删除状态标记delete_status或者delete_flag。

2.5.字段个数。一定要对字段个数做一些限制。建议每表的字段个数,不要超过二三十个左右。如果有几十个,甚至一百多个字段,当表中保存的数据非常大,查询效率降。

2.6.字段类型 时间格式的数据有:date、datetime和timestamp等等可以选择。字符类型的数据有:varchar、char、text等可以选择。数字类型的数据有:int、bigint、smallint、tinyint等可以选择。尽可能选择占用存储空间小的字段类型。如果字符串长度固定,或者差别不大,可以选择char类型。如果字符串长度差别较大,可以选择varchar类型。是否字段,可以选择bit类型。枚举字段,可以选择tinyint类型。主键字段,可以选择bigint类型。金额字段,可以选择decimal类型浮点数的:decimal(m,n)。时间字段,可以选择timestamp或datetime类型。

2.7.字段默认值。字段可选择该是否允许为NULL。应该尽可能明确该字段NOT NULL。并且字段设置默认值。主要以innodb存储引擎为例主要有以下原因:在innodb中,需要额外的空间存储null值,需要占用更多的空间。null值可能会导致索引失效。null值只能用is null或者is not null判断,用=号判断永远返回false。因此,建议我们在定义字段时,能定义成NOT NULL,就定义成NOT NULL。

2.8.冗余字段。为了性能考虑,提升查询速度,有时可以冗余一些字段。减少连表查询次数。

3.索引

3.1.索引有很多种,包括:主键、普通索引、唯一索引、联合索引等。主键只有一个,一般使用:id或者no命名。普通索引和联合索引,使indx结尾。唯一索引,加un_前缀,比如:un_order_indx。

3.2.索引字段不能建的太多,因为索引需要额外的存储空间,会影响保存数据的效率。

3.3.在创建联合索引的时候,需要注意最左匹配原则,不然,联合索引效率可能失效。

3.4.数据重复率非常高的字段,比如:状态,不建议单独创建普通索引。因为即使加了索引,可能会导致索引失效。还会走全表扫描。

3.5.唯一索引,是为了保证数据的唯一性。单个字段加唯一索引,多个字段加联合的唯一索引。但如果是联合唯一索引的值出现null时,则唯一性约束可能会失效。

4.注释

4.1.做表设计,把表和相关字段的注释加好。对于状态字段,可列举状态类型。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C++ const、constexpr与consteval作用与区别
  • R 语言学习教程,从入门到精通,R的安装与环境的配置(3)
  • 信号相关函数
  • Python | Leetcode Python题解之第318题最大单词长度乘积
  • 药店管理小程序的设计
  • 半导体芯闻--20240804
  • c++ malloc 过大或者0
  • ESP32人脸识别开发- 基础介绍(一)
  • MySQL-InnoDB引擎
  • 图论① dfs | Java | LeetCode 797,Kama 98 邻接表实现(未完成)
  • 自动气象站:高度自动化、智能化和精准化
  • Ubuntu配置Ngbatis学习环境
  • C++适配器
  • golang国内proxy设置
  • 【每日一题】【枚举】【估计时间复杂度】[蓝桥杯 2024 省 B] 好数 C++
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • [Vue CLI 3] 配置解析之 css.extract
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • Akka系列(七):Actor持久化之Akka persistence
  • AWS实战 - 利用IAM对S3做访问控制
  • Idea+maven+scala构建包并在spark on yarn 运行
  • Javascripit类型转换比较那点事儿,双等号(==)
  • Spark学习笔记之相关记录
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • Wamp集成环境 添加PHP的新版本
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 工作手记之html2canvas使用概述
  • 驱动程序原理
  • 设计模式 开闭原则
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 一文看透浏览器架构
  • 正则表达式
  • 转载:[译] 内容加速黑科技趣谈
  • 选择阿里云数据库HBase版十大理由
  • # 计算机视觉入门
  • #知识分享#笔记#学习方法
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (4)logging(日志模块)
  • (CPU/GPU)粒子继承贴图颜色发射
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (初研) Sentence-embedding fine-tune notebook
  • (二)JAVA使用POI操作excel
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (十三)Flask之特殊装饰器详解
  • (转)视频码率,帧率和分辨率的联系与区别
  • (转载)深入super,看Python如何解决钻石继承难题
  • .JPG图片,各种压缩率下的文件尺寸
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .NET Core 通过 Ef Core 操作 Mysql
  • .NET 药厂业务系统 CPU爆高分析
  • .NET开发不可不知、不可不用的辅助类(一)
  • .NET框架