最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SQL關(guān)系模型的知識(shí)梳理總結(jié)

 更新時(shí)間:2021年10月12日 09:47:21   作者:Ezail_xdu  
這篇文章主要為大家介紹了SQL關(guān)系模型,文中對(duì)SQL關(guān)系模型的知識(shí)作了詳細(xì)的梳理總結(jié),有需要的朋友可以借鑒參考下希望能夠有所幫助

關(guān)系模型

關(guān)系數(shù)據(jù)庫(kù)是建立在關(guān)系模型上的。而關(guān)系模型本質(zhì)上就是若干個(gè)存儲(chǔ)數(shù)據(jù)的二維表,可以把它們看作很多Excel表。

表的每一行稱為記錄(Record),記錄是一個(gè)邏輯意義上的數(shù)據(jù)。

表的每一列稱為字段(Column),同一個(gè)表的每一行記錄都擁有相同的若干字段。

字段定義了數(shù)據(jù)類型(整型、浮點(diǎn)型、字符串、日期等),以及是否允許為NULL。注意NULL表示字段數(shù)據(jù)不存在。一個(gè)整型字段如果為NULL不表示它的值為0,同樣的,一個(gè)字符串型字段為NULL也不表示它的值為空串''。

通常情況下,字段應(yīng)該避免允許為NULL。不允許為NULL可以簡(jiǎn)化查詢條件,加快查詢速度,也利于應(yīng)用程序讀取數(shù)據(jù)后無需判斷是否為NULL。

和Excel表有所不同的是,關(guān)系數(shù)據(jù)庫(kù)的表和表之間需要建立“一對(duì)多”,“多對(duì)一”和“一對(duì)一”的關(guān)系,這樣才能夠按照應(yīng)用程序的邏輯來組織和存儲(chǔ)數(shù)據(jù)。

在關(guān)系數(shù)據(jù)庫(kù)中,關(guān)系是通過主鍵和外鍵來維護(hù)的。

主鍵

例如,假設(shè)我們把name字段作為主鍵,那么通過名字小明或小紅就能唯一確定一條記錄。但是,這么設(shè)定,就沒法存儲(chǔ)同名的同學(xué)了,因?yàn)椴迦胂嗤麈I的兩條記錄是不被允許的。

對(duì)主鍵的要求,最關(guān)鍵的一點(diǎn)是:記錄一旦插入到表中,主鍵最好不要再修改,因?yàn)橹麈I是用來唯一定位記錄的,修改了主鍵,會(huì)造成一系列的影響。

由于主鍵的作用十分重要,如何選取主鍵會(huì)對(duì)業(yè)務(wù)開發(fā)產(chǎn)生重要影響。如果我們以學(xué)生的身份證號(hào)作為主鍵,似乎能唯一定位記錄。然而,身份證號(hào)也是一種業(yè)務(wù)場(chǎng)景,如果身份證號(hào)升位了,或者需要變更,作為主鍵,不得不修改的時(shí)候,就會(huì)對(duì)業(yè)務(wù)產(chǎn)生嚴(yán)重影響。

所以,選取主鍵的一個(gè)基本原則是:不使用任何業(yè)務(wù)相關(guān)的字段作為主鍵。

因此,身份證號(hào)、手機(jī)號(hào)、郵箱地址這些看上去可以唯一的字段,均不可用作主鍵。

作為主鍵最好是完全業(yè)務(wù)無關(guān)的字段,我們一般把這個(gè)字段命名為id。

外鍵

一對(duì)多

當(dāng)我們用主鍵唯一標(biāo)識(shí)記錄時(shí),我們就可以在students表中確定任意一個(gè)學(xué)生的記錄:

id name other columns…
1 小明
2 小紅

我們還可以在classes表中確定任意一個(gè)班級(jí)記錄:

id name other columns…
1 一班
2 二班

但是我們?nèi)绾未_定students表的一條記錄,例如,id=1的小明,屬于哪個(gè)班級(jí)呢?

由于一個(gè)班級(jí)可以有多個(gè)學(xué)生,在關(guān)系模型中,這兩個(gè)表的關(guān)系可以稱為“一對(duì)多”,即一個(gè)classes的記錄可以對(duì)應(yīng)多個(gè)students表的記錄。

為了表達(dá)這種一對(duì)多的關(guān)系,我們需要在students表中加入一列class_id,讓它的值與classes表的某條記錄相對(duì)應(yīng):

id class_id name other columns…
1 1 小明
2 1 小紅
5 2 小白

這樣,我們就可以根據(jù)class_id這個(gè)列直接定位出一個(gè)students表的記錄應(yīng)該對(duì)應(yīng)到classes的哪條記錄。

例如:

