[数据库]关于数据库设计的原则

news2024/11/28 4:38:18

数据表设计原则:

自动编号的ID应该设计为`bigint`,因为`int`可能不够用,并且,为了便于统一管理,写的舒心不出错,建议所有表的自增ID全部使用`bigint` 。(缺点是占空间,如果有20亿条数据,浪费80亿个字节,折算下来在7.45个g左右,但数据库的数据是存在硬盘上的,硬盘空间大,而且拥有20亿条数据的项目是不在意这7个g的,权衡下来也就不用考虑这个缺点了)

数值类型的字段使用unsigned表示“无符号位的”,以tinyint(对应Java中的byte类型)为例,如果是有符号位的,取值区间是[-128, 127],因为8位二进制有一位表示符号位,7位1最高上限是127,如果是无符号位的,取值区间是[0, 255],即8个1。需要注意,在许多设计中,添加unsigned更多的是为了表现“语义”,并不是为了扩容正数的取值上限,比如给id添加只是表示id永远不为负数。

强烈推荐为每个字段配置COMMENT,以表示各字段的含义

 id             bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '数据id'

 

使用varchar时,应该设计一个绝对够用的值,例如“用户名”可以设计为varchar(50),这样设计的好处是可以应对未来可能出现的变化,同时varchar是变长的,只会占用实际存入的数据的应占用空间,即使设计得比较大,也不会浪费空间,但是,也不要大到离谱,会影响语义(varchar可以写的最大值是65532,理论上是65535,是否为null的标记会扣去一个字节,还会扣去1-2个字节来记录实际往里面存了几个字)

  username       varchar(50)         DEFAULT NULL COMMENT '用户名'

 

如果你可能需要根据某个字段进行排序,而这个字段可能存在“非ASCII字符”(例如中文),应该添加新的字段,记录对应的数据的拼音,实际排序是,应该根据拼音字段排序,以解决中文的多音字问题

 pinyin                 varchar(255)        DEFAULT NULL COMMENT '品牌名称的拼音'

 

 如果你认为这个数据会被参与到搜索查询里面,就需要去为它设计一个字段,指定关键词列表

keywords               varchar(255)        DEFAULT NULL COMMENT '关键词列表,各关键词使用英文的逗号分隔'

 

 许多数据都可能需要注意列表中的数据的顺序,则极可能需要添加“排序序号”字段,以干预排序结果(比如谁充值就把谁放在前面)

  • 在编写查询的SQL语句时,只要查询结果可能超过1条,必须显式的指定ORDER BY,如果第1排序规则不足以使得所有结果都有明确顺序,还应该继续指定第2排序规则、第3排序规则等

 sort                   tinyint(3) unsigned DEFAULT NULL COMMENT '排序序号'

 注意:如果不指定ORDER BY,并不是按照id升序排列的,是按照数据库自己决定的,即使是同一款数据库的不同版本也会不同,所以必须要指定ORDER BY 排序。

 

 

当设计有“层级”特征的数据表时,例如设计“类别表”、“省市区数据表”时,可以在表中设计parent_id(或类似名称)的字段,使得1张表可以存储若干层级的数据

 parent_id    bigint(20) unsigned DEFAULT NULL COMMENT '父级类别id,如果无父级,则为0'

 

表中设计深度depth字段,可以更快的知道它是几级,它的好处:

  • 层级查询:depth字段可以表示数据的层级关系,使得在查询时可以方便地进行层级的过滤和排序。例如,可以根据depth字段进行树形结构的查询,查找某个节点的所有子节点或者所有父节点。
  • 数据完整性约束:通过depth字段,可以对数据的层级关系进行约束,避免数据结构的错误或异常。例如,可以定义depth字段的取值范围或者参照外键关系,确保每个节点都符合预期的层级结构。
     
  • 快速导航和过滤:通过depth字段,可以快速筛选出特定层级的数据,从而实现导航和过滤的功能。例如,可以根据depth字段查询所有一级节点或者所有叶子节点,以满足特定的业务需求。
  • 提升查询性能:通过在表中添加depth字段,可以减少复杂的递归查询或者多次查询的需求,从而提升查询性能。可以通过depth字段进行条件查询,避免对整个数据集进行扫描,从而加快查询速度。
 depth        tinyint(3) unsigned DEFAULT NULL COMMENT '深度,最顶级类别的深度为1,次级为2,以此类推'

 

 

 设计is_parent字段,可以更方便的查询到它是不是父级,如果是父级就可以接着查看它的子集

is_parent    tinyint(3) unsigned DEFAULT NULL COMMENT '是否为父级(是否包含子级),1=是父级,0=不是父级'

 

