MySQL什么是关系_MySQL教程-关系模型
MySQL教程-關(guān)系模型
Date 2021-1-22
Author Haihan Gao
什么是關(guān)系模型關(guān)系模型本質(zhì)上就是多個存儲數(shù)據(jù)的二維表
表的每一行稱為記錄
記錄是一個邏輯意義上的數(shù)據(jù)
表的每一列稱為字段。同一個表每一行記錄擁有若干相同字段
字段定義數(shù)據(jù)類型:INT,BIGINT,DOUBLE
是否允許為NULL:字段數(shù)據(jù)不存在,0或空串
不允許為NULL可以簡化查詢條件,加快查詢速度
關(guān)系數(shù)據(jù)庫的表之間需要建立一對多,多對一,多對多的關(guān)系
關(guān)系數(shù)據(jù)庫中,關(guān)系通過主鍵和外鍵維護
RDBMS(關(guān)系數(shù)據(jù)庫管理系統(tǒng))的特點數(shù)據(jù)以表格形式出現(xiàn)
每行為各種記錄名稱
每列為記錄名稱所對應的數(shù)據(jù)域
許多行和列形成一張表單
若干表單組成Database
RDBMS術(shù)語數(shù)據(jù)庫:關(guān)聯(lián)表的集合
數(shù)據(jù)表:數(shù)據(jù)形成的矩陣
列:每一列的數(shù)據(jù)類型相同
行:一個多元組,其中每一維的數(shù)據(jù)類型可能相同,可能不同
冗余:存儲一個數(shù)據(jù)的副本,降低性能但是提升安全性
主鍵一張表中每一行數(shù)據(jù)稱為一個記錄,每個記錄由多個字段組成
關(guān)系表中的約束:一張表中不能有兩條重復的記錄
不能重復指的是可以通過某個字段唯一區(qū)分出不同的記錄
這個字段稱之為主鍵
對主鍵的要求:記錄一旦插入表中,主鍵最好不再被修改
選取主鍵的基本原則:不使用任何業(yè)務相關(guān)的字段作為主鍵
業(yè)務無關(guān)的字段,稱之為id
常見的id類型自增整數(shù)
全局唯一的GUID,全局唯一的字符串
使用INT自增作為ID,可能導致溢出的問題
聯(lián)合主鍵
兩個或多個字段被設置為主鍵
允許一列重復,只要可以通過多個主鍵唯一確定記錄即可
使得復雜度上升,不建議使用
外鍵
一對多表-表之間記錄建立關(guān)系
兩個表的關(guān)系是一對多的,表示表A的一個記錄對應表B的多個記錄
找到表B中的某個記錄對應的表A中的記錄,只需要在表B的記錄中加上一列,表示這個記錄對應的表A中記錄的主鍵id,有點抽象,可以看這個例子外鍵
實際上,外鍵不是通過列名實現(xiàn)的,而是通過外鍵約束實現(xiàn)的
ALTER TABLE students
ADD CONSTRAINT fk_class_id
FOREIGN KEY (class_id)
REFERENCES classes (id);
做幾點說明第二行指定外鍵約束的名稱
第三行指定class_id作為外鍵
第四行將外鍵關(guān)聯(lián)到classes表的id列
外鍵約束還能保證不插入無效的數(shù)據(jù),插入的數(shù)據(jù)需要檢查外鍵是否有效
外鍵約束的缺點:降低數(shù)據(jù)庫的性能,將class_id視為一個普通的列,應用程序自身檢查邏輯的正確性
刪除外鍵約束,通過ALTER TABLE實現(xiàn)
ALTER TABLE students
DROP FOREIGN KEY fk_class_id;
多對多通過兩個一對多關(guān)系實現(xiàn)的
引入中間表,關(guān)聯(lián)兩個一對多關(guān)系
一對一一個表中的記錄對應另一個表中的唯一記錄
student對應contact,在contact表中添加唯一一列student_id
合并兩個表?student沒有contact
一對一關(guān)系存在的另一個原因是存在熱數(shù)據(jù)的問題,一個記錄中,某個字段被經(jīng)常用到,另一些字段用到的概率較小,這樣拆分成兩個表可以提升查詢的效率
比如一個存儲用戶信息的表user,我們將其拆分成user_info和user_profiles,前者被用到的概率大,這樣我們就只用查前面的表就能獲得所需信息
索引
對于關(guān)系數(shù)據(jù)庫,含有許多條記錄,我們?yōu)榱丝焖僬业侥硹l記錄,可以使用索引。
對于一個student表,有如下列id,主鍵
class_id班級表外鍵
name
GPA
如果我們要按照GPA列進行查詢,可以對GPA列創(chuàng)建索引
ALTER TABLE students
ADD INDEX idx_GPA(GPA);
說明:第二條語句創(chuàng)建了一個名稱為idx_GPA,使用GPA列的索引,索引名稱是任意的,如果索引有多列,可以在括號中依次寫上
ALTER TABLE students
ADD INDEX idx_name_score (name, score);
索引其實是通過一個散列表實現(xiàn)的,只要這個索引的散列性越好,通過這個索引查找記錄的效率就越高
對于主鍵,自動創(chuàng)建主鍵索引,主鍵索引保證唯一
索引可以提升查找效率,但是更新刪除記錄時會導致修改索引,影響更新效率
唯一索引
設計關(guān)系數(shù)據(jù)表的時候,我們往往會遇到一些看上去不會重復的列,比如身份證號,郵箱地址。之前說過這些列不適合作為主鍵,但是我們可以為這些列添加唯一索引。
添加唯一索引的樣例如下
ALTER TABLE students
ADD UNIQUE INDEX uni_name (name);
UNIQUE關(guān)鍵字告訴SQL添加的是唯一索引
也可以對某個列添加唯一約束但是不創(chuàng)建唯一索引
ALTER TABLE students
ADD CONSTRAINT uni_name UNIQUE (name);
在關(guān)系數(shù)據(jù)庫中查詢的時候,如果有索引,數(shù)據(jù)庫系統(tǒng)就會根據(jù)索引來提高查找效率。索引用于數(shù)據(jù)庫查找的優(yōu)化。
總結(jié)
以上是生活随笔為你收集整理的MySQL什么是关系_MySQL教程-关系模型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 500万内“最好”的车 在中国没能火起来
- 下一篇: php mysql 查询时间_PHP-M