中文字幕二区_国产精品免费在线观看_黄色网站观看_人人草人人澡_日本真实娇小xxxx

您的位置: 首頁 > 技術(shù)文檔 > 網(wǎng)絡(luò)編程 > 主鍵的故事
php設(shè)計模式介紹之工廠模式 回到列表 談?wù)勑率秩绾螌W習PHP
 主鍵的故事

作者:李戰(zhàn) 時間: 2008-05-30 文檔類型:轉(zhuǎn)載 來自:軟件真諦

第 1 頁 主鍵的故事 [1]
第 2 頁 主鍵的故事 [2]

那么,我們在設(shè)計數(shù)據(jù)庫結(jié)構(gòu)時,到底該用什么來做主鍵呢?

對象數(shù)據(jù)庫說,主鍵只能是對象標識!

至于對象屬性是否唯一,那是由業(yè)務(wù)邏輯所決定的。如果業(yè)務(wù)邏輯規(guī)定訂單號不能重復(fù),就為訂單號建一個唯一索引好了,但它不是主鍵。

所以,當我們看到有些數(shù)據(jù)庫設(shè)計采用了額外的一個字段來專門充當主鍵,并用這個主鍵與其他表關(guān)聯(lián)的話,那就是已經(jīng)走到對象數(shù)據(jù)庫的門口了。什么“內(nèi)部碼”,“流水號”,“序列號”,“自增數(shù)”...通通都可以算是對象標識。

為什么SQL Server要提供自增量字段以及GUID的標識字段呢?都是為了這專門的主鍵字段服務(wù)的。

如果我們打算向?qū)ο髷?shù)據(jù)庫路上走得話,就請使用對象標識來做專門的主鍵字段吧。

當然,怎樣產(chǎn)生唯一的對象標識來做主鍵,這也是有說道的。

1.用自增量字段

自增量字段每次都會按順序遞增,可以保證在一個表里的主鍵不重復(fù)。除非超出了自增字段類型的最大值并從頭遞增,但這幾乎不可能。使用自增量字段來做主鍵是非常簡單的,一般只需在建表時聲明自增屬性即可。

自增量字段的長度可以很短,比如使用一個int類型就基本上夠用了。簡短的主鍵可以在大量數(shù)據(jù)和復(fù)雜的關(guān)系查詢中表現(xiàn)出更好的性能。

自增量的值都是需要在系統(tǒng)中維護一個全局的數(shù)據(jù)值,每次插入數(shù)據(jù)時即對此次值進行增量取值。當在當量產(chǎn)生唯一標識的并發(fā)環(huán)境中,每次的增量取值都必須最此全局值加鎖解鎖以保證增量的唯一性。這可能是一個并發(fā)的瓶頸,會牽扯一些性能問題。

還有,如果要搞分布式數(shù)據(jù)庫的話,這自增量字段就有問題了。因為,在分布式數(shù)據(jù)庫中,不同數(shù)據(jù)庫的同名的表可能需要進行同步復(fù)制。一個數(shù)據(jù)庫表的自增量值,就很可能與另一數(shù)據(jù)庫相同表的自增量值重復(fù)了。當然,這可以通過指定不同的遞增起始值來錯開,但總覺得不爽啊。

SQL Server中還可以使用timestamp類型的數(shù)據(jù)來做對象標識符,這可以使對象標識對整個數(shù)據(jù)庫都是唯一的,而不僅僅是對表唯一。但其優(yōu)缺點與表的自增字段一樣。

2.隨機數(shù)字段

隨機生成對象標識的方法實際就是碰運氣。按照某種復(fù)雜的隨機算法迅速產(chǎn)生對象標識,碰一碰對象標識不重復(fù)的運氣。只要這種算法產(chǎn)生的對象標識一萬年才可能重復(fù)一次,那你就可以在實際開發(fā)中應(yīng)用這種算法。比如,SQL Server中提供了uniqueidentifier類型,配合NEWID()函數(shù)來產(chǎn)生GUID,基本上可以應(yīng)用于所有主鍵需求了。

隨機生成標識不需要在系統(tǒng)中維護全局量,不存在自增字段那種加鎖解鎖的性能開銷,對于大量的并發(fā)處理來說是個福音。

