SQL基础理论篇(三):数据表的创建原则

文章目录

  • 简介
  • 数据表的常见约束
  • 设计数据表的原则
  • 参考文献

简介

DDL中常用的功能是增删改,分别对应的命令是create、drop和alter。

执行DDL的时候,不需要commit,就可以完成执行任务。

下面是MySQL里的一个典型的表创建语句:

DROP TABLE IF EXISTS `player`;
CREATE TABLE `player`  (`player_id` int(11) NOT NULL AUTO_INCREMENT,`team_id` int(11) NOT NULL,`player_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,`height` float(3, 2) NULL DEFAULT 0.00,PRIMARY KEY (`player_id`) USING BTREE,UNIQUE INDEX `player_name`(`player_name`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

注意,数据类型里的int(11)表示整数类型,其显示长度为11,所以括号里面的数字11表示的是最大有效显示长度,与类型包含的数值范围大小无关。

varchar(255)也是一样,显示最大长度是255。

Decimal(a,b)中,a代表整数部分和小数部分加起来的最大位数,b代表小数位数。如Decimal(8, 2)表示精度为8位(整数加小数位最多为8位),小数位为2位的数据类型。

排序规则是utf8_general_ci,表示大小写不敏感,如果设置为utf8_bin,表示大小写敏感。

我们对player_name字段设置了唯一索引。也可以设置普通索引NORMAL INDEX。两者的区别在于,唯一索引对字段添加了唯一性约束。

在索引方式上,可以选择BTREE或者HASH,这里我们用了BTREE,即USING BTREE

需要注意,MySQL 在 Linux 的环境下,数据库名、表名、变量名是严格区分大小写的,而字段名是忽略大小写的。而 MySQL 在 Windows 的环境下全部不区分大小写。

数据表的常见约束

主要分为主键约束、外键约束和字段约束三大类。

主键,是用来唯一标识一条记录,其不能重复且不能为空,一个数据表的主键只能有一个,可以是一个字段,也可以是由多个字段复合组成。

外键,确保了表与表之间引用的完整性。一个表的外键对应另一张表的主键。外键可以是重复的,也可以是空的。

字段约束:

  • 唯一性约束。表明字段的值在表中是唯一的,主键默认具有唯一性约束和非空约束。
  • NOT NULL约束。字段不应为null;
  • DEFAULT。表明了字段的默认值。如DEFAULT 0.0
  • CHECK约束。检查特定字段取值范围的有效性,check约束的检查结果不能为FALSE,比如我们对身高字段height做check约束,即CHECK(height>=0 and height<3);

设计数据表的原则

教程里提出了一个"三少一多"原则(了解下就行,相当于是理想派理论,并不适用于当下):

  • 数据表的个数越少越好

RDBMS核心在于实体和联系的定义,数据表越少,说明实体和联系设计的越简洁。

  • 数据表中的字段越少越好

字段数量越多,数据冗余的可能性就越大。保持字段数量少,各个字段间相互独立,而不是某个字段的取值可以由其他字段计算出来。当然这只是个相对概念,我们通常会在数据冗余和检索效率中进行平衡。

  • 数据表中的联合主键的字段个数越少越好

因为联合主键的字段数量越多,占用的索引空间就越大,还会增加表使用时的理解难度。

  • 使用主键和外键越多越好

主键和外键越多,说明表之间的关系越多,证明这些实体之间的冗余度越低,利用度越高。在保证了各表独立性的前提下,还提升了相互之间的关联使用率。

所以这里的"三少一多"原则核心就是简单可复用。

简单就是用更少的表、更少的字段、更少的联合主键字段来完成数据表的设计。

可复用是通过主键、外键的使用来增量表之间的复用率。

当然,以上原则并不是绝对的,在生产场景下,很多时候我们需要牺牲数据的冗余度来换取数据处理的效率,即以空间换时间。

而且,关于是否使用外键,是很有争议的

外键本身的存在,是为了保证数据的强一致性,比如说可以配合级联更新,自动更新(删除)关联的记录。

但其实我们完全可以不用外键,而是在业务层来保证数据的一致性。当然,会增加业务逻辑和数据之间的耦合。

但是对超大型的数据应用场景来讲,在存在外键的情况下,大量的插入、更新和删除记录,会额外增加过多的开销,尤其是在高并发、水平拆分、分库的情况下。因为每次更新数据,都需要检查另外一张表的数据,也很容易造成死锁。所以大型项目一般会取消外键,来提高效率。

互联网公司一般推荐尽量少用或不用外键,比如阿里的Java开发规范里也明确指出,“不得使用外键与级联,一切外键概念必须在应用层解决”,以及"外键与级联更新适用于单机低并发,不适合分布式、高并发集群。级联更新是强阻塞,存在数据库更新风暴的风险。外键也会影响数据的插入速度"。

总结来看,个人的小项目可以上上外键,大型项目还是算了,太过影响数据库的性能。

评论里有个很有意思,“一般在业务层实现外键约束。学院派才喜欢瞎折腾什么外健,触发器,存储过程,还扯出一大堆好的理由出来。事实上工程的主要复杂度往往来源于变化以及规模。 所以各个子母块之间耦合越小越好。存储中间件就安心的做好自己存储的那一块即可。没有必要一个存储中间件天天操着业务如何处理的心”。感觉说的很有道理。

参考文献

  1. 04丨使用DDL创建数据库&数据表时需要注意什么?

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

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

相关文章

接口自动化测试面试题

前言 前面总结了一篇关于接口测试的常规面试题&#xff0c;现在接口自动化测试用的比较多&#xff0c;也是被很多公司看好。那么想做接口自动化测试需要具备哪些能力呢&#xff1f; 也就是面试的过程中&#xff0c;面试官会考哪些问题&#xff0c;知道你是不是真的做过接口自动…

京东数据挖掘(京东运营数据分析):2023年宠物行业数据分析报告

随着社会经济的发展&#xff0c;人均收入水平逐渐提高&#xff0c;使得宠物成为越来越多家庭的成员&#xff0c;宠物数量不断增长。伴随养宠人群的增多&#xff0c;宠物相关产业的发展也不断升温&#xff0c;宠物经济规模持续增长。 根据鲸参谋平台的数据显示&#xff0c;在宠物…

传统游戏难产 育碧瞄向Web3

出品过《刺客信条》的游戏大厂育碧&#xff08;Ubisoft&#xff09;又在Web3游戏领域有了新动作。 首次试水NFT无功而返后&#xff0c;育碧&#xff08;Ubisoft&#xff09;战略创新实验室与Web3游戏网络Immutable达成合作&#xff0c;将利用Immutable 开发游戏的经验和及生态…

C++ 基础二

文章目录 四、流程控制语句4.1 选择结构4.1.1 if语句 4.1.2 三目运算符4.1.3 switch语句注意事项 4.1.4 if和switch的区别【CHAT】4.2 循环结构4.2.1 while循环语句4.2.2 do...while循环语句 4.2.3 for循环语句九九乘法表 4.3 跳转语句4.3.1 break语句4.3.2 continue语句4.3.3 …

python趣味编程-5分钟实现一个测验应用程序(含源码、步骤讲解)

Python测验是用 Python 编程语言编写的,这个关于 Python 编程的简单测验是一个简单的项目,用于测试一个人在给定主题考试中的知识能力。 Python 中的 Quiz项目仅包含用户端。用户必须先登录或注册才能开始Python 测验。 此外,还规定了解决问题的时间。用户应在时间结束前解…

如何查看当前开发的Android版本

Android的版本查看在build/make/core/version_defaults.mk中 搜索PLATFORM_VERSION&#xff0c;会出现一堆结果&#xff0c;找到 DEFAULT_PLATFORM_VERSION : QP1A PLATFORM_VERSION.QP1A : 10 这里就是表示是 Android 10 Android 10的代号是 Q&#xff0c; 因此QP1A第一…

Leetcode -1

Leetcode Leetcode -94.二叉树的中序遍历Leetcode -145.二叉树的后序遍历 Leetcode -94.二叉树的中序遍历 题目&#xff1a;给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1, null, 2, 3] 输出&#xff1a;[1,…

计算机网络:网络层ARP协议

在实现IP通信时使用了两个地址&#xff1a;IP地址&#xff08;网络层地址&#xff09;和MAC地址&#xff08;数据链路层地址&#xff09; 问题&#xff1a;已知一个机器&#xff08;主机或路由器&#xff09;的IP地址&#xff0c;如何找到相应的MAC地址&#xff1f; 为了解决…

力扣刷题篇之数与位3

系列文章目录 目录 系列文章目录 前言 数学问题 总结 前言 本系列是个人力扣刷题汇总&#xff0c;本文是数与位。刷题顺序按照[力扣刷题攻略] Re&#xff1a;从零开始的力扣刷题生活 - 力扣&#xff08;LeetCode&#xff09; 数学问题 204. 计数质数 - 力扣&#xff08;Le…

C# chatGPT API调用示例

# C# API现在需要Verify your phone number to create an API key using Newtonsoft.Json; using System.Text;class Program {static readonly HttpClient client new HttpClient();static async Task Main(){try{// 设置 API 密钥string apiKey "your api";clie…

Elasticsearch 8.9 Bulk批量给索引增加数据源码

一、相关API的handler二、RestBulkAction&#xff0c;组装bulkRequest调用TransportBulkAction三、TransportBulkAction 会把数据分发到数据该到的数据节点1、把数据按分片分组&#xff0c;按分片分组数据再发送到指定的数据节点(1) 计算此文档发往哪个分片1)根据索引是否是分区…

【Linux】vscode远程连接ubuntu失败

VSCode远程连接ubuntu服务器 这部分网上有很多&#xff0c;都烂大街了&#xff0c;自己搜吧。给个参考连接&#xff1a;VSCode远程连接ubuntu服务器 注意&#xff0c;这里我提前设置了免密登录。至于怎么设置远程免密登录&#xff0c;可以看其它帖子&#xff0c;比如这个。 …

leetcode刷题日志-13整数转罗马数字

罗马数字包含以下七种字符&#xff1a; I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如&#xff0c; 罗马数字 2 写做 II &#xff0c;即为两个并列的 1。12 写做 XII &#xff0c;即为…

Ps:锁定图层

使用“图层”面板上的锁定图层 Lock Layer功能可以完全或部分锁定图层以保护其内容。 比如&#xff0c;在完成某个图层后希望它不再被修改&#xff08;包括不透明度和图层样式等&#xff09;&#xff0c;可将其完全锁定。 如果不想更改图像&#xff0c;但对其摆放位置还在犹豫不…

SpringBoot整合Quartz示例

数据表 加不加无所谓,如果需要重启服务器后重新执行所有JOB就把sql加上 如果不加表 将application.properties中的quartz数据库配置去掉 自己执行自己的逻辑来就好,大不了每次启动之后重新加载自己的逻辑 链接&#xff1a;https://pan.baidu.com/s/1KqOPYMfI4eHcEMxt5Bmt…

Unittest框架--自动化

Python中方法的传递 参数化 pip install parameterized -i https://pypi.douban.com/simple需求&#xff1a;验证Tpshop登录 # 断言参数化 import time import unittest from parameterized import parameterized from selenium import webdriver from selenium.webdriver.co…

小程序游戏、App游戏与H5游戏:三种不同的游戏开发与体验方式

在当今数字化的时代&#xff0c;游戏开发者面临着多种选择&#xff0c;以满足不同用户群体的需求。小程序游戏、App游戏和H5游戏是三种流行的游戏开发和发布方式&#xff0c;它们各自具有独特的特点和适用场景。 小程序游戏&#xff1a;轻巧便捷的社交体验 小程序游戏是近年来…

OpenCV快速入门:基本操作

文章目录 1. 像素操作1.1 像素统计1.2 两个图像之间的操作1.2.1 图像加法操作1.2.3 图像加权混合 1.3 二值化1.4 LUT&#xff08;查找表&#xff09;1.4.1 查找表原理1.4.2 代码演示 2 图像变换2.1 旋转操作2.1.1 旋转的基本原理2.1.2 代码实现 2.2 缩放操作2.3 平移操作2.3.1 …

第四代智能井盖传感器:万宾科技智能井盖位移监测方式一览

现在城市化水平不断提高&#xff0c;每个城市的井盖遍布在城市的街道上&#xff0c;是否能够实现常态化和系统化的管理&#xff0c;反映了一个城市治理现代化水平。而且近些年来住建部曾多次要求全国各个城市加强相关的井盖管理工作&#xff0c;作为基础设施重要的一个组成部分…

代码随想录算法训练营第二十四天| 77 组合

目录 77 组合 暴力 减枝优化 77 组合 暴力 class Solution {List<List<Integer>>res new ArrayList<>();LinkedList<Integer>newList new LinkedList<>();public List<List<Integer>> combine(int n, int k) {dfs(n,k,1);r…