设计is_display字段是否显示在导航栏中,同上is_parent字段,都是属于依据数据,虽然没有实际意义,但是都非常的方便

is_display   tinyint(3) unsigned DEFAULT NULL COMMENT '是否显示在导航栏中,1=启用,0=未启用'

 

当某些数据的量比较大时,可能需要与别的数据关联起来,在实际应用时,可以起到“筛选”的作用,例如:当发布“笔记本电脑”这种类别的商品时,不需要将“老干妈”这种名牌显示在列表中

brand_id     bigint(20) unsigned DEFAULT NULL COMMENT '品牌id',
category_id  bigint(20) unsigned DEFAULT NULL COMMENT '类别id'

smallint 是MySQL中的一种整数类型,通常占据2个字节(16位)的存储空间。在有符号的情况下,smallint 可以表示的范围为 -32,768 到 32,767。其中,最高位用于表示符号位,0 表示正数,1 表示负数,剩余的位用于表示数值的大小。

因此,在有符号位的情况下,smallint 可以表示的整数范围为 -32,768 到 32,767。如果不需要负数,可以使用无符号的 smallint 类型(unsigned smallint),此时可以表示的范围为 0 到 65,535。对于图片的宽高等字段数据如果是像素为单位就可以用smallint类型。

 width        smallint(5) unsigned DEFAULT NULL COMMENT '图片宽度,单位:px',
    height       smallint(5) unsigned DEFAULT NULL COMMENT '图片高度,单位:px'

如果某张表中某个字段的值可能比较大,应该将这个字段设计到另一张表中去,并且,这2张表将形成“1对1”的关系,例如“新闻”数据中的“正文”就是可能比较大的数据,则应该拆分为“新闻信息表”和“新闻正文表”,将新闻的正文数据保存在“新闻正文表”中,而新闻的其它基本信息都保存在“新闻信息表”中即可,这种拆分的目的是为了避免较大的数据影响查询效率

 

对于数据量可能非常大的表,可能后续将会做分库分表的处理,主键ID不要使用自动编号

 

 

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

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

相关文章

地震勘探基础(二)之地震分辨率

地震分辨率 分辨率(resolution)表示分离出两个十分靠近的物体的能力,一般用距离表示。如果两个物体之间的距离大于某个特定距离时可以分辨出是两个分离的物体,小于这个特定距离时就不再能分辨出是两个物体,那么这个特…

电压放大器在超声波测距仪中的应用实例研究

超声波测距仪是一种用于测量距离的设备,其原理是利用超声波在空气中传播的速度和反射特性来计算距离。而电压放大器则是超声波测距仪中的一个重要组成部分,它可以将超声波信号放大到足够强的水平,以便于后续处理和显示。本安泰电子将为大家介…

【学习日记2023.6.1】数据库隔离级别

1. 数据库隔离级别 1.1 事务 事务只是一个改变,是一些操作的集合;用专业的术语讲,他就是一个程序的执行单元;事务本身其实并不包含这4个特性,只是我们需要通过某些手段,尽可能的让这个执行单元满足这四个特…

【C语言进阶笔记】

文章目录 1. const(常量指针、指针常量)2. static3. extern4. 指针数组和数组指针5. 结构体对齐6. int / uint取值范围、二进制形式与转换、负数表示7. \0,0,"0",0之间的区别8. 类型自动转换9. 内存结构10. …

【前端之旅】nvm-Node版本管理工具

一名软件工程专业学生的前端之旅,记录自己对三件套(HTML、CSS、JavaScript)、Jquery、Ajax、Axios、Bootstrap、Node.js、Vue、小程序开发(Uniapp)以及各种UI组件库、前端框架的学习。 【前端之旅】Web基础与开发工具 【前端之旅】手把手教你安装VS Code并附上超实用插件…

【HttpRunnerManager】搭建接口自动化测试平台操作流程

