数据库约束表的设计

数据库约束

概念:

数据库约束是关系型数据库的一个重要功能,主要是保证数据的完整性,也可理解为数据的正确性(数据本身是否正确,关联关系是否正确)(一般是用在指定列上)

常见的约束类型

1.NOT NULL 

not null 非空约束,没有指定非空约束时,当前列可以为空,如果某一列定义为必填项,那么就可以使用not null (非空)约束

2.UNIQUE

unique唯一约束,保证某列的每行必须有唯一的值,比如说身份证号,学号

在KEY字段会显示UNI 注意NULL可以重复插入

3.DEFAULT

defalut默认约束,规定没有给列赋值时的默认值

注意虽然指定默认约束,但当我们手动指定这一列值为NULL时,插入值仍为NULL

4.PRIMARY KEY

primary key 主键约束 not null和unique 的结合,主键约束的列既是非空的也是唯一的 主键约束帮我们校验了非空和唯一,这两个校验虽然在写入数据时对效率有一定影响,但是与不做校验相比,这个性能消耗还是可以承担的(主键的后面的索引起到了非常重要的作用)

eg: id  bigint primary key auto_increasement(自增,让数据库自己帮我们维护主键的增长)

insert操作时,都会事先生成一个主键值,不管成功与否,主键值都会视为使用

主键值在数据表中有可能不连续

会为每台服务器都预先分配一区段的主键值

一个表中不允许有两个主键值,一个主键同时可以包含多个列(复合主键) ——在唯一校验时,只有复合主键中所有列都相同才被判定为相同

5.FOREIGN KEY

foreign key 外键约束 保证一个表中的数据匹配另一个表中的参照完整性,本质上也是一个校验的过程

表中某个列的值,必须是另一个表中的关键列或是唯一约束列的值,也就是当前表中值在另一个表中在另一个表中必须存在,且满足主键或唯一约束

语法: foreign key(字段名) references 主表(列)

通过外键约束,保证数据的完整性和关系的正确性

当子表中存在依赖主表的记录时,不允许删除主表中的记录,要删只能先删除子表记录,再删主表

6.CHECK

保证列中值符号指定的条件(在MYSQL8.0有效,MYSQL5.7无效)

check(要检查的列=‘A’or~=‘B’)

表的设计

类、实体、表之间的关系

OOA面向对象分析--》OOD面向对象设计——》OOP面向对象编程

1.从需求中分析获得类,类对应到数据库中的实体,实体在数据库表现为表,类中的属性对应着表中的字段

2.确定类与类之间的关系(一对一,一对多,多对多,没有关系)

3.使用SQL去创建具体表(设计表时会遵循一些规则,一般称之为三大范式)

范式描述的是数据关系模型,一对一关系,一对多关系,多对多关系

三大范式

第一范式1NF

关系型数据库的最基本的要求,不满足第一范式就不可以称之为关系型数据库 

表中的字段不可再进行拆分(可以继续拆分在关系型数据库中是绝对不允许的)

在自定义表的时候,对应到数据中的数据类型,每个字段都可以用一个数据类型表示,那么当前这个表就天然的满足第一范式

第二范式2NF

在满足第一范式的基本上,不存在非关键字段对任意候选键的部分函数依赖(存在于复合主键的情况下)

任意候选键:可以理解为主键,外键,没有主键时的唯一键

非关键字段:可以理解为非关键字段

部分函数依赖:对于由两个或多个关键字段决定一条记录的情况,如果一行数据中有些字段只与关键字段中的一个有关系,那么就说明它存在部分函数依赖

一个表中没有复合主键,这样的表天然满足第二范式

不满足第二范式可能出现的情况:

1.数据冗余        2.更新异常        3.插入异常        4.删除异常

第三范式3NF

在第二范式的基础上,不存在非关键字段,对任一候选键的传递依赖

第三范式可以解决数据冗余,更新异常,插入异常,删除异常的问题

实例之间的关系

1.一对一关系

比如登陆界面,一个实体是用户,一个是账号(登录名,密码)

在设计表时,先把实体之间的关系列出来

一对一关系,设计表时,两种方式(1.把所有信息全放在一张表中   2.创建两张表,分别记录,并将两张表进行关联)