小明的class_id1,因此,對(duì)應(yīng)的classes表的記錄是id=1的一班;小紅的class_id1,因此,對(duì)應(yīng)的classes表的記錄是id=1的一班;小白的class_id2,因此,對(duì)應(yīng)的classes表的記錄是id=2的二班。

students表中,通過class_id的字段,可以把數(shù)據(jù)與另一張表關(guān)聯(lián)起來,這種列稱為外鍵。

外鍵并不是通過列名實(shí)現(xiàn)的,而是通過定義外鍵約束實(shí)現(xiàn)的:

ALTER TABLE students
ADD CONSTRAINT fk_class_id
FOREIGN KEY (class_id)
REFERENCES classes(id)

其中,外鍵約束的名稱fk_class_id可以任意,FOREIGN KEY (class_id)指定了class_id作為外鍵,REFERENCES classes (id)指定了這個(gè)外鍵將關(guān)聯(lián)到classes表的id列(即classes表的主鍵)。

通過定義外鍵約束,關(guān)系數(shù)據(jù)庫(kù)可以保證無法插入無效的數(shù)據(jù)。**即如果classes表不存在id=99的記錄,students表就無法插入class_id=99的記錄。

由于外鍵約束會(huì)降低數(shù)據(jù)庫(kù)的性能,大部分互聯(lián)網(wǎng)應(yīng)用程序?yàn)榱俗非笏俣?,并不設(shè)置外鍵約束,而是僅靠應(yīng)用程序自身來保證邏輯的正確性。這種情況下,class_id僅僅是一個(gè)普通的列,只是它起到了外鍵的作用而已。

要?jiǎng)h除一個(gè)外鍵約束,也是通過ALTER TABLE實(shí)現(xiàn)的:

ALTER TABLE students
DROP FOREIGN KEY fk_class_id

注意:刪除外鍵約束并沒有刪除外鍵這一列。刪除列是通過DROP COLUMN ...實(shí)現(xiàn)的。

多對(duì)多

通過一個(gè)表的外鍵關(guān)聯(lián)到另一個(gè)表,我們可以定義出一對(duì)多關(guān)系。有些時(shí)候,還需要定義“多對(duì)多”關(guān)系。例如,一個(gè)老師可以對(duì)應(yīng)多個(gè)班級(jí),一個(gè)班級(jí)也可以對(duì)應(yīng)多個(gè)老師,因此,班級(jí)表和老師表存在多對(duì)多關(guān)系。

多對(duì)多關(guān)系實(shí)際上是通過兩個(gè)一對(duì)多關(guān)系實(shí)現(xiàn)的,即通過一個(gè)中間表,關(guān)聯(lián)兩個(gè)一對(duì)多關(guān)系,就形成了多對(duì)多關(guān)系

一對(duì)一

一對(duì)一關(guān)系是指,一個(gè)表的記錄對(duì)應(yīng)到另一個(gè)表的唯一一個(gè)記錄。

細(xì)心的話會(huì)發(fā)現(xiàn),既然是一對(duì)一關(guān)系,那為啥不給students表增加一個(gè)mobile列,這樣就能合二為一了?

如果業(yè)務(wù)允許,完全可以把兩個(gè)表合為一個(gè)表。但是,有些時(shí)候,如果某個(gè)學(xué)生沒有手機(jī)號(hào),那么,contacts表就不存在對(duì)應(yīng)的記錄。實(shí)際上,一對(duì)一關(guān)系準(zhǔn)確地說,是contacts表一對(duì)一對(duì)應(yīng)students表。

還有一些應(yīng)用會(huì)把一個(gè)大表拆成兩個(gè)一對(duì)一的表,目的是把經(jīng)常讀取和不經(jīng)常讀取的字段分開,以獲得更高的性能。例如,把一個(gè)大的用戶表分拆為用戶基本信息表user_info和用戶詳細(xì)信息表user_profiles,大部分時(shí)候,只需要查詢user_info表,并不需要查詢user_profiles表,這樣就提高了查詢速度。

總結(jié):關(guān)系數(shù)據(jù)庫(kù)通過外鍵可以實(shí)現(xiàn)一對(duì)多、多對(duì)多和一對(duì)一的關(guān)系。外鍵既可以通過數(shù)據(jù)庫(kù)來約束,也可以不設(shè)置約束,僅依靠應(yīng)用程序的邏輯來保證。

索引

索引的概念與用法

在關(guān)系數(shù)據(jù)庫(kù)中,如果有上萬甚至上億條記錄,在查找記錄的時(shí)候,想要獲得非常快的速度,就需要使用索引。