同時,即使在分布式數(shù)據(jù)庫應(yīng)用中,不同數(shù)據(jù)庫產(chǎn)生的隨機值也是不同的。因此,在數(shù)據(jù)庫的同步復(fù)制中,標識相同的就一定是同一條記錄,就不會存在產(chǎn)生主鍵沖突的問題了。

不過,為了保證隨機的唯一性,需要大范圍的數(shù)值空間。這也使得主鍵字段比較大,在關(guān)聯(lián)查詢的時候有一定的性能損失,判斷GUID值是否相同總比判斷int值是否相同要多費些功夫。

在實際應(yīng)用中到底該用什么方案來產(chǎn)生對象標識需要根具體情況決定,以上方案僅僅是理論探討。

接下來要注意的就是主鍵的索引結(jié)構(gòu)的優(yōu)化了。

主鍵都要整成聚集索引。聚集索引在SQL Server內(nèi)部就是聚集表,聚集表是B樹結(jié)構(gòu),索引值存在B樹的中間節(jié)點中,而數(shù)據(jù)行就存放在B樹的頁節(jié)點上。也就是說,聚集索引和數(shù)據(jù)表其實是一個統(tǒng)一的整體結(jié)構(gòu)。因此,聚集索引查找和定位數(shù)據(jù)的效率要比一般索引高出很多。

此外,專門主鍵字段值是永遠都不變。聚集索引建值不變,聚集表的節(jié)點也不會調(diào)整,硬盤上的數(shù)據(jù)記錄塊基本不動窩的。這可以極大減少數(shù)據(jù)庫碎片,除非刪除數(shù)據(jù)行。數(shù)據(jù)庫的碎片少了,查詢數(shù)據(jù)自然要快些。

一般來說,我們存入數(shù)據(jù)庫中的數(shù)據(jù)總是有時間順序的,我們?nèi)粘2樵兒褪褂玫臄?shù)據(jù)也總是近期的數(shù)據(jù)。有的常用查詢甚至總是按時間順序倒排,比如,郵件列表,論壇帖子。如果主鍵采用的是自增字段,我們不妨將增量值設(shè)為-1或干脆搞成倒序的主鍵。這樣,查詢的排序與掃描索引的順序相同,畢竟硬盤的磁頭總喜歡從前往后讀,這會稍微提高一點讀取聚集索引的速度。

同樣,如果使用隨機主鍵值的方案,我們也建議采用與時間相關(guān)的隨機數(shù)值,而不是GUID。與時間相關(guān)的隨機數(shù)就是,雖然主鍵是隨機產(chǎn)生的,但后產(chǎn)生的隨機數(shù)應(yīng)該大于先產(chǎn)生的數(shù)。

為什么不用GUID呢?因為它生成的值就像頑皮的猴子,到處亂跳。于是,在每次插入記錄時,聚集索引節(jié)點中相鄰的值并不具有時間上的順序。而當我們習慣性地查詢近期數(shù)據(jù)時,硬盤的磁頭也需要像猴子般亂跳一通之后才能讀到按時間順序的所有數(shù)據(jù)。

如果采用有時間順序的隨機值,聚集索引插入數(shù)據(jù)時總往一個方向增加數(shù)據(jù)行的頁節(jié)點,與同一時期的數(shù)據(jù)行幾乎總相鄰。查詢同期數(shù)據(jù)時,磁頭就很少亂跳了。磁頭一次可以讀取一批數(shù)據(jù),效率有將有所提升。如果您用電子顯微鏡去觀察硬盤的表面,聚集索引的那顆B樹將生長得很正很齊。

對磁頭讀寫的優(yōu)化,是完美主義的程序員所追求的,是否采用完全看自己的心態(tài)?傊,高興就好。當然,等將來的大容量存儲設(shè)備都用上固態(tài)盤了,沒磁頭了,全電信號了,這些優(yōu)化就都沒有什么意義了。

所以呢,追求完美也是很痛苦的。吃了程序員這碗飯,就只能被IT的洪流卷著往前走。我們不過是這洪流中的一粒沙子,不知道又會被帶到何方?

王菲在一首歌中這樣唱到:一路上有人太早看透生命的線條命運的玄妙,有人太晚覺悟冥冥中該來則來無處可逃...

本文鏈接:http://www.95time.cn/tech/program/2008/5837.asp 

出處:軟件真諦
責任編輯:bluehearts

上一頁 主鍵的故事 [1] 下一頁

◎進入論壇網(wǎng)絡(luò)編程版塊參加討論

