數據庫約束表的設計

數據庫約束

概念:

數據庫約束是關系型數據庫的一個重要功能,主要是保證數據的完整性,也可理解為數據的正確性(數據本身是否正確,關聯關系是否正確)(一般是用在指定列上)

常見的約束類型

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
英文地址,請注明出處:http://en.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:使用函數封裝 思考…