外來鍵的主要作用 保持資料的一致性 完整性

2022-08-03 06:24:08 字數 3663 閱讀 7560

+-------+   ref   +-------+

|  sub  | ------> |  main |

+-------+         +-------+

從表(sub)的某列引用(ref)主表(main)的某列的值。

比方學生表有個學生編號(sid),分數表中的學生列(stu)引用學生表的學 生編號,此時對於分數表的 stu 來說。學生表的 sid 就是外來鍵。

從表也叫外來鍵表,主表也叫主鍵表、外表,列也叫字段。

所以在設計的時候。就給表1加入乙個外來鍵,這個外來鍵就是表2中的學號字段。那麼這樣表1就是主表,表2就是子表

你的主從關係理解顛倒了。你的圖中,表1的確是主表。表2是子表,但不是叫做給表1加入乙個外來鍵,而是給表2加入乙個外來鍵,表2中的學號 欄位就叫外來鍵,它是表1學號字段的主鍵。

你能夠這樣說:表1的學號字段是表2的外來鍵。

你貼的已經解釋了。

為了一張表記錄的資料不要太過冗餘。這和軟體project的模組化思想差點兒相同類似,僅僅只是在資料庫中是對錶關係進行解耦,盡量讓表 記錄的資料單一化。就如你貼的中,把成績和學生資訊放在一張表中就太冗餘了,成績全然能夠以學生的id作為區分標識。

你想想,你的圖中的第一章表切割成了表1和表2,表2的學號引用了表1的學號字段作為外來鍵,假設不建立外來鍵。僅僅是和表1一樣單純性 地設立乙個學號字段。那麼和建立外來鍵有什麼差別呢?

比方表1中張三的學號為20140900001,那麼我在表2中插資料的時候在學號字段插20140900001來記錄張三的成績不也是做到了表 的解耦了嗎?

這裡存在的問題是。在不設定外來鍵的情況下。表2的學號字段和表1的學號字段是沒有關聯的。僅僅是你自己覺得他們有關係而已。資料庫並 不覺得它倆有關係。也就是說,你在表2的學號字段插了乙個值(比方20140999999),可是這個值在表1中並沒有,這個時候,資料庫還是允 許你插入的,它並不會對插入的資料做關係檢查。然而在設定外來鍵的情況下。你插入表2學號字段的值必需要求在表1的學號字段能找到。 同一時候。假設你要刪除表1的某個學號字段。必須保證表2中沒有引用該字段值的列,否則就沒法刪除。

這就是所謂的保持資料的一致性和完整性。你想。如 果表2還引用表1的某個學號,你卻把表1中的這個學號刪了,表2就不知道這個學號相應的學生是哪個學生。

資料的一致性還包含資料型別的一致性(這 個見以下就知道了)。

從表的字段必須與外來鍵型別同樣(如上。分數表 stu 的型別必須和學生表 sid 的型別同樣,比方都是 int(10) 型別)

外來鍵必須是主表的唯一鍵(如上。學生表 sid 是主鍵,而主鍵是唯一的。所以能夠作為分數表 stu 的外來鍵)

有關聯的字段(如上,分數表之所以使用學生表的 sid 是由於兩者有關聯,分數表記錄的是學生的分數,而學生能夠用 sid 來唯 一標識)

避免使用復合鍵(也就是說從表能夠同一時候引用多個外表的字段作為乙個外來鍵,一般不推薦這樣的做法)

假設表1有多個外來鍵可不能夠是這種情況,表2中的多個欄位是表1的外來鍵;或者說表1的多個外來鍵是在多個表中

都能夠。由於表1的外來鍵不一定是表2的主鍵,也能夠是唯一鍵(unique)。

比方表2有個主鍵 a,有個唯一鍵 b,表1兩個字段 a' 和 b』 分別引用表2的 a 和 b,這就是多對多的關係了。再或者表2主鍵 a,表3主鍵 b,表1的兩個字段 a' 和 b' 分別引用表2的 a 和表3 的 b。

這個外來鍵能夠不是表1的主鍵,但必須是子表的主鍵。(簡單的說就是。假設乙個欄位是某個表的外來鍵時,那麼該欄位必須是主鍵)

由於你前面就理解錯了,所以這句話本身就是錯的。對於從表來說,外來鍵不一定須要作為從表的主鍵,外來鍵也不一定是外表的主鍵,外表的唯一鍵就能夠作 為從表的外來鍵。

+-------+   ref   +-------+

|  sub  | ------> |  main |

+-------+         +-------+

從表(sub)的某列引用(ref)主表(main)的某列的值。

比方學生表有個學生編號(sid),分數表中的學生列(stu)引用學生表的學 生編號,此時對於分數表的 stu 來說。學生表的 sid 就是外來鍵。

從表也叫外來鍵表,主表也叫主鍵表、外表,列也叫字段。

所以在設計的時候。就給表1加入乙個外來鍵,這個外來鍵就是表2中的學號字段。那麼這樣表1就是主表,表2就是子表