2.一对多关系

常见于学生与班级的关系(一个学生只能存在于一个班级,一个班级可以有多个学生)

3.多对多关系

一个学生可以选修多门课程,一门课程可以选多个学生

1.分别创建实体表

2.创建关系表,在关系表中为实体之间创建关联关系

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

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

相关文章

【案例分享】TeeChart 助力 Softdrill 提升油气钻井数据可视化能力

在钻井与地质工程领域,数据可视化是核心环节。图表不仅需要精确与高效,还需符合行业习惯并支持交互与定制。Softdrill 自 2012 年起在核心产品中集成了TeeChart 图表库,将复杂的井下数据转化为直观的工程图表,极大提升了钻井工程师…

【Flink】Flink Runtime 架构设计

Flink Runtime 架构设计 整体架构 ┌─────────────────────────────────────────────────────────────────┐ │ Flink Runtime │ ├─────────…

Git 命令教程

Git介绍 分布式版本控制系统。 Git命令 初始化/全局配置git init初始化一个Git仓库(会创建一个.git的目录)git config --global user.name “name”设置提交时的用户名git config user.name查看设置的用户名git config --global user.email “youemail.c…

git config --global user.name指令报错时的解决方案

问题分析 %HOMEDRIVE%%HOMEPATH%/.gitconfig 是Windows环境变量的表示方式: %HOMEDRIVE% 通常是 C:%HOMEPATH% 通常是 \Users\你的用户名完整路径应该是:C:\Users\你的用户名\.gitconfig 但这里环境变量没有被正确解析,显示的是字面意思。 …

websocket和socket io的区别

