關系模型的數據結構

在這里插入圖片描述
在關系數據庫這個世界里,所有東西(包括你要記錄的人、物、事,以及它們之間的聯系)都用一種叫做“關系”的結構來表示。而這種“關系”的靈魂,就是“碼”(Key)。


1. 核心思想:萬物皆“關系”

“實體及實體之間的聯系均用單一的數據結構—“關系”來表示。”

  • 通俗解釋
    • 實體 (Entity):就是你要描述的獨立事物。比如,“學生”、“課程”、“老師”都是實體。
    • 聯系 (Relationship):就是實體之間的關聯。比如,“學生”和“課程”之間有“選課”這個聯系。
    • 核心思想:在老式的數據模型里,“實體”和“聯系”可能是用不同的方式來存儲和表示的,很麻煩。關系模型的革命性之處在于,它說:“別搞那么復雜了!不管是‘學生’這種實體,還是‘學生選了什么課’這種聯系,我們全都用一種統一的、規整的二維表格(也就是‘關系’)來表示。”

這就像樂高積木,不管你要搭城堡、飛船還是汽車,你用的都是同一種基本積木塊。這種“單一”和“統一”帶來了極大的簡潔性和理論上的嚴謹性。


2. 基本概念回顧

“關系、域、n目關系、元組、屬性。”

  • 關系 (Relation):就是一張二維表
  • 元組 (Tuple):就是表里的一行數據。
  • 屬性 (Attribute):就是表里的一列,比如“姓名”列、“學號”列。
  • 域 (Domain):屬性的取值范圍,比如“性別”屬性的域是 {男, 女}
  • n目關系:就是有n列的關系(表)。

3. 靈魂概念:“碼” (Key)

“碼”是用來唯一標識一行數據的,就像你的身份證號,它能把你和全世界幾十億人精確地區分開。沒有“碼”,數據就會亂套。

候選碼 (Candidate Key)

“關系中的某一屬性組,若它的值唯一地標識了一個元組,并具有最小性,則稱該屬性組為候選碼。”

這個定義有兩個關鍵點,我們用一個“學生表”來解釋:
學生表 (學號, 身份證號, 姓名, 性別)

  • 關鍵點1:唯一性 (Uniqueness)

    • 學號 在這個表里是不是唯一的?是的,每個學生的學號都不同。
    • 身份證號 是不是唯一的?是的,每個人的身份證號也不同。
    • 姓名 是不是唯一的?不一定,可能有同名同姓的人。
    • 所以,{學號}{身份證號} 都滿足唯一性
  • 關鍵點2:最小性 (Minimality)

    • 定義:“最小性”指的是,組成這個碼的屬性一個都不能少。如果去掉任何一個屬性,它就不唯一了。
    • 我們來看 {學號},它本身只有一個屬性,沒法再少了,所以它滿足最小性。
    • 同樣,{身份證號} 也滿足最小性。
    • 再看一個組合 {學號, 姓名}。這個組合肯定是唯一的(因為學號就唯一了)。但是,它滿足最小性嗎?不滿足! 因為你把 姓名 去掉,只剩下 {學號},它照樣是唯一的。所以 {學號, 姓名} 這個組合是冗余的,不滿足最小性。
  • 結論:在這個學生表中,同時滿足“唯一性”和“最小性”的屬性組有兩個:{學號}{身份證號}。這兩個都是候選碼。它們都是成為“官方ID”的有力候選人。

主碼 (Primary Key)

“若一個關系有多個候選碼,則選定其中一個為主碼。”

  • 通俗解釋:這完全是一個人為選擇的過程。
  • 上面我們找到了兩個候選碼:{學號}{身份證號}。現在,數據庫的設計者需要從中挑選一個作為這張表的“官方指定ID”。
  • 比如,我們決定用 {學號} 作為主碼。那么 學號 就是這張表的主碼。身份證號 雖然也是候選碼,但它“落選”了,它被稱為備用碼 (Alternate Key)

為什么要選一個主碼? 為了方便。當別的表需要引用這張表的某一行數據時,大家有一個統一的標準,都知道用 學號 來關聯,避免混亂。

主屬性 (Prime Attribute) 與 非主屬性 (Non-prime Attribute)

“碼中的諸屬性稱為主屬性,不包含在任何候選碼中的屬性稱為非主屬性。”

  • 通俗解釋:這是一個對列(屬性)的分類
  • 主屬性:只要一個屬性是任何一個候選碼的一部分,它就是主屬性。
    • 在我們的例子中,候選碼是 {學號}{身份證號}
    • 所以,學號身份證號 這兩個屬性都是主屬性
  • 非主屬性:不包含在任何候選碼中的屬性。
    • 在我們的例子中,姓名性別 這兩個屬性,它們既不是 {學號} 的一部分,也不是 {身份證號} 的一部分。
    • 所以,姓名性別 都是非主屬性

