日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

[转]数据库主键设计文章绘粹

發布時間:2025/3/15 数据库 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [转]数据库主键设计文章绘粹 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在我們的數據庫設計中,不可逃避的就是數據庫表的主鍵,可能有很多朋友沒有深入思考過,主鍵的設計對整個數據庫的設計影響很大,因此我們不得不要重視起來。 主鍵的必要性: 有些朋友可能不提倡數據庫表必須要主鍵,但在我的思考中,覺得每個表都應該具有主鍵,不管是單主鍵還是雙主鍵,主鍵的存在就代表著表結構的完整性,表的記錄必須得有唯一區分的字段,主鍵主要是用于其他表的外鍵關聯,本記錄的修改與刪除,當我們沒有主鍵時,這些操作會變的非常麻煩。 主鍵的無意義性: 我強調主鍵不應該具有實際的意義,這可能對于一些朋友來說不太認同,比如訂單表吧,會有“訂單編號”字段,而這個字段呢在業務實際中本身就是應該具有唯一性,具有唯一標識記錄的功能,但我是不推薦采用訂單編號字段作為主鍵的,因為具有實際意義的字段,具有“意義更改”的可能性,比如訂單編號在剛開始的時候我們一切順利,后來客戶說“訂單可以作廢,并重新生成訂單,而且訂單號要保持原訂單號一致”,這樣原來的主鍵就面臨危險了。因此,具有唯一性的實際字段也代表可以作為主鍵。因此,我推薦是新設一個字段專門用為主鍵,此主鍵本身在業務邏輯上不體現,不具有實際意義。而這種主鍵在一定程序增加了復雜度,所以要視實際系統的規模大小而定,對于小項目,以后擴展不會很大的話,也查允許用實際唯一的字段作主鍵的。 主鍵的選擇 ??? 我們現在在思考一下,應該采用什么來作表的主鍵比較合理,申明一下,主鍵的設計沒有一個定論,各人有各人的方法,哪怕同一個,在不同的項目中,也會采用不同的主鍵設計原則。 第一:編號作主鍵 ???? 此方法就是采用實際業務中的唯一字段的“編號”作為主鍵設計,這在小型的項目中是推薦這樣做的,因為這可以使項目比較簡單化,但在使用中卻可能帶來一些麻煩,比如要進行“編號修改”時,可能要涉及到很多相關聯的其他表,就象黎叔說的“后果很嚴重”;還有就是上面提到的“業務要求允許編號重復時”,我們再那么先知,都無法知道業務將會修改成什么? 第二:自動編號主鍵 ????? 這種方法也是很多朋友在使用的,就是新建一個ID字段,自動增長,非常方便也滿足主鍵的原則,優點是:數據庫自動編號,速度快,而且是增量增長,聚集型主鍵按順序存放,對于檢索非常有利;數字型的,占用空間小,易排序,在程序中傳遞也方便;如果通過非系統增加記錄(比如手動錄入,或是用其他工具直接在表里插入新記錄,或老系統數據導入)時,非常方便,不用擔心主鍵重復問題。 ????? 缺點:其實缺點也就是來自其優點,就是因為自動增長,在手動要插入指定ID的記錄時會顯得麻煩,尤其是當系統與其他系統集成時,需要數據導入時,很難保證原系統的ID不發生主鍵沖突(前提是老系統也是數字型的);如果其他系統主鍵不是數字型那就麻煩更大了,會導致修改主鍵數據類型了,這也會導致其他相關表的修改,后果同樣很嚴重;就算其他系統也是數字型的,在導入時,為了區分新老數據,可能想在老數據主鍵前統一加一個“o”(old)來表示這是老數據,那么自動增長的數字型又面臨一個挑戰。 第三:Max加一 ??? 由于自動編號存在那些問題,所以有些朋友就采用自己生成,同樣是數字型的,只是把自動增長去掉了,采用在Insert時,讀取Max值后加一,這種方法可以避免自動編號的問題,但也存在一個效率問題,如果記錄非常大的話,那么Max()也會影響效率的;更嚴重的是并發性問題,如果同時有兩人讀到相同的Max后,加一后插入的ID值會重復,這已經是有經驗教訓的了。 第四:自制加一 ???? 考慮Max加一的效率后,有人采用自制加一,也就是建一個特別的表,字段為:表名,當前序列值。這樣在往表中插入值時,先從此表中找到相應表的最大值后加一,進行插入,有人可能發現,也可能會存在并發處理,這個并發處理,我們可以采用lock線程的方式來避免,在生成此值的時,先Lock,取到值以后,再unLock出來,這樣不會有兩人同時生成了。這比Max加一的速度要快多了。但同樣存在一個問題:在與其他系統集成時,脫離了系統中的生成方法后,很麻煩保證自制表中的最大值與導入后的保持一致,而且數字型都存在上面講到的“o”老數據的導入問題。因此在“自制加一”中可以把主鍵設為字符型的。字符型的自制加一我倒是蠻推薦的,應該字符型主鍵可以應付很多我們意想不到的情況。 第五:GUID主鍵 ??? 目前一個比較好的主鍵是采用GUID,當然我是推薦主鍵還是字符型的,但值由GUID生成,GUID是可以自動生成,也可以程序生成,而且鍵值不可能重復,可以解決系統集成問題,幾個系統的GUID值導到一起時,也不會發生重復,就算有“o”老數據也可以區分,而且效率很高,在.NET里可以直接使用System.Guid.NewGuid()進行生成,在SQL里也可以使用NewID()生成。優點是: 同 IDENTITY 列相比,uniqueidentifier 列可以通過 NewID() 函數提前得知新增加的行 ID,為應用程序的后續處理提供了很大方便。 便于數據庫移植,其它數據庫中并不一定具有 IDENTITY 列,而 Guid 列可以作為字符型列轉換到其它數據庫中,同時將應用程序中產生的 GUID 值存入數據庫,它不會對原有數據帶來影響。 便于數據庫初始化,如果應用程序要加載一些初始數據, IDENTITY 列的處理方式就比較麻煩,而 uniqueidentifier 列則無需任何處理,直接用 T-SQL 加載即可。 便于對某些對象或常量進行永久標識,如類的 ClassID,對象的實例標識,UDDI 中的聯系人、服務接口、tModel標識定義等。 缺點是: GUID 值較長,不容易記憶和輸入,而且這個值是隨機、無順序的 GUID 的值有 16 個字節,與其它那些諸如 4 字節的整數相比要相對大一些。這意味著如果在數據庫中使用 uniqueidentifier 鍵,可能會帶來兩方面的消極影響:存儲空間增大;索引時間較慢。 我也不是推薦GUID最好,其實在不同的情況,我們都可以采用上面的某一種方式,思考了一些利與弊,也方便大家在進行設計時參考。這些也只是我的一點思考而已,而且可能我知識面限制,會有一些誤論在里面,希望大家有什么想法歡迎討論。 http://www.cnblogs.com/tintown/archive/2005/03/02/111459.html

