主鍵和外來鍵的作用

2021-12-29 21:37:50 字數 3964 閱讀 4964

主鍵和外來鍵是把多個表組織為乙個有效的關聯式資料庫的粘合劑。主鍵和外來鍵的設計對物理資料庫的效能和可用性都有著決定性的影響。

必須將資料庫模式從理論上的邏輯設計轉換為實際的物理設計。而主鍵和外來鍵的結構是這個設計過程的癥結所在。一旦將所設計的資料庫用於了生產環境,就很難對這些鍵進行修改,所以在開發階段就設計好主鍵和外來鍵就是非常必要和值得的。

主鍵:關聯式資料庫依賴於主鍵---它是資料庫物理模式的基石。主鍵在物理層面上只有兩個用途:

1. 惟一地標識一行。

2. 作為乙個可以被外來鍵有效引用的物件。

基於以上這兩個用途,下面給出了我在設計物理層面的主鍵時所遵循的一些原則:

1. 主鍵應當是對使用者沒有意義的。如果使用者看到了乙個表示多對多關係的連線表中的資料,並抱怨它沒有什麼用處,那就證明它的主鍵設計地很好。

2. 主鍵應該是單列的,以便提高連線和篩選操作的效率。

注:使用復合鍵的人通常有兩個理由為自己開脫,而這兩個理由都是錯誤的。其一是主鍵應當具有實際意義,然而,讓主鍵具有意義只不過是給人為地破壞資料庫提供了方便。其二是利用這種方法可以在描述多對多關係的連線表中使用兩個外部鍵來作為主鍵,我也反對這種做法,理由是:復合主鍵常常導致不良的外來鍵,即當連線表成為另乙個從表的主表,而依據上面的第二種方法成為這個表主鍵的一部分,然,這個表又有可能再成為其它從表的主表,其主鍵又有可能成了其它從表主鍵的一部分,如此傳遞下去,越靠後的從表,其主鍵將會包含越多的列了。

3. 永遠也不要更新主鍵。實際上,因為主鍵除了惟一地標識一行之外,再沒有其他的用途了,所以也就沒有理由去對它更新。如果主鍵需要更新,則說明主鍵應對使用者無意義的原則被違反了。

注:這項原則對於那些經常需要在資料轉換或多資料庫合併時進行資料整理的資料並不適用。

4. 主鍵不應包含動態變化的資料,如時間戳、建立時間列、修改時間列等。

5. 主鍵應當有計算機自動生成。如果由人來對主鍵的建立進行干預,就會使它帶有除了惟一標識一行以外的意義。一旦越過這個界限,就可能產生認為修改主鍵的動機,這樣,這種系統用來鏈結記錄行、管理記錄行的關鍵手段就會落入不了解資料庫設計的人的手中。

資料庫外來鍵的使用

外來鍵的作用我認為主要有兩個:乙個是讓資料庫自己通過外來鍵來保證資料的完整性和一致性,乙個就是能夠增加er圖的可讀性。我覺得第二點的重要性甚至比第一點還高。

有些人認為外來鍵的建立會給開發時運算元據庫帶來很大的麻煩,因為資料庫有時候會由於沒有通過外來鍵的檢測而使得開發人員刪除,插入操作失敗,他們覺得這樣很麻煩,其實這正式外來鍵在強制你保證資料的完整性和一致性,這是好事兒。

應該說如果系統比較小,外來鍵的作用可能不會很明顯,如果你的系統後台有幾百個表的話,沒有外來鍵的資料庫設計是我無法想象的,有乙個基礎資料的表:商品,其他表都儲存商品id ,查詢時需要連表來查詢商品的名稱,單據1的商品表中有商品id欄位,單據2的商品表中也有商品id欄位,如果不拉出外鍵的話,當單據1,2都使用商品id為3的商品後,刪除此商品後,再檢視單據1,2的時候就會查不到商品的名稱

當表很少的時候,有人認為可以在程式實現的時候來通過寫指令碼來保證資料的完整性和一致性,也就是在刪除商品的操作的時候去檢測單據1,2中是否已經使用了商品id為3的商品,但是當你寫完指令碼之後系統有增加了乙個單據3

他也儲存商品id找個字段,如果不拉出外鍵,你還是會出現查不到商品名稱的情況,你總不能每增加乙個使用商品id的字段的單據時就回去修改你檢測商品是否被使用的指令碼吧

第二點就是增加er圖的可讀性。這也同樣是在後台資料庫表非常多的時候能夠體現出來的,外來鍵能夠明確的兩個表之間的關係,例如乙個單據的主表和單據的品的子表,如果兩個表沒有拉出外鍵表明關係,且兩個表的位置在er圖中很遠,對於乙個對這個系統不是非常了解的人來說,讓他去理出兩個表之間的關係是很麻煩的,如果你拉出外鍵就算兩個表離的很遠,他也能隨著外來鍵找出他們之間的關係來,er圖的可讀性對於乙個剛剛接觸大型系統的新手來說是極為重要的。

當然,外來鍵的個數也不是沒有個尺度,因為外來鍵拉的過多會使er圖極為混亂(到處都是線) ,所以應該掌握合適的尺度才行,必要的外來鍵必須要拉出來。如果實在不想因為外來鍵過多而造成er圖的混亂,可以對基礎資料的刪除用假刪除的辦法,以避免在沒有外來鍵約束和檢查的情況下造成資料的不一致性。