這個區分非常重要,它是后續進行數據庫設計規范化(比如判斷是否滿足第二范式、第三范式)的基礎。

總結一下

  • 關系:就是一張表,用來統一表示所有數據。
  • 候選碼:能唯一標識一行、且不含多余信息的“候選ID”(可能有多個)。
  • 主碼:從所有“候選ID”中,人為指定的那個“官方ID”(只有一個)。
  • 主屬性/非主屬性:對表里所有列的一個分類,凡是構成“候選ID”的列都是“主屬性”,其余都是“非主屬性”。
    在這里插入圖片描述

核心比喻:關系模式 vs. 關系

  • 關系模式 (Schema):這是設計藍圖。它定義了你的“房子”(也就是你的數據表)應該長什么樣:有幾個房間(列)、每個房間叫什么名字(屬性名)、墻壁是什么材質的(數據類型)、承重墻在哪里(主碼和約束)。藍圖是靜態的、穩定的
  • 關系 (Relation):這是建好的房子里實際住進去的人和家具。它是在某個時間點,你的數據表里真實存在的數據行。房子里的內容是動態的、隨時變化的

這張PPT就是在詳細解釋“設計藍-圖”(關系模式)到底由哪些部分構成。


關系模式的“精裝修”設計藍圖:R(U, D, dom, F)

這個公式看起來嚇人,但它只是把一張表的設計藍圖拆分成了四個組成部分。我們用一個學生表作為例子來解釋:

學生 (學號, 姓名, 專業, 班主任, 班主任電話)

1. R: 關系名 (Relation Name)
  • 含義:就是這張表的名字。
  • 例子學生
2. U: 屬性名集合 (Set of Attributes)
  • 含義:這張表里所有列的名字的集合。
  • 例子U = {學號, 姓名, 專業, 班主任, 班主任電話}
3. D: 域的集合 (Set of Domains)
  • 含義:這是所有屬性可能取值的“類型池”的集合。比如,“整數池”、“字符串池”、“日期池”等等。
  • 例子:我們的學生表需要整數(用于學號)和字符串(用于其他所有列)。所以 D = {整數域, 字符串域}。它只是一個原材料倉庫,列出了這張表會用到哪些類型的“原材料”。

重點解釋:domF

4. dom: 屬性到域的“映象” (Mapping) - 【你的第一個困惑點】
  • 學術定義:“映象” (Mapping) 是一個數學術語,意思就是建立“一對一”或“多對一”的對應關系

  • 通俗解釋dom 就是一份**“接線圖”或“分配表”。它詳細規定了,U 集合里的每一個屬性(列名),應該從 D 集合里的哪一個“類型池”(域)**去取值。

  • 例子

    • dom 規定了:
      • 學號整數域 (學號這一列必須是整數)
      • 姓名字符串域 (姓名這一列必須是字符串)
      • 專業字符串域 (專業這一列必須是字符串)
      • …以此類推
  • 它在實踐中是什么?
    當你在用SQL創建表的時候,dom 就體現在你的數據類型定義中:

    CREATE TABLE 學生 (學號 INT,      -- 這就是一條 dom 規則姓名 VARCHAR(50), -- 這也是一條 dom 規則專業 VARCHAR(50)  -- 這還是一條 dom 規則...
    );
    

    所以,dom 就是定義每一列數據類型的規則集合

5. F: 數據依賴關系集合 (Set of Data Dependencies) - 【你的第二個困惑點】
  • 學術定義:“數據依賴”描述了屬性之間存在的約束關系

  • 通俗解釋F 是這張表的“內在業務邏輯”或“隱藏規則”的集合。它說明了數據之間是如何相互關聯和制約的。最常見的依賴就是函數依賴

  • 例子:在我們的學生表中,存在以下這些“隱藏規則”:

    1. 只要 學號 確定了,那么 姓名專業班主任也就唯一確定了。
      • 這個規則在數學上記為:學號 -> {姓名, 專業, 班主任}
      • 這個規則正是“學號可以作為主碼”的根本原因!
    2. 只要 班主任 確定了,班主任電話 也就唯一確定了。
      • 這個規則在數學上記為:班主任 -> 班主任電話
      • 這個規則就是我們之前討論的“傳遞依賴”,它違反了第三范式(3NF)。
  • 它在實踐中是什么?
    F 是數據庫主碼、外碼約束以及范式理論的數學基礎。我們設計數據庫時,通過分析業務邏輯,找出這些數據依賴(F),然后根據這些依賴來決定如何設置主碼、如何拆分表以滿足2NF、3NF等范式要求,從而設計出結構優良的數據庫。


從“精裝修”藍圖到“簡裝”藍圖

關系模式通常可以簡記作 R(A1, A2, ..., An)

  • 解釋:上面那個 R(U, D, dom, F) 是給理論家看的“精裝修”藍圖,太復雜了。在日常工作中,我們用的是“簡裝”藍圖,也就是 學生(學號, 姓名, 專業) 這種形式。
  • 為什么可以簡化?
    因為 D (類型池) 和 dom (接線圖) 的信息,已經包含在我們給每一列定義的數據類型里了(比如 INT, VARCHAR)。而 F (內在規則) 則體現在我們設置的主碼、外碼和我們遵循的范式里。所以,簡化版已經足夠我們使用了。

總結一下

抽象概念通俗解釋實際對應
關系模式 (Schema)數據表的“設計藍圖”CREATE TABLE 語句
關系 (Relation)表里某一時刻的真實數據SELECT * FROM ... 的結果
U所有列的名字學號, 姓名, …
D用到的所有數據類型“池”INT, VARCHAR, DATE
dom“接線圖”,規定哪一列用哪種數據類型學號 INT; 姓名 VARCHAR(50);
F“內在業務規則”,列與列之間的約束主碼、外碼、函數依賴(范式的基礎)

希望這個“藍圖”的比喻能幫你徹底理解 domF 的作用!它們一個是規定了“數據的靜態類型”,另一個是規定了“數據的動態約束”。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/98169.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/98169.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/98169.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

180 課時吃透 Go 語言游戲后端系列0:序言

零基礎能學習 Go 游戲后端開發嗎? 當然能學啦!別擔心,就算你之前對編程一竅不通,也完全沒問題。我特意準備了180課時的開發課程,由淺入深、從理論到實踐帶領大家學會使用GO語言進行游戲后端開發。 編程就像學一門新語…

Android-SerialPort-API-master源碼 串口調試 權限分析 定制

我把界面美化了一下Android-SerialPort-API-master源碼 1.加了發送按鈕 2.加上固定/dev/ttyGS1和GS9串口權限問題已經查清楚了。app與PosServer都是使用google的SerialPort方案。我做的app 都多使用一個函數available(),這個函數是非常有用的。在上位機發送單條指令…

KVM 入門使用手冊

KVM 入門使用手冊 1. 概述 2. 安裝 在 Ubuntu/Debian 上安裝 在 RHEL/CentOS/Fedora 上安裝 3. 網絡配置 查看默認網絡 使用橋接網絡 (推薦用于服務器) 4. 創建虛擬機 方法一:使用圖形界面 (virt-manager) 方法二:使用命令行 (virt-install) 5. 管理虛擬機 使用 `virsh` 命令…

Devise Ruby身份驗證解決方案全攻略

文章目錄 前言Devise到底是什么?為什么選擇Devise?環境準備Devise安裝指南第一步:添加Devise到你的Gemfile第二步:初始化Devise第三步:生成用戶模型第四步:運行數據庫遷移 Devise核心模塊詳解Database Auth…

68-python操作SQLite

1. 了解SQLite SQLite,是一款輕型的數據庫,是遵守ACID的關系型數據庫管理系統,它包含在一個相對小的C庫中。它是D.RichardHipp建立的公有領域項目。它的設計目標是嵌入式的,而且已經在很多嵌入式產品中使用了它,它占用…

在Qt項目中使用QtConcurrent::run,實現異步等待和同步調用

在使用Qt進行開發時,經常需要使用異步方法,不同于C#的async/await,Qt中提供了QtConcurrent::run接口方法可供調用,習慣了C#的await,便想著能不能封裝幾個類似的函數在項目中使用,探索了下,有如下…

視頻分類 pytorchvideo

目錄 1. 速度 vs 精度分析 mvit: r2plus1d_r50 推理代碼: x3d_xs推理代碼: R(21)D X3D(輕量級,速度快) I3D(經典 3D CNN) 替換分類層(適配你的任務) https://gith…

OpenTiny NEXT 內核新生:生成式UI × MCP,重塑前端交互新范式!

近期,我們推出 OpenTiny NEXT —— OpenTiny的下一代企業級前端智能開發解決方案。這不僅是一次技術升級,更是一場用戶交互范式的變革:從傳統的人機交互升級成為人機交互范式和智能體交互范式的融合。我們堅信,每一個企業應用都值…

深度神經網絡1——梯度問題+標簽數不夠問題

