【數據庫】數據庫設計規則、約束與索引概念

約束與索引

1、關係型數據庫設計規則

關係型數據庫設計規則

遵循ER模型和三範式

  • E entity 代表實體的意思 對應到數據庫當中的一張表
  • R relationship 代表關係的意思

ER模型 實體關係模型 Java OR Object relationship Hibernate、Mybatis ORM 對象關係映射

數據表中的那些鍵

數據庫中的鍵(Key)由一個或者多個屬性組成。

常用的幾種鍵和屬性的定義:

  • 超鍵:能唯一標識元組的屬性集叫做超鍵。

    唯一標識元組

  • 候選鍵:如果超鍵不包括多餘的屬性,那麼這個超鍵就是候選鍵。

    不包括多餘屬性的超鍵 候選鍵

  • 主鍵:用戶可以從候選鍵中選擇一個作爲主鍵。

    候選鍵的一個 主鍵

  • 外鍵:如果數據表 R1 中的某屬性集不是 R1 的主鍵,而是另一個數據表 R2 的主鍵,那麼這個屬性集就是數據表 R1 的外鍵。

​ 外鍵 主鍵

  • 主屬性:包含在任一候選鍵中的屬性稱爲主屬性。

    包含在任一候選鍵的屬性稱爲主屬性

  • 非主屬性:與主屬性相對,指的是不包含在任何一個候選鍵中的屬性。

通常,也將候選鍵稱之爲“碼”,把主鍵也稱爲“主碼”。因爲鍵可能是由多個屬性組成的,針對單個屬性,還可以用主屬性和非主屬性來進行區分。

候選鍵 碼 主鍵 主碼

  • 三範式:1、列不能拆分 2、唯一標識 3、關係引用主鍵

1.冗餘、重複 列不能拆分、設計表列細到不能拆分

2.唯一標識 要區分

3.關係引用主鍵 一般引用盡量引用主鍵、唯一鍵

從 1NF 到 3NF

範式的定義會使用到主鍵和候選鍵(因爲主鍵和候選鍵可以唯一標識元組)

1NF 指的是數據庫表中的任何屬性都是原子性的,不可再分。這很好理解,列不能拆分了,在設計某個字段的時候,對於字段 X 來說,就不能把字段 X 拆分成字段 X-1 和字段 X-2。事實上,任何的 DBMS 都會滿足第一範式的要求,不會將字段進行拆分。列不能拆分

2NF 指的數據表裏的非主屬性都要和這個數據表的候選鍵有完全依賴關係。所謂完全依賴不同於部分依賴,也就是不能僅依賴候選鍵的一部分屬性,而必須依賴全部屬性。 非主屬性 候選鍵完全依賴

3NF 在滿足 2NF 的同時,對任何非主屬性都不傳遞依賴於候選鍵。也就是說不能存在非主屬性 A 依賴於非主屬性 B,非主屬性 B 依賴於候選鍵的情況。

具體體現

  • 將數據放到表中,表再放到庫中。

  • 一個數據庫中可以有多個表,每個表都有一個名字,用來標識自己。表名具有唯一性。 數據庫有表,表有一個名字,唯一、標識自己。

  • 表具有一些特性,這些特性定義了數據在表中如何存儲,類似java和python中 “類”的設計。 數據在表中如何存儲? 類 屬性、字段 字段名 數據類型

  • 表由列組成,我們也稱爲字段。每個字段描述了它所含有的數據的意義,數據表的設計實際上就是對字段的設計。創建數據表時,爲每個字段分配一個數據類型,定義它們的數據長度和字段名。每個字段類似java 或者python中的“實例屬性”。字段 數據類型 字段名

    數據表的設計實際上就是對字段的設計

    設計字段 一個數據類型 數據長度 字段名

  • 表中的數據是按行存儲的,一行即爲一條記錄。每一行類似於java或python中的“對象”。

    數據按按行存儲,一行即爲一條記錄,一個對象樣的

表 類

字段 屬性 列

行、記錄 對象、實體

屬性值一個個

在這裏插入圖片描述

設計數據表的原則

三少一多”原則:

1.數據表的個數越少越好

RDBMS 的核心在於對實體和聯繫的定義,也就是 E-R 圖(Entity Relationship Diagram),數據表越少,證明實體和聯繫設計得越簡潔,既方便理解又方便操作。

關係型數據庫管理系統 實體和聯繫的定義 E-R圖

數據表的個數越少越好,證明實體和聯繫設計得越簡潔,既方便理解又方便操作。

2.數據表中的字段個數越少越好

字段個數越多,數據冗餘的可能性越大。設置字段個數少的前提是各個字段相互獨立,而不是某個字段的取值可以由其他字段計算出來。當然字段個數少是相對的,我們通常會在數據冗餘和檢索效率中進行平衡。

各個字段相互獨立 設計數據表 數據庫表中的字段個數越少越好

3.數據表中聯合主鍵的字段個數越少越好

設置主鍵是爲了確定唯一性,當一個字段無法確定唯一性的時候,就需要採用聯合主鍵的方式(也就是用多個字段來定義一個主鍵)。聯合主鍵中的字段越多,佔用的索引空間越大,不僅會加大理解難度,還會增加運行時間和索引空間,因此聯合主鍵的字段個數越少越好。

聯合主鍵個數越少越好

4.使用主鍵和外鍵越多越好

數據庫的設計實際上就是定義各種表,以及各種字段之間的關係。這些關係越多,證明這些實體之間的冗餘度越低,利用度越高。這樣做的好處在於不僅保證了數據表之間的獨立性,還能提升相互之間的關聯使用率。

使用主鍵和外鍵越多越好???