相關(guān)文章 更多相關(guān)鏈接
[php] 數(shù)據(jù)庫操作——分頁類
[php]mysql數(shù)據(jù)庫操作——DB類
ASP操作數(shù)據(jù)庫的類
ASP.NET入門數(shù)據(jù)篇
用數(shù)據(jù)庫生成不重復(fù)的流水號
作者文章
悟透JavaScript
關(guān)鍵字搜索 常規(guī)搜索 推薦文檔
熱門搜索:CSS Fireworks 設(shè)計比賽 網(wǎng)頁制作 web標準 用戶體驗 UE photoshop Dreamweaver Studio8 Flash 手繪 CG
站點最新 站點最新列表
周大!熬•自然”設(shè)計大賽開啟
國際體驗設(shè)計大會7月將在京舉行
中國國防科技信息中心標志征集
云計算如何讓安全問題可控
云計算是多數(shù)企業(yè)唯一擁抱互聯(lián)網(wǎng)的機會
阿里行云
云手機年終巨獻,送禮標配299起
阿里巴巴CTO王堅的"云和互聯(lián)網(wǎng)觀"
1499元買真八核 云OS雙蛋大促
首屆COCO桌面手機主題設(shè)計大賽
欄目最新 欄目最新列表
淺談JavaScript編程語言的編碼規(guī)范
如何在illustrator中繪制臺歷
Ps簡單繪制一個可愛的鉛筆圖標
數(shù)據(jù)同步算法研究
用ps作簡單的作品展示頁面
CSS定位機制之一:普通流
25個最佳最閃亮的Eclipse開發(fā)項目
Illustrator中制作針線縫制文字效果
Photoshop制作印刷凹凸字體
VS2010中創(chuàng)建自定義SQL Rule
>> 分頁 首頁 前頁 后頁 尾頁 頁次:2/21個記錄/頁 轉(zhuǎn)到 頁 共2個記錄

藍色理想版權(quán)申明:除部分特別聲明不要轉(zhuǎn)載,或者授權(quán)我站獨家播發(fā)的文章外,大家可以自由轉(zhuǎn)載我站點的原創(chuàng)文章,但原作者和來自我站的鏈接必須保留(非我站原創(chuàng)的,按照原來自一節(jié),自行鏈接)。文章版權(quán)歸我站和作者共有。

轉(zhuǎn)載要求:轉(zhuǎn)載之圖片、文件,鏈接請不要盜鏈到本站,且不準打上各自站點的水印,亦不能抹去我站點水印。

特別注意:本站所提供的攝影照片,插畫,設(shè)計作品,如需使用,請與原作者聯(lián)系,版權(quán)歸原作者所有,文章若有侵犯作者版權(quán),請與我們聯(lián)系,我們將立即刪除修改。

您的評論
用戶名:  口令:
說明:輸入正確的用戶名和密碼才能參與評論。如果您不是本站會員,你可以注冊 為本站會員。
注意:文章中的鏈接、內(nèi)容等需要修改的錯誤,請用報告錯誤,以利文檔及時修改。
不評分 1 2 3 4 5
注意:請不要在評論中含與內(nèi)容無關(guān)的廣告鏈接,違者封ID
請您注意:
·不良評論請用報告管理員,以利管理員及時刪除。
·尊重網(wǎng)上道德,遵守中華人民共和國的各項有關(guān)法律法規(guī)
·承擔一切因您的行為而直接或間接導致的民事或刑事法律責任
·本站評論管理人員有權(quán)保留或刪除其管轄評論中的任意內(nèi)容
·您在本站發(fā)表的作品,本站有權(quán)在網(wǎng)站內(nèi)轉(zhuǎn)載或引用
·參與本評論即表明您已經(jīng)閱讀并接受上述條款
推薦文檔 | 打印文檔 | 評論文檔 | 報告錯誤  
專業(yè)書推薦 更多內(nèi)容
網(wǎng)站可用性測試及優(yōu)化指南
《寫給大家看的色彩書1》
《跟我去香港》
眾妙之門—網(wǎng)站UI 設(shè)計之道
《Flex 4.0 RIA開發(fā)寶典》
《贏在設(shè)計》
犀利開發(fā)—jQuery內(nèi)核詳解與實踐
作品集 更多內(nèi)容

雜⑦雜⑧ Gold NORMANA V2