本文出自 51CTO.COM技術博客

1.是否要采用GUID作為主鍵

用GUID作主鍵有它的優勢與不足.優勢是GUID具有唯一性,在任何情況下,可以產生全球唯一的值.這是GUID最大的優勢,也方便數據導入,比如要求從另一個系統中把數據導入進來,那么,不用擔心,導入時,會導致主鍵沖突.不足是GUID值太復雜.不易記憶,因為有時,難免我們會用記錄的方式,來進行記錄判斷.而且數據太長,影響數據庫效率.GUID的產生不是以一定的次序產生,對于按主鍵物理排序的數據庫來說,如果在記錄的前部插入一條記錄,可能會導致后面N次方的數據條數后移.這將導致數據插入效率.因此GUID的采用應該要慎重.

2.是否要采用自動遞增的方式

對于以前談到的主鍵,要求唯一性,因此大家都用自動遞增的方式.這樣的方式是非常不可取的.可能是為了方便插入記錄時,不必去人為創建主鍵值.以為這樣會方便,其實不是的.帶來的麻煩要遠遠勝于這種所謂的"方便".第一:數據導入不方便,經常會有從另一系統導入數據進來,自動遞增的主鍵,將不允許原表中的ID被導入進來.這會導致主鍵丟失.第二:對于象訂單這樣的有主外鍵的表來說,如果訂單的"主檔表"主鍵是自動生成的.那么在保存一個訂單時,會要求對主檔表與明細表同進行事務保存,而此時,先要生成一條訂單,然后取出這個訂單自動生成的主鍵,然后再把此作為明細表的一個外鍵,進行明細的保存.這過程中,將變以復雜而且不可行.事務如何處理.訂單主檔表插入記錄后,要是明細保存時遇到錯誤,主檔表記錄還要進行刪除.煩.插入成功以后,還要取出產生的最大值.這將是一個嚴重的浪費.記錄多的話會影響速度,而且會存在并行插入.導致獲取的記錄可能是不正確的. 因此在以上的嚴重問題下,請不要采用自動遞增方式.