你的主從關係理解顛倒了。你的圖中,表1的確是主表。表2是子表,但不是叫做給表1加入乙個外來鍵,而是給表2加入乙個外來鍵,表2中的學號 欄位就叫外來鍵,它是表1學號字段的主鍵。

你能夠這樣說:表1的學號字段是表2的外來鍵。

你貼的已經解釋了。

為了一張表記錄的資料不要太過冗餘。這和軟體project的模組化思想差點兒相同類似,僅僅只是在資料庫中是對錶關係進行解耦,盡量讓表 記錄的資料單一化。就如你貼的中,把成績和學生資訊放在一張表中就太冗餘了,成績全然能夠以學生的id作為區分標識。

你想想,你的圖中的第一章表切割成了表1和表2,表2的學號引用了表1的學號字段作為外來鍵,假設不建立外來鍵。僅僅是和表1一樣單純性 地設立乙個學號字段。那麼和建立外來鍵有什麼差別呢?

比方表1中張三的學號為20140900001,那麼我在表2中插資料的時候在學號字段插20140900001來記錄張三的成績不也是做到了表 的解耦了嗎?

這裡存在的問題是。在不設定外來鍵的情況下。表2的學號字段和表1的學號字段是沒有關聯的。僅僅是你自己覺得他們有關係而已。資料庫並 不覺得它倆有關係。也就是說,你在表2的學號字段插了乙個值(比方20140999999),可是這個值在表1中並沒有,這個時候,資料庫還是允 許你插入的,它並不會對插入的資料做關係檢查。然而在設定外來鍵的情況下。你插入表2學號字段的值必需要求在表1的學號字段能找到。 同一時候。假設你要刪除表1的某個學號字段。必須保證表2中沒有引用該字段值的列,否則就沒法刪除。

這就是所謂的保持資料的一致性和完整性。你想。如 果表2還引用表1的某個學號,你卻把表1中的這個學號刪了,表2就不知道這個學號相應的學生是哪個學生。

資料的一致性還包含資料型別的一致性(這 個見以下就知道了)。

從表的字段必須與外來鍵型別同樣(如上。分數表 stu 的型別必須和學生表 sid 的型別同樣,比方都是 int(10) 型別)

外來鍵必須是主表的唯一鍵(如上。學生表 sid 是主鍵,而主鍵是唯一的。所以能夠作為分數表 stu 的外來鍵)

有關聯的字段(如上,分數表之所以使用學生表的 sid 是由於兩者有關聯,分數表記錄的是學生的分數,而學生能夠用 sid 來唯 一標識)

避免使用復合鍵(也就是說從表能夠同一時候引用多個外表的字段作為乙個外來鍵,一般不推薦這樣的做法)

假設表1有多個外來鍵可不能夠是這種情況,表2中的多個欄位是表1的外來鍵;或者說表1的多個外來鍵是在多個表中

都能夠。由於表1的外來鍵不一定是表2的主鍵,也能夠是唯一鍵(unique)。

比方表2有個主鍵 a,有個唯一鍵 b,表1兩個字段 a' 和 b』 分別引用表2的 a 和 b,這就是多對多的關係了。再或者表2主鍵 a,表3主鍵 b,表1的兩個字段 a' 和 b' 分別引用表2的 a 和表3 的 b。

這個外來鍵能夠不是表1的主鍵,但必須是子表的主鍵。(簡單的說就是。假設乙個欄位是某個表的外來鍵時,那麼該欄位必須是主鍵)

由於你前面就理解錯了,所以這句話本身就是錯的。對於從表來說,外來鍵不一定須要作為從表的主鍵,外來鍵也不一定是外表的主鍵,外表的唯一鍵就能夠作 為從表的外來鍵。

保持MySQL和Redis的一致性

目前相當系統架構使用的是mysql和redis組合來實現,這兩者在使用過程中對不同場景會對資料一致性有不一樣的要求,大家都知道mysql主要做持久化資料的,redis唯讀資料的,大家都知道redis用來處理高併發情況的多所以我就稍微根據自己專案經驗總結下 方案一.對於實時要求不高的資料,將這些資料放...

一致性Hash演算法的作用

這裡不介紹一致性hash演算法的原理,後面再補充,可以先看下面的文件 什麼是一致性hash演算法?該演算法的原理用一句話將就是將伺服器節點分布到乙個環上,必要時需要增加虛擬節點 對映到真實節點 查詢的時候根據hash演算法定位到環上的某個點,然後再順時針找到最近的乙個可用的伺服器節點。來自上面的鏈結...

主從複製如何保持資料的一致性

讀寫分離 為保證資料庫資料的一致性,我們要求所有對於資料庫的更新操作都是針對主資料庫的,但是讀操作是可以針對從資料庫來進行。大多數站點的資料庫讀操作比寫操作更加密集,而且查詢條件相對複雜,資料庫的大部分效能消耗在查詢操作上了。主從複製資料是非同步完成的,這就導致主從資料庫中的資料有一定的延遲,在讀寫...