一、需要准备的知识点 1. linux: 安装 python3、nginx 安装和配置、mysql 安装和配置 2. python: django 配置、uwsgi 配置 二、我搭建的环境 1. Centos7 (配置 rabbitmq、mysql 、Supervisord) 2. python 3.6.8 (配置 django、uwsgi&am…

自然语言处理实战9-大语言模型的训练与文本生成过程

大家好,我是微学AI,今天给大家介绍一下自然语言处理实战9-大语言模型的训练与文本生成过程,以下是本文的目录结构: 文章目录 1.引言 2.大语言模型概述 3.大语言模型的应用项目 3.1 语言生成 3.2 机器翻译 3.3 问答系统 3.4 自动…

Express框架从入门到如土

目录 前言一,初体验二,路由2.1 什么是路由2.2. 路由的使用2.3 获取请求报文参数2.4 id的通配2.5 响应的设置 三,中间件3.1 中间件概述3.2 全局中间件与路由中间件的比对3.3 全局中间件的使用3.4 局部中间件的使用3.5 静态资源中间件&#xff…

“邮件营销新趋势,这个平台让你收获颇丰!

随着各媒体平台的迅速发展,2023年大家更专注于视频营销、网红营销、直播营销等营销方式。可以见得,数字媒介手段的发展,对于营销方式也产生了巨大的影响。但是,企业在拥抱新兴的营销方式的同时,也不要忽视传统的营销方…

好用的Chrome浏览器插件推荐(不定期更新)

好用的Chrome浏览器插件推荐 1.1 CSDN-浏览器助手1.2 Google 翻译1.3 JSON Viewer1.4 ModHeader - Modify HTTP headers1.5 Octotree - GitHub code tree 1.1 CSDN-浏览器助手 CSDN-浏览器助手 是一款集成本地书签、历史记录与 CSDN搜索(so.csdn.net) 的搜索工具 推荐&#x…

碳中和背景下我国空调系统发展趋势2022(李先庭)

碳中和背景下我国空调系统发展趋势 摘要 我国建筑空调系统在运行阶段的年碳排放量约为9.9亿t二氧化碳,降低其碳排放是实现碳达峰碳中和目标的重要挑战之一。本文对我国当前空调系统碳排放量进行了拆解,分…

node-exporter,prometheus,grafana三者之间的联系

一、node-exporter与节点机 用于收集节点机器的数据信息,那么node-exporter与节点机器的连接在哪里? node-exporter.yaml apiVersion: apps/v1 kind: DaemonSet metadata:name: node-exporternamespace: kube-systemlabels:k8s-app: node-exporter spe…

调整直线导轨间隙有什么方法?

直线导轨作为机械行业中非常重要的传动部件,应用范围当然相当广泛,尤其是自动化设备,基本上我们都能看到它的作用。 在机械行业待得久的人都知道,直线导轨在使用的过程中,为了保证直线导轨的正常工作,直线导…

C++ string类-2

at at 函数是在C还没有支持运算符重载的时候提供的。 他可以像 [] 重载运算符一样&#xff0c;找到某个位置的字符&#xff1a; string s1("hello world");s1.at(0) x;cout << s1 << endl; 输出&#xff1a; [] 重载运算符和 at&#xff08;&#x…

GIT常见报错以及解决方法

GIT常见报错以及解决方法 Changes not staged for commit问题复现原理解决 warning: adding embedded git repository问题复现原理解决 error: src refspec master does not match any问题复现 Changes not staged for commit问题复现&#xff1a;解决 Changes not staged for …

软考A计划-电子商务设计师-电子商务基础知识

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

chatgpt赋能python:Python为什么成为不可或缺的编程语言?

Python为什么成为不可或缺的编程语言&#xff1f; Python语言在过去的十年间&#xff0c;已经成为编程领域中不可或缺的一种语言。Python语言是一种高级、通用、面向对象语言&#xff0c;并且在数据科学、机器学习、网站开发等众多领域中广泛应用。本文将探讨为什么Python成为…

保护密码安全:ADSelfService Plus的重要性与优势

引言&#xff1a; 在当今数字化时代&#xff0c;密码安全对于个人和组织而言变得愈发重要。随着互联网的普及和数据泄露事件的频发&#xff0c;传统的用户名和密码已经不再足够保护我们的个人和机密信息。为了解决这个问题&#xff0c;许多组织开始采用密码管理工具&#xff0…

Fourier分析入门——第13章——信号分析

目录 第13章 信号分析 13.1 引言 13.2 加窗(windowing) 13.3 用一系列窗口采样(Sampling with an array of windows) 13.4 混叠现象(Aliasing) 13.5 通过插值重建(Reconstruction by interpolation) 13.6 非点采样(Non-point sampling) 13.7 覆盖系数规则(The coverage …

Yolov8轻量级:VanillaNet一种新视觉Backbone,极简且强大!华为诺亚2023

简到极致、浅到极致!深度为6的网络即可取得76.36%@ImageNet的精度,深度为13的VanillaNet甚至取得了83.1%的惊人性能。 1.VanillaNet 论文:https://arxiv.org/pdf/2305.12972.pdf 来自华为诺亚、悉尼大学的研究者们提出了一种极简的神经网络模型 VanillaNet,以极简主义的设…