3.是否要采用int型作為主鍵

以前大家都采用int型,都是出來主鍵都是數字導致的.其實我們也明白.并不是只是數字的東西就是數字型的.比如電話號碼等.因此對于主鍵,采用int型的優勢是速度快,插入,查詢時都可能會比其他的方式快.但我這種快的效果也未必有多明顯,比如以varchar(15)為例,物理主鍵排序的數據,會自動以主鍵進行物理數據排序.因此,就算是字符型的數據,在插入時也會插入到相應的物理位置上,也就是說,在插入時可能會影響一些速度.但在以后的查詢中,速度影響不會太明顯.而我要說的,不采用int型作為主鍵,不是說,里面不存數據.我還是建議大家在主鍵中存放數字,這樣的排序比較要比夾雜字母的排序來的快,之所以要采用字符型,也是為以后的數據導入作準備,有一天,會要求從其他表導入數據時,可以在導入數據的主鍵上加一個特定字母來避免與原主鍵沖突.比如在導入數據的主鍵前加一個"N"字母.這也就不用擔心,要求導入數據表中的主鍵是數字型還是字符型了.

4.是否采用編號來定義主鍵

這個問題是老生常談了.主鍵設計有個原則,就是主鍵不應具有任何實際意義.這條其實是非常重要,有人就是覺得編號本身是唯一的,可以作為主鍵用,但可能會為以后帶來麻煩.因為帶有實際意義的字段,還是存在被修改的可能性.而對于主鍵最大的忌諱就是修改主鍵,這可能會導致非常嚴重的不可估計的后果.比如學生編號,平時以為永遠不會修改,但修改的可能還是會存在.

還有一種,表面上是唯一的,但實際上應該是允許重復的.我舉個例子,訂單吧,訂單編號應該是唯一吧.是的.可是會存在這樣的情況,一張原來的訂單是因為某個原因,要求訂單作廢.那好給訂單的狀態標識為"cancel".然后允許再次錄入同樣編號的訂單.因此.對于這樣的情況下在,雖然有效的訂單編號只有一個,但在數據庫角度會允許編號重復.所以不管如何,還是建議大家為表都建一個沒有任何意義的主鍵,如ID.

因此,總結一下,我在設計主鍵,會采用字符型的.不采用自動遞增,在新增記錄時,系統生成主鍵值.一般為全數字進行存入,至于主鍵值的生成規則,可以按需求進行規則定義.如果沒有特殊的要求,只是為了保持唯一,可以定義一個字段存放一個數值.在生成時,自動加一.然后再存回去.這也比從一個表中尋找最大值要來的快吧.

http://chavez.blogdriver.com/chavez/624259.html

轉載于:https://www.cnblogs.com/xinyuxin912/archive/2008/06/25/1229910.html

總結

以上是生活随笔為你收集整理的[转]数据库主键设计文章绘粹的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。