<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

        如何設(shè)計數(shù)據(jù)庫的主鍵

        來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-09 13:36:41
        文檔

        如何設(shè)計數(shù)據(jù)庫的主鍵

        如何設(shè)計數(shù)據(jù)庫的主鍵:有些朋友可能不提倡數(shù)據(jù)庫表必須要主鍵,但在我的思考中,覺得每個表都應(yīng)該具有主鍵,不管是單主鍵還是雙主鍵,主鍵的存在就代表著表結(jié)構(gòu)的完整性,表的記錄必須得有唯一區(qū)分的字段,主鍵主要是用于其他表的外鍵關(guān)聯(lián),本記錄的修改與刪除,當(dāng)我們沒有主鍵時
        推薦度:
        導(dǎo)讀如何設(shè)計數(shù)據(jù)庫的主鍵:有些朋友可能不提倡數(shù)據(jù)庫表必須要主鍵,但在我的思考中,覺得每個表都應(yīng)該具有主鍵,不管是單主鍵還是雙主鍵,主鍵的存在就代表著表結(jié)構(gòu)的完整性,表的記錄必須得有唯一區(qū)分的字段,主鍵主要是用于其他表的外鍵關(guān)聯(lián),本記錄的修改與刪除,當(dāng)我們沒有主鍵時

        有些朋友可能不提倡數(shù)據(jù)庫表必須要主鍵,但在我的思考中,覺得每個表都應(yīng)該具有主鍵,不管是單主鍵還是雙主鍵,主鍵的存在就代表著表結(jié)構(gòu)的完整性,表的記錄必須得有唯一區(qū)分的字段,主鍵主要是用于其他表的外鍵關(guān)聯(lián),本記錄的修改與刪除,當(dāng)我們沒有主鍵時

        有些朋友可能不提倡數(shù)據(jù)庫表必須要主鍵,但在我的思考中,覺得每個表都應(yīng)該具有主鍵,不管是單主鍵還是雙主鍵,主鍵的存在就代表著表結(jié)構(gòu)的完整性,表的記錄必須得有唯一區(qū)分的字段,主鍵主要是用于其他表的外鍵關(guān)聯(lián),本記錄的修改與刪除,當(dāng)我們沒有主鍵時,這些操作會變的非常麻煩。

        我強(qiáng)調(diào)主鍵不應(yīng)該具有實際的意義,這可能對于一些朋友來說不太認(rèn)同,比如訂單表吧,會有“訂單編號”字段,而這個字段呢在業(yè)務(wù)實際中本身就是應(yīng)該具有唯一性,具有唯一標(biāo)識記錄的功能,但我是不推薦采用訂單編號字段作為主鍵的,因為具有實際意義的字段,具有“意義更改”的可能性,比如訂單編號在剛開始的時候我們一切順利,后來客戶說“訂單可以作廢,并重新生成訂單,而且訂單號要保持原訂單號一致”,這樣原來的主鍵就面臨危險了。因此,具有唯一性的實際字段也代表可以作為主鍵。因此,我推薦是新設(shè)一個字段專門用為主鍵,此主鍵本身在業(yè)務(wù)邏輯上不體現(xiàn),不具有實際意義。而這種主鍵在一定程序增加了復(fù)雜度,所以要視實際系統(tǒng)的規(guī)模大小而定,對于小項目,以后擴(kuò)展不會很大的話,也查允許用實際唯一的字段作主鍵的。

        我們現(xiàn)在在思考一下,應(yīng)該采用什么來作表的主鍵比較合理,申明一下,主鍵的設(shè)計沒有一個定論,各人有各人的方法,哪怕同一個,在不同的項目中,也會采用不同的主鍵設(shè)計原則。

        1. 編號作主鍵
        2. 此方法就是采用實際業(yè)務(wù)中的唯一字段的“編號”作為主鍵設(shè)計,這在小型的項目中是推薦這樣做的,因為這可以使項目比較簡單化,但在使用中卻可能帶來一些麻煩,比如要進(jìn)行“編號修改”時,可能要涉及到很多相關(guān)聯(lián)的其他表,就象黎叔說的“后果很嚴(yán)重”;還有就是上面提到的“業(yè)務(wù)要求允許編號重復(fù)時”,我們再那么先知,都無法知道業(yè)務(wù)將會修改成什么?

        3. 自動編號主鍵
        4. 這種方法也是很多朋友在使用的,就是新建一個ID字段,自動增長,非常方便也滿足主鍵的原則,優(yōu)點(diǎn)是:數(shù)據(jù)庫自動編號,速度快,而且是增量增長,聚集型主鍵按順序存放,對于檢索非常有利;數(shù)字型的,占用空間小,易排序,在程序中傳遞也方便;如果通過非系統(tǒng)增加記錄(比如手動錄入,或是用其他工具直接在表里插入新記錄,或老系統(tǒng)數(shù)據(jù)導(dǎo)入)時,非常方便,不用擔(dān)心主鍵重復(fù)問題。

          缺點(diǎn):其實缺點(diǎn)也就是來自其優(yōu)點(diǎn),就是因為自動增長,在手動要插入指定ID的記錄時會顯得麻煩,尤其是當(dāng)系統(tǒng)與其他系統(tǒng)集成時,需要數(shù)據(jù)導(dǎo)入時,很難保證原系統(tǒng)的ID不發(fā)生主鍵沖突(前提是老系統(tǒng)也是數(shù)字型的);如果其他系統(tǒng)主鍵不是數(shù)字型那就麻煩更大了,會導(dǎo)致修改主鍵數(shù)據(jù)類型了,這也會導(dǎo)致其他相關(guān)表的修改,后果同樣很嚴(yán)重;就算其他系統(tǒng)也是數(shù)字型的,在導(dǎo)入時,為了區(qū)分新老數(shù)據(jù),可能想在老數(shù)據(jù)主鍵前統(tǒng)一加一個“o”(old)來表示這是老數(shù)據(jù),那么自動增長的數(shù)字型又面臨一個挑戰(zhàn)。

        5. Max加一
        6. 由于自動編號存在那些問題,所以有些朋友就采用自己生成,同樣是數(shù)字型的,只是把自動增長去掉了,采用在Insert時,讀取Max值后加一,這種方法可以避免自動編號的問題,但也存在一個效率問題,如果記錄非常大的話,那么Max()也會影響效率的;更嚴(yán)重的是并發(fā)性問題,如果同時有兩人讀到相同的Max后,加一后插入的ID值會重復(fù),這已經(jīng)是有經(jīng)驗教訓(xùn)的了。

        7. 自制加一
        8. 考慮Max加一的效率后,有人采用自制加一,也就是建一個特別的表,字段為:表名,當(dāng)前序列值。這樣在往表中插入值時,先從此表中找到相應(yīng)表的最大值后加一,進(jìn)行插入,有人可能發(fā)現(xiàn),也可能會存在并發(fā)處理,這個并發(fā)處理,我們可以采用lock線程的方式來避免,在生成此值的時,先Lock,取到值以后,再unLock出來,這樣不會有兩人同時生成了。這比Max加一的速度要快多了。但同樣存在一個問題:在與其他系統(tǒng)集成時,脫離了系統(tǒng)中的生成方法后,很麻煩保證自制表中的最大值與導(dǎo)入后的保持一致,而且數(shù)字型都存在上面講到的“o”老數(shù)據(jù)的導(dǎo)入問題。因此在“自制加一”中可以把主鍵設(shè)為字符型的。字符型的自制加一我倒是蠻推薦的,應(yīng)該字符型主鍵可以應(yīng)付很多我們意想不到的情況。

        9. GUID主鍵
        10. 目前一個比較好的主鍵是采用GUID,當(dāng)然我是推薦主鍵還是字符型的,但值由GUID生成,GUID是可以自動生成,也可以程序生成,而且鍵值不可能重復(fù),可以解決系統(tǒng)集成問題,幾個系統(tǒng)的GUID值導(dǎo)到一起時,也不會發(fā)生重復(fù),就算有“o”老數(shù)據(jù)也可以區(qū)分,而且效率很高,在.NET里可以直接使用System.Guid.NewGuid()進(jìn)行生成,在SQL里也可以使用 NewID()生成。

        優(yōu)點(diǎn)

      1. 同 IDENTITY 列相比,uniqueidentifier 列可以通過 NewID() 函數(shù)提前得知新增加的行 ID,為應(yīng)用程序的后續(xù)處理提供了很大方便。
      2. 便于數(shù)據(jù)庫移植,其它數(shù)據(jù)庫中并不一定具有 IDENTITY 列,而 Guid 列可以作為字符型列轉(zhuǎn)換到其它數(shù)據(jù)庫中,同時將應(yīng)用程序中產(chǎn)生的 GUID 值存入數(shù)據(jù)庫,它不會對原有數(shù)據(jù)帶來影響。
      3. 便于數(shù)據(jù)庫初始化,如果應(yīng)用程序要加載一些初始數(shù)據(jù), IDENTITY 列的處理方式就比較麻煩,而 uniqueidentifier 列則無需任何處理,直接用 T-SQL 加載即可。
      4. 便于對某些對象或常量進(jìn)行永久標(biāo)識,如類的 ClassID,對象的實例標(biāo)識,UDDI 中的聯(lián)系人、服務(wù)接口、tModel標(biāo)識定義等。
      5. 缺點(diǎn)

      6. GUID 值較長,不容易記憶和輸入,而且這個值是隨機(jī)、無順序的。
      7. GUID 的值有 16 個字節(jié),與其它那些諸如 4 字節(jié)的整數(shù)相比要相對大一些。這意味著如果在數(shù)據(jù)庫中使用 uniqueidentifier 鍵,可能會帶來兩方面的消極影響:存儲空間增大;索引時間較慢。
      8. 我也不是推薦GUID最好,其實在不同的情況,我們都可以采用上面的某一種方式,思考了一些利與弊,也方便大家在進(jìn)行設(shè)計時參考。

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        如何設(shè)計數(shù)據(jù)庫的主鍵

        如何設(shè)計數(shù)據(jù)庫的主鍵:有些朋友可能不提倡數(shù)據(jù)庫表必須要主鍵,但在我的思考中,覺得每個表都應(yīng)該具有主鍵,不管是單主鍵還是雙主鍵,主鍵的存在就代表著表結(jié)構(gòu)的完整性,表的記錄必須得有唯一區(qū)分的字段,主鍵主要是用于其他表的外鍵關(guān)聯(lián),本記錄的修改與刪除,當(dāng)我們沒有主鍵時
        推薦度:
        標(biāo)簽: 朋友 如何 設(shè)計
        • 熱門焦點(diǎn)

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 妞干网免费视频观看| 国产亚洲综合一区二区三区| 亚洲午夜在线一区| 最近免费字幕中文大全| 国产不卡免费视频| 亚洲精品国产福利一二区| 亚洲中文字幕无码久久2017| 亚洲熟妇无码av另类vr影视| 182tv免费视频在线观看| 又粗又硬免费毛片| 亚洲成AV人片高潮喷水| 四虎在线成人免费网站| 亚洲精品乱码久久久久66| 亚洲精品无码久久久久久| 久久精品免费视频观看| 亚洲色欲久久久久综合网| 亚洲GV天堂无码男同在线观看| 毛片基地免费观看| 亚洲美女免费视频| 午夜视频免费在线观看| 在线亚洲午夜理论AV大片| 日韩久久无码免费毛片软件| 毛片免费全部播放一级| 亚洲理论片在线中文字幕| a级男女仿爱免费视频| 亚洲av无码国产精品色午夜字幕 | 亚洲AV无码成人专区片在线观看 | 亚洲av无码精品网站| 久久国产乱子伦精品免费午夜| 高清在线亚洲精品国产二区| 精品亚洲福利一区二区| 成人毛片视频免费网站观看| 久久亚洲最大成人网4438| 可以免费看黄视频的网站| 亚洲人成电影青青在线播放| 成人浮力影院免费看| 国产精品亚洲四区在线观看| 免费无码又爽又刺激聊天APP| 亚洲色在线无码国产精品不卡| 国产免费久久精品99re丫y| 亚洲AV无码成人专区|