好的,这是一个更具体也更常见的问题。WebSocket 是一种协议,而 Socket.IO 是一个库,它使用了 WebSocket 但提供了多得多的功能。 简单比喻: WebSocket 就像是给你提供了一条高效的“快递专线”(双向通信通道&#xff…

Nginx反向代理与负载均衡部署

Nginx反向代理与负载均衡部署实战指南前言一、规划部署负载均衡和反向代理二、部署Nginx负载均衡器2.1. 准备基础环境2.2. 创建Nginx运行用户2.3. 编译安装Nginx2.4. 配置Nginx系统服务2.5. 验证Nginx安装三、部署后端2台Tomcat应用服务器3.1. 安装JDK3.2. 部署Tomcat实例13.3.…

从源码和设计模式深挖AQS(AbstractQueuedSynchronizer)

AQS 概念 AbstractQueuedSynchronizer(AQS) 是 Java 并发包 (java.util.concurrent.locks) 的核心基础框架,它的实现关键是先进先出 (FIFO) 等待队列和一个用volatile修饰的锁状态status。具体实现有 : ReentrantLock、Semaphore、CountDownL…

Dart → `.exe`:Flutter 桌面与纯命令行双轨编译完全指南

Dart → .exe:Flutter 桌面与纯命令行双轨编译完全指南 关键词:Dart、Flutter、Windows、可执行文件、桌面端、CLI、交叉编译 1. 前言 很多开发者以为 Dart 只能跑在 AOT 移动端或 Web 端,其实 官方工具链早已支持一键输出 Windows 原生 .ex…

互联网接入网中PPPoE和PPP协议

<摘要> PPPoE和PPP是宽带接入网络中至关重要的协议组合&#xff0c;其中PPP提供通用的点对点链路层解决方案&#xff0c;而PPPoE则是在以太网架构上扩展PPP应用的技术桥梁。本文从技术演进视角系统解析了两者的内在关联与本质区别&#xff1a;PPP作为成熟链路层协议&…

详细解析SparkStreaming和Kafka集成的两种方式的区别和优劣

spark streaming是基于微批处理的流式计算引擎&#xff0c;通常是利用spark core或者spark core与spark sql一起来处理数据。在企业实时处理架构中&#xff0c;通常将spark streaming和kafka集成作为整个大数据处理架构的核心环节之一。 针对不同的spark、kafka版本&#xff0…

Kite Compositor for Mac v2.1.2 安装教程|DMG文件安装步骤(Mac用户必看)

Kite Compositor​ 是一款专为 ​macOS​ 设计的 ​轻量级界面设计 & 动画制作工具&#xff0c;它可以让你像拼图一样直观地 ​创建、编辑和预览用户界面&#xff08;UI&#xff09;以及动画效果。 一、下载文件 首先&#xff0c;你得先把这个 ​Kite Compositor for Mac …

【逆向】Android程序静态+动态分析——去壳

对提供的 CrackmeTest.apk 进行逆向分析&#xff0c;程序含有反调试机制&#xff08;加壳&#xff09;&#xff0c;通过静态补丁反反调试&#xff08;去壳&#xff09;&#xff0c;再动态调试获取其中密码。 目录 环境 基础 实验内容 静态分析 动态分析 反反调试 再动态…

Rust 开发环境安装与 crates.io 国内源配置(Windows / macOS / Linux 全流程)

Rust 这几年在系统编程、WebAssembly、区块链、后端服务领域越来越火&#xff0c;很多开发者都在尝试用它做一些新项目。 但是国内安装 Rust 开发环境时&#xff0c;经常遇到 安装慢、依赖拉不下来、crates.io 超时 等问题。本文结合个人踩坑经验&#xff0c;整理了一份 跨平台…

Nginx SSL/TLS 配置

Nginx SSL/TLS 配置指南&#xff1a;从入门到安全强化前言一、环境准备&#xff1a;Nginx安装配置1.1. **EPEL仓库配置**&#xff1a;1.2. **Nginx安装**&#xff1a;1.3. **服务启停管理**&#xff1a;1.4. **服务状态验证**&#xff1a;二、SSL/TLS证书获取方案方案A&#xf…

Java ReentrantLock和synchronized的相同点与区别

1. 核心概念与定位synchronized&#xff1a;Java 内置的关键字&#xff0c;属于 JVM 层面的隐式锁。通过在方法或代码块上声明&#xff0c;自动实现锁的获取与释放&#xff0c;无需手动操作。设计目标是提供简单易用的基础同步能力&#xff0c;适合大多数常规同步场景。Reentra…

【npm】npm 包更新工具 npm-check-updates (ncu)

npm 包太多了&#xff0c;一个项目有那么多依赖包&#xff0c;它们的升级管理需要一个工具&#xff1a;npm-check-updates&#xff1a; 安装&#xff1a; npm install -g npm-check-updates安装之后&#xff0c;就可以使用它的命令&#xff1a;ncu 查看哪些包可以升级&#xff…

go资深之路笔记(一) Context

一、 Context 的正确使用与底层原理 1.结构体 type Context interface {// Deadline 返回此 Context 被取消的时间点。// 如果未设置截止时间&#xff0c;ok 为 false。Deadline() (deadline time.Time, ok bool)// Done 返回一个 channel。当 Context 被取消或超时后&#xff…

VS2022 + Qt5.9 中文乱码/项目设置utf-8编码

&#x1f6e0;️ 解决QT5.9 VS2022中文乱码的全面方案 &#x1f4c1; 1. 检查文件编码与编译器设置 确保源文件是 带BOM的UTF-8 编码对MSVC编译器很重要。VS2022默认可能使用本地编码&#xff08;如GB2312&#xff09;解析源文件&#xff0c;即使文件以UTF-8保存。 查看和设置…

数据库--MySQL数据管理

数据库–MySQL数据管理 文章目录数据库--MySQL数据管理1.外键管理2.数据库数据管理3.DML语言3.1添加数据3.2修改数据3.3删除数据4.练习1.外键管理 外键概念 如果公共关键字在一个关系中是主关键字&#xff0c;那么这个公共关键字被称为另一个关系的外键。由此可见&#xff0c;…

【C++练习】13.C++输出九九乘法表的方法详解

目录 C++输出九九乘法表的方法详解 方法1:双重for循环(最基础) 思考: 代码分析: 特点: 方法2:使用while循环 思考: 代码分析: 特点: 方法3:使用递归实现 思考: 代码分析: 特点: 方法4:格式化输出(对齐美观) 思考: 代码分析: 特点: 方法5:使用函数封装 思考…