索引是關(guān)系數(shù)據(jù)庫(kù)中對(duì)某一列或多個(gè)列的值進(jìn)行預(yù)排序的數(shù)據(jù)結(jié)構(gòu)。**通過使用索引,可以讓數(shù)據(jù)庫(kù)系統(tǒng)不必掃描整個(gè)表,而是直接定位到符合條件的記錄,這樣就大大加快了查詢速度。

例如,對(duì)于students表:

id class_id name gender score
1 1 小明 M 90
2 1 小紅 F 95
3 1 小軍 M 88

如果要經(jīng)常根據(jù)score列進(jìn)行查詢,就可以對(duì)score列創(chuàng)建索引:

ALTER TABLE students
ADD INDEX idx_score(score);

使用ADD INDEX idx_score (score)就創(chuàng)建了一個(gè)名稱為idx_score,使用列score的索引。

索引名稱是任意的,索引如果有多列,可以在括號(hào)里依次寫上。

ALTER TABLE students
ADD INDEX idx_name_score (name, score);

索引的效率取決于索引列的值是否散列,即該列的值如果越互不相同,那么索引效率越高。**反過來,如果記錄的列存在大量相同的值,例如gender列,大約一半的記錄值是M,另一半是F,因此,對(duì)該列創(chuàng)建索引就沒有意義。

可以對(duì)一張表創(chuàng)建多個(gè)索引。索引的優(yōu)點(diǎn)是提高了查詢效率,缺點(diǎn)是在插入、更新和刪除記錄時(shí),需要同時(shí)修改索引,因此,索引越多,插入、更新和刪除記錄的速度就越慢。

對(duì)于主鍵,關(guān)系數(shù)據(jù)庫(kù)會(huì)自動(dòng)對(duì)其創(chuàng)建主鍵索引。使用主鍵索引的效率是最高的,因?yàn)橹麈I會(huì)保證絕對(duì)唯一。

唯一索引

在設(shè)計(jì)關(guān)系數(shù)據(jù)表的時(shí)候,看上去唯一的列,例如身份證號(hào)、郵箱地址等,因?yàn)樗麄兙哂袠I(yè)務(wù)含義,因此不宜作為主鍵。

但是,這些列根據(jù)業(yè)務(wù)要求,又具有唯一性約束:即不能出現(xiàn)兩條記錄存儲(chǔ)了同一個(gè)身份證號(hào)。這個(gè)時(shí)候,就可以給該列添加一個(gè)唯一索引。例如,我們假設(shè)students表的name不能重復(fù):

ALTER TABLE students
ADD UNIQUE INDEX uni_name(name);

通過UNIQUE關(guān)鍵字我們就添加了一個(gè)唯一索引。

也可以只對(duì)某一列添加一個(gè)唯一約束而不創(chuàng)建唯一索引:

ALTER TABLE students
ADD CONSTRAINT uni_name UNIQUE (name);

這種情況下,name列沒有索引,但仍然具有唯一性保證。

無論是否創(chuàng)建索引,對(duì)于用戶和應(yīng)用程序來說,使用關(guān)系數(shù)據(jù)庫(kù)不會(huì)有任何區(qū)別。

這里的意思是說,當(dāng)我們?cè)跀?shù)據(jù)庫(kù)中查詢時(shí),如果有相應(yīng)的索引可用,數(shù)據(jù)庫(kù)系統(tǒng)就會(huì)自動(dòng)使用索引來提高查詢效率,如果沒有索引,查詢也能正常執(zhí)行,只是速度會(huì)變慢。

因此,索引可以在使用數(shù)據(jù)庫(kù)的過程中逐步優(yōu)化。

Tips

1.通過對(duì)數(shù)據(jù)庫(kù)表創(chuàng)建索引,可以提高查詢速度。但索引越多,插入和更新的速度越慢。

2.索引加得不好,查詢不會(huì)變快,甚至?xí)兟?/p>

3.通過創(chuàng)建唯一索引,可以保證某一列的值具有唯一性。

4.數(shù)據(jù)庫(kù)索引對(duì)于用戶和應(yīng)用程序來說都是透明的。