uniqueidentifier資料型別

uniqueidentifier資料型別可儲存16位元組的二進位制值,其作用與全域性唯一標記符(guid)一樣。guid是唯一的二進位制數:世界上的任何兩台計算機都不會生成重複的guid值。guid主要用於在用於多個節點,多台計算機的網路中,分配必須具有唯一性的識別符號。 在sql中 rowguidcol表示新列是行的全域性唯一標識列。對於每個表只能指派乙個uniqueidentifier 列作為rowguidco列。rowguidcol屬性只能指派給uniqueidentifier列

一 什麼是uniqueidentifier?

uniqqueidentifier 是全域性唯一的標識

p d [3~)f f c e0二 uniqueidentifier 資料型別的列如何賦值?

1 使用 newid()函式 來實現

2 直接將字串的常量轉化成這樣的格式 ******xx-***x-***x-***x-************

舉例:6f9619ff-8b86-d011-b42d-00c04fc964ff 為有效的uniqueidentifier資料

3 直接賦於32位的十六位資料

舉例 0xffffffff00000000ffffffff00000000

三 uniqueidentifier 資料型別 資料實際是怎麼在資料庫中儲存的?

uniqueidentifier 資料型別儲存實際的資料是16個位元組的二進位制值,

uniqueidentifier 可以轉化成實際的字串型和二進位制資料型別

四 newid()函式是如何生成唯一的uniqueidentifier 值的呢?

newid()函式是從他們的網絡卡上的標識數字和cpu時鐘的唯一的數字生成新的uniqueidentifier資料 ,這個資料和guid是一樣的每台計算機能生成全球唯一的值

這樣在多台計算機和多網路之間生成具有唯一性的識別符號

五 使用 uniqueidentifier資料型別的主要的優點

uniqueidentifier 資料型別主要的優點是在使用newid函式生成值的時候是可以保證值的全球唯一性

可以唯一的標識單行的記錄 對於多庫(尤其是多機器,多網段的資料庫的複製)來將比identity來的更有效

其次在使用identity的情況下,我們對自動生成的值是不能修改的,而uniqueidentifier資料型別是可以隨時修改的

六 使用uniqueidentifier的資料型別的缺點

1 對於生成的uniqueidentifier 型別的值來講 ,是無序

在正常顯示相關的資料資訊的時候,返回的資訊是無序的itpub個人空間 p e%a _0`2i l(g!v t0]

對於 identity 為標識的資料顯示的時候,預設的情況下是根據新增記錄的順序來顯示的。這樣,對於uniqueidentifier為主鍵的資訊集 ,還是需要乙個預設標識排序的字段。

2 對於uniqueidentifier 欄位來將資料的實際的資訊為16個位元組,相對來將比identity來講 大的多,相對來將 儲存空間和查詢的效率會降低很多的。

七 在系統資料庫的設計中我們如何對uniqueidentifier,identity ,和可標識的記錄屬性(有實際的含義的資訊)作為主鍵 ,這三種方式 進行取捨

以屬性為主鍵的系統設計情況

在系統設計的過程中

單條資訊中包含可以表示唯一性的屬性(一般不能太多3個以內)而且這樣的屬性是必填字段。在記錄生存週期內一般是不進行改動的,表一般多於50個這樣級別的系統

以屬性為主鍵 ,這樣的方式還是最佳的

舉例: 關於學生的管理資訊系統 以學生的學號為主鍵

以uniqueidentifier 列為主鍵的情況

在需要多個資料庫之間,多個網段之間需要進行資料庫的複製時,我們就需要在每乙個唯一的標識來區別每乙個單條記錄,在沒有合適的屬性來做主鍵的情況下可以用uniqueidentifier列來生成主鍵

以 identity為主鍵的情況

不需要資料庫的複製,和系統比較小的情況下(50表以內)可以用 identity列來生成主鍵,適合於快速開發

SQL的主鍵和外來鍵的作用

sql 的主鍵和外來鍵的作用 外來鍵取值規則 空值或參照的主鍵值。1 插入非空值時,如果主鍵表中沒有這個值,則不能插入。2 更新時,不能改為主鍵表中沒有的值。3 刪除主鍵表記錄時,你可以在建外鍵時選定外來鍵記錄一起級聯刪除還是拒絕刪除。4 更新主鍵記錄時,同樣有級聯更新和拒絕執行的選擇。簡而言之,s...

主鍵和外來鍵

主鍵和外來鍵是把多個表組織為乙個有效的關聯式資料庫的粘合劑。主鍵和外來鍵的設計對物理資料庫的效能和可用性都有著決定性的影響。必須將資料庫模式從理論上的邏輯設計轉換為實際的物理設計。而主鍵和外來鍵的結構是這個設計過程的癥結所在。一旦將所設計的資料庫用於了生產環境,就很難對這些鍵進行修改,所以在開發階段...

主鍵和外來鍵

主鍵的存在就代表著表結構的完整性,表的記錄必須得有唯一區分的字段,主鍵主要是用於其他表的外來鍵關聯,本記錄的修改與刪除,當我們沒有主鍵時,這些操作會變的非常麻煩。我強調主鍵不應該具有實際的意義,這可能對於一些朋友來說不太認同,比如訂單表吧,會有 訂單編號 字段,而這個欄位呢在業務實際中本身就是應該具...