“三少一多”原則的核心就是簡單可複用。簡單指的是用更少的表、更少的字段、更少的聯合主鍵字段來完成數據表的設計。可複用則是通過主鍵、外鍵的使用來增強數據表之間的複用率。因爲一個主鍵可以理解是一張表的代表。鍵設計得越多,證明它們之間的利用率越高。

簡單可複用 用更少的表 更少的字段 更少的聯合主鍵字段來完成數據表的設計

可複用 主鍵 外鍵的使用來增強數據表之間的複用率

2、約束與索引的概念

1、數據完整性(Data Integrity)是指數據的精確性(Accuracy)和可靠性(Reliability)。它是應防止數據庫中存在不符合語義規定的數據和防止因錯誤信息的輸入輸出造成無效操作或錯誤信息而提出的。

數據完整性 數據的精確性 可靠性

數據的完整性要從以下四個方面考慮:

  • 實體完整性(Entity Integrity):例如,同一個表中,不能存在兩條完全相同無法區分的記錄
  • 域完整性(Domain Integrity):例如:年齡範圍0-120,性別範圍“男/女”
  • 引用完整性(Referential Integrity):例如:員工所在部門,在部門表中要能找到這個部門
  • 用戶自定義完整性(User-defined Integrity):例如:用戶名唯一、密碼不能爲空等,本部門經理的工資不得高於本部門職工的平均工資的5倍。

2、根據約束的特點,分爲幾種:

  • 鍵約束:主鍵約束、外鍵約束、唯一鍵約束
  • Not NULL約束:非空約束
  • Check約束:檢查約束
  • Default約束:默認值約束
  • 自增約束

鍵約束 主鍵約束 外鍵約束 唯一鍵約束

非空約束Not NULL 檢查約束Check 默認值約束Default 自增約束

數據表的常見約束

創建數據表的時候,還會對字段進行約束,約束的目的在於保證 RDBMS 裏面數據的準確性和一致性。來看下常見的約束有哪些。

首先是主鍵約束。

主鍵起的作用是唯一標識一條記錄,不能重複,不能爲空,即 UNIQUE+NOT NULL。一個數據表的主鍵只能有一個。主鍵可以是一個字段,也可以由多個字段複合組成。

其次還有外鍵約束。

外鍵確保了表與表之間引用的完整性。一個表中的外鍵對應另一張表的主鍵。外鍵可以是重複的,也可以爲空。

除了對鍵進行約束外,還有字段約束。

唯一性約束。

唯一性約束表明了字段在表中的數值是唯一的,即使我們已經有了主鍵,還可以對其他字段進行唯一性約束。需要注意的是,唯一性約束和普通索引(NORMAL INDEX)之間是有區別的。唯一性約束相當於創建了一個約束和普通索引,目的是保證字段的正確性,而普通索引只是提升數據檢索的速度,並不對字段的唯一性進行約束。

NOT NULL 約束。對字段定義了 NOT NULL,即表明該字段不應爲空,必須有取值。

DEFAULT,表明了字段的默認值。如果在插入數據的時候,這個字段沒有取值,就設置爲默認值。

CHECK 約束,用來檢查特定字段取值範圍的有效性,CHECK 約束的結果不能爲 FALSE。

3、約束(CONSTRAINTS)與索引(INDEX)

constraints、index

約束是用來對數據業務規則和數據完整性進行實施、維護。約束的作用範圍僅限在當前數據庫,約束可以被當做數據庫對象來處理,它們具有名稱和關聯模式。是邏輯約束,不會因爲設置約束而額外佔用空間。

索引是一個單獨、物理的存儲在數據頁上的數據庫結構,它是表中一列或若干列值的集合和相應的指向表中數據值的物理標識數據頁的邏輯指針清單(類似於新華字典的目錄索引頁)。索引的存在會增加數據庫的存儲空間,也會使插入、修改數據的時間開銷變多(因爲插入和修改數據時,索引也要隨之變動),但是可以大大提高查詢速度。因此應該在鍵列、或其他經常要查詢、排序、按範圍查找的列上建立索引,而對於在查詢中很少使用和參考的列、修改非常頻繁的列,值很少的列(例如性別只有男和女)等列上不應該創建索引。

數據庫中的索引,就好比一本書的目錄,它可以幫我們快速進行特定值的定位與查找,從而加快數據查詢的效率。

索引就是幫助數據庫管理系統高效獲取數據的數據結構。

雖然使用索引的本質目的是幫我們快速定位想要查找的數據,但實際上,索引有很多種類。

從功能邏輯上說,索引主要有 4 種,分別是普通索引、唯一索引、主鍵索引和全文索引。

普通索引是基礎的索引,沒有任何約束,主要用於提高查詢效率。唯一索引就是在普通索引的基礎上增加了數據唯一性的約束,在一張數據表裏可以有多個唯一索引。主鍵索引在唯一索引的基礎上增加了不爲空的約束,也就是 NOT NULL+UNIQUE,一張表裏最多隻有一個主鍵索引。全文索引用的不多,MySQL 自帶的全文索引只支持英文。我們通常可以採用專門的全文搜索引擎,比如 ES(ElasticSearch) 和 Solr。

按照物理實現方式,索引可以分爲 2 種:聚集索引和非聚集索引。我們也把非聚集索引稱爲二級索引或者輔助索引。

Mysql會在主鍵、唯一鍵、外鍵列上自動創建索引,其他列需要建立索引的話,需要手動創建。

其中主鍵刪除,對應的索引也會刪除

刪除唯一鍵的方式是通過刪除對應的索引來實現的

刪除外鍵,外鍵列上的索引還在,如果需要刪除,需要單獨刪除索引

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章