以上就是SQL關(guān)系模型的知識(shí)梳理總結(jié)的詳細(xì)內(nèi)容,更多關(guān)于SQL關(guān)系模型的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • leaf方案實(shí)現(xiàn)美團(tuán)點(diǎn)評(píng)分布式ID生成系統(tǒng)

    leaf方案實(shí)現(xiàn)美團(tuán)點(diǎn)評(píng)分布式ID生成系統(tǒng)

    在復(fù)雜分布式系統(tǒng)中,往往需要對(duì)大量的數(shù)據(jù)和消息進(jìn)行唯一標(biāo)識(shí)。如在美團(tuán)點(diǎn)評(píng)的金融、支付、餐飲、酒店、貓眼電影等產(chǎn)品的系統(tǒng)中,數(shù)據(jù)日漸增長(zhǎng),對(duì)數(shù)據(jù)分庫(kù)分表后需要有一個(gè)唯一ID來標(biāo)識(shí)一條數(shù)據(jù)或消息,數(shù)據(jù)庫(kù)的自增ID顯然不能滿足需求
    2022-01-01
  • 簡(jiǎn)單聊聊SQL注入的原理以及一般步驟

    簡(jiǎn)單聊聊SQL注入的原理以及一般步驟

    所謂SQL注入式攻擊,就是攻擊者把SQL命令插入到Web表單的輸入域或頁(yè)面請(qǐng)求的查詢字符串,欺騙服務(wù)器執(zhí)行惡意的SQL命令,下面這篇文章主要給大家介紹了關(guān)于SQL注入的原理以及一般步驟的相關(guān)資料,需要的朋友可以參考下
    2022-02-02
  • Navicat?Premium?12.0.29安裝與激活超詳細(xì)教程

    Navicat?Premium?12.0.29安裝與激活超詳細(xì)教程

    這篇文章主要介紹了Navicat?Premium?12.0.29安裝與激活超詳細(xì)教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • 交叉表查詢sql語(yǔ)句

    交叉表查詢sql語(yǔ)句

    交叉表查詢sql語(yǔ)句...
    2007-06-06
  • DBeaver執(zhí)行外部sql文件詳細(xì)圖文教程

    DBeaver執(zhí)行外部sql文件詳細(xì)圖文教程

    DBeaver最近才使用,以前使用的PL/SQL,有些不是很熟悉,記錄下來,下面這篇文章主要給大家介紹了關(guān)于DBeaver執(zhí)行外部sql文件的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • DBeaver操作所有數(shù)據(jù)庫(kù)管理工具使用詳解

    DBeaver操作所有數(shù)據(jù)庫(kù)管理工具使用詳解

    這篇文章主要為大家介紹了一款操作所有數(shù)據(jù)庫(kù)工具DBeaver使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Access與sql server的語(yǔ)法區(qū)別總結(jié)

    Access與sql server的語(yǔ)法區(qū)別總結(jié)

    這篇文章主要介紹了Access與sql server的語(yǔ)法區(qū)別總結(jié),需要的朋友可以參考下
    2007-03-03
  • HQL查詢語(yǔ)言的使用介紹

    HQL查詢語(yǔ)言的使用介紹

    HQL是Hibernate Query Language的縮寫,語(yǔ)法很想SQL,但是HQL是一種面向?qū)ο蟮牟樵冋Z(yǔ)言。SQL的操作對(duì)象是數(shù)據(jù)列、表等數(shù)據(jù)庫(kù)對(duì)象,而HQL操作的是類、實(shí)例、屬性
    2013-10-10
  • dapper使用Insert或update時(shí)部分字段不映射到數(shù)據(jù)庫(kù)

    dapper使用Insert或update時(shí)部分字段不映射到數(shù)據(jù)庫(kù)

    我們?cè)谑褂胐apper的insert或update方法時(shí)可能會(huì)遇見一些實(shí)體中存在的字段但是,數(shù)據(jù)庫(kù)中不存在的字段,這樣在使用insert時(shí)就是拋出異常提示字段不存在,這個(gè)時(shí)候該怎么解決呢,下面給大家分享示例實(shí)體代碼,感興趣的朋友一起看看吧
    2023-12-12
  • SQL數(shù)據(jù)庫(kù)的所有命令(函數(shù)、運(yùn)算符)匯總大全

    SQL數(shù)據(jù)庫(kù)的所有命令(函數(shù)、運(yùn)算符)匯總大全

    結(jié)構(gòu)化查詢語(yǔ)言(Structured?Query?Language)簡(jiǎn)稱SQL,結(jié)構(gòu)化查詢語(yǔ)言是一種數(shù)據(jù)庫(kù)查詢和程序設(shè)計(jì)語(yǔ)言,用于存取數(shù)據(jù)以及查詢、更新和管理關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)。sql語(yǔ)句就是對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作的一種語(yǔ)言。
    2023-01-01

最新評(píng)論

城口县| 南京市| 昌黎县| 龙川县| 玛纳斯县| 个旧市| 平山县| 丰宁| 固阳县| 四子王旗| 五峰| 银川市| 阿坝县| 邹平县| 二手房| 武冈市| 龙游县| 潼关县| 吉安市| 满洲里市| 旬阳县| 将乐县| 略阳县| 洪泽县| 特克斯县| 巩义市| 镇巴县| 满洲里市| 华宁县| 政和县| 元江| 谢通门县| 厦门市| 巴中市| 连山| 长泰县| 阳春市| 英吉沙县| 四子王旗| 汶上县| 桐梓县|