要解決一個復雜問題,可能要訓練更深的神經網絡,可能會10層及以上,每層包含數百個神經元,成千上萬個連接。這樣大的神經網絡在訓練的時候可能會遇到以下問題:這樣在進行反向傳播的時候,隨著層數越來越低會遇…

(筆記)內存文件映射mmap

內存文件映射是一種將文件內容映射到進程的虛擬地址空間的技術,使得文件可以被視為內存的一部分,從而允許程序直接對這部分內存進行讀寫操作,而無需傳統的文件 I/O 調用。這種方法不僅簡化了文件操作,還提高了處理效率。 在Linux…

Golang中的NaN(Not a Number)

Golang中的NaN(Not a Number) 在Go語言中,NaN是浮點數(特別是float32和float64)中的一個特殊值,表示未定義或不可表示的數值。 go中,除數為0時并不會返回error或者nil,而是返回無窮大…

微軟圖引擎GraphEngine深度解析:分布式內存計算的技術革命

? "在大數據的汪洋中,圖引擎就像是一艘能夠高速穿越復雜關系網絡的超級快船" 引言:當內存遇上圖計算的火花 在這個數據爆炸的時代,傳統的關系型數據庫已經難以應對復雜關系數據的查詢挑戰。當Facebook的社交網絡擁有數十億用戶關…

catkin工程和CMakelist.txt的基本使用

catkin工程和CMakelist.txt的基本使用1.catkin工程和CMakelist.txt的基本使用1. 頂部基本信息2. 編譯選項 / C 標準3. 依賴查找(catkin 包)4. 第三方庫查找(非 catkin)5. 導出包信息(catkin_package)6. 頭文…

uniapp打包前端項目

打包前的準備工作確保項目開發已完成,并且已安裝最新版本的HBuilderX。檢查項目中所有依賴是否已正確安裝,配置文件如manifest.json已根據H5需求進行適配。在HBuilderX中打包在 HBuilderX 中,點擊頂部菜單欄的 “發行” -> “網站-H5手機版…

Dify + Bright Data MCP:從實時影音數據到可落地的智能體生產線

一、引言:AI 應用與實時影音數據的融合價值 內容生態近年的“視頻化、實時化、社交化”浪潮,將數據獲取鏈路推到了更靠前的位置。真正驅動業務的,不是某一幀漂亮的模型輸出,而是“數據—理解—動作”的持續閉環。無論是品牌內容策…

【Linux】make/Makefile工具篇

目錄一、自動化構建二、make/Makefile2.1 見識一個簡單的make/Makefile2.2 Makefile的基本語法2.3 Makefile的語法細節個人主頁<—請點擊 Linux專欄<—請點擊 一、自動化構建 自動化構建是指通過構建工具&#xff08;如make&#xff09;解析構建腳本&#xff08;如Make…

如何在企業微信上以 HTTPS 方式訪問內網 OA/ERP 等系統?

企業微信可以將 ZeroNews 平臺上添加的內網應用集成到企業微信的工作臺。這樣&#xff0c;用戶即使在外部網絡環境中&#xff0c;也可以通過企業微信訪問內網的 OA、ERP 等應用。以下是企業在 Linux 服務器上部署 OA 系統&#xff0c;并通過 ZeroNews 通過互聯網訪問 OA 系統的…

Windows 11 安裝使用 nvm,Node.js、npm多版本管理、切換

Windows 11 安裝使用 nvm&#xff0c;Node.js、npm多版本管理、切換 文章目錄Windows 11 安裝使用 nvm&#xff0c;Node.js、npm多版本管理、切換1. nvm 簡介2. 安裝、配置 nvm2.1. 卸載現有 Node.js&#xff08;非常重要&#xff01;&#xff09;2.2. 下載 nvm-windows 安裝包…

在LazyVim中配置Rust開發環境

要在LazyVim中配置Rust開發環境&#xff0c;包括代碼補全、格式化、調試等功能&#xff0c;可以按照以下步驟進行配置&#xff1a; 1. 確保基礎環境 首先確保你已經安裝了&#xff1a; Rust工具鏈 (rustup, rustc, cargo)LazyVim已正確安裝 # 安裝Rust工具鏈 curl --proto http…

LeetCode熱題100--114. 二叉樹展開為鏈表--中等

1. 題目 給你二叉樹的根結點 root &#xff0c;請你將它展開為一個單鏈表&#xff1a; 展開后的單鏈表應該同樣使用 TreeNode &#xff0c;其中 right 子指針指向鏈表中下一個結點&#xff0c;而左子指針始終為null 。展開后的單鏈表應該與二叉樹 先序遍歷 順序相同。 示例 …