国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
J道- 主鍵設(shè)計(jì)用什么字段類型比較好?

主鍵設(shè)計(jì)用什么字段類型比較好?

redlly http://www.jdon.com Jun 14, 2005 12:21 PM

回復(fù)

主鍵設(shè)計(jì)用什么字段類型比較好?
一般有采用數(shù)字型和字符型,哪種好點(diǎn)?使用多長比較好?


Re: 主鍵設(shè)計(jì)用什么字段類型比較好? 發(fā)表時(shí)間: Jun 22, 2005 6:04 PM
回復(fù)
發(fā)表人: 54powerman    發(fā)表文章: 9 / 注冊時(shí)間: 2004-12
還是使用序列吧,否則你還要控制Unique約束的問題。


Re: 主鍵設(shè)計(jì)用什么字段類型比較好? 發(fā)表時(shí)間: Jul 3, 2005 5:42 AM
回復(fù)
發(fā)表人: redlly    發(fā)表文章: 40 / 注冊時(shí)間: 2003-07
> 還是使用序列吧,否則你還要控制Unique約束的問題。

用序列?如果出現(xiàn)這樣的問題:
一個(gè)公司,底下幾個(gè)子公司,自公司采用相同的系統(tǒng),數(shù)據(jù)庫結(jié)構(gòu)都一樣,子公司數(shù)據(jù)每天上報(bào)總公司匯總,能保證每個(gè)子公司產(chǎn)生的數(shù)據(jù)的主鍵都唯一嗎?
或者是子公司里有個(gè)牛人,越過你的系統(tǒng)在數(shù)據(jù)庫中插入了一條記錄,你原來的序列在999,理應(yīng)下一條記錄是1000,可是這時(shí)候數(shù)據(jù)庫里已經(jīng)有了1000,怎么辦?


Re: 主鍵設(shè)計(jì)用什么字段類型比較好? 發(fā)表時(shí)間: Jul 3, 2005 12:24 PM
回復(fù)
發(fā)表人: banq    發(fā)表文章: 5064 / 來  自: 上海 / 注冊時(shí)間: 2002-08
用你的序列產(chǎn)生器,就禁止手工插入序列號了,你可以使用一個(gè)校驗(yàn)程序,如果有人手工插入大于現(xiàn)在序列號,視為無效。必須通過程序插入。


Re: 主鍵設(shè)計(jì)用什么字段類型比較好? 發(fā)表時(shí)間: Jul 3, 2005 6:11 PM
回復(fù)
發(fā)表人: redlly    發(fā)表文章: 40 / 注冊時(shí)間: 2003-07
數(shù)據(jù)庫主鍵設(shè)計(jì)之思考

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


Re: 主鍵設(shè)計(jì)用什么字段類型比較好? 發(fā)表時(shí)間: Jul 5, 2005 1:20 AM
回復(fù)
發(fā)表人: banq    發(fā)表文章: 5064 / 來  自: 上海 / 注冊時(shí)間: 2002-08
寫得非常好,主鍵是肯定要的,有了之后會方便很多。
有一種Object ID的方法,也就是專門使用sequence包產(chǎn)生ID,不知屬于你總結(jié)這些類別中哪一個(gè)?


Re: 主鍵設(shè)計(jì)用什么字段類型比較好? 發(fā)表時(shí)間: Jul 12, 2005 1:25 AM
回復(fù)
發(fā)表人: redlly    發(fā)表文章: 40 / 注冊時(shí)間: 2003-07
> 寫得非常好,主鍵是肯定要的,有了之后會方便很多。
> 有一種Object
> ID的方法,也就是專門使用sequence包產(chǎn)生ID,不知屬于你總
> 嵴廡├啾鷸心囊桓觶?

專門使用sequence包產(chǎn)生ID,不清楚這里的sequence包產(chǎn)生的ID是否是安某種序列增長型的?其實(shí)也沒關(guān)系,我的理解是由專門的主鍵生成器按照某種算法生成主鍵,不管是按照序列型還是hash型生成主鍵,好像hibernate的自動主鍵產(chǎn)生就是這種方式。不屬于上面總結(jié)的任何一種。不過這也不能完全保證主鍵唯一性,看你的算法好壞了,世事無絕對,誰知道呢,GUID在幾百億次里面還有可能出現(xiàn)重復(fù)啊。


Re: 主鍵設(shè)計(jì)用什么字段類型比較好? 發(fā)表時(shí)間: Aug 4, 2005 8:52 PM
回復(fù)
發(fā)表人: mysapphire    發(fā)表文章: 33 / 注冊時(shí)間: 2003-12
>寫得非常好,主鍵是肯定要的,有了之后會方便很多。
>有一種Object ID的方法,也就是專門使用sequence包產(chǎn)生ID,不知屬于你總結(jié)這些類別中哪一個(gè)?

這種方法很好,在實(shí)際的編程當(dāng)中有很高的靈活性,數(shù)據(jù)庫操作越繁雜這種方法體現(xiàn)的優(yōu)點(diǎn)越明顯,不過要請教一下怎么實(shí)現(xiàn)? 比如在DB2中select nextval form seq_1? 這樣似乎不行?。?br>而且這種方法在一種場合下無法使用:確保主鍵的連貫性。

Identity列能確保連貫,而且通過Statement.getGeneratedKeys()又能得到新增加的鍵值,這樣也解決了主表-明細(xì)表插入的問題,因此選Identity列用作主鍵可謂是比較廣泛的選擇。

我個(gè)人覺得要用主鍵的話以上兩種方法最可取,不過彼此都有一個(gè)互補(bǔ)的缺點(diǎn):前者無法確保連貫;后者在導(dǎo)數(shù)據(jù)的時(shí)候要額外花點(diǎn)心思。

我現(xiàn)在的開發(fā)就遇到一種需要確保主鍵連貫的場合,無法使用第二種主鍵,而且也不知道如何使用簡單的方法實(shí)現(xiàn)第一種方法中提到的Object ID,現(xiàn)在我的苯辦法是通過select nextval for seq_1 from temp_table fetch first 1 rows only得到ID的! 希望不要被知道訣竅的人笑掉大牙哦!


Re: 主鍵設(shè)計(jì)用什么字段類型比較好? 發(fā)表時(shí)間: Sep 4, 2005 9:17 PM
回復(fù)
發(fā)表人: idofindit    發(fā)表文章: 1 / 注冊時(shí)間: 2005-09
我有一疑問,有一表,如下字段:
ID(GUID)主鍵, 名稱, 所屬類別, 其它

我插入一條記錄,然后再插入一條名稱,所屬類別都相同的記錄,系統(tǒng)不會出現(xiàn)異常, 而我不想讓業(yè)務(wù)上完全相同的兩條記錄能夠被重復(fù)插入,怎么辦?


Re: 主鍵設(shè)計(jì)用什么字段類型比較好? 發(fā)表時(shí)間: Jun 23, 2005 9:15 PM
回復(fù)
發(fā)表人: 黑色的白色    發(fā)表文章: 10 / 注冊時(shí)間: 2005-06
我習(xí)慣用數(shù)字
遞增的數(shù)字
由系統(tǒng)維護(hù)
僅代表個(gè)人意見


Re: 主鍵設(shè)計(jì)用什么字段類型比較好? 發(fā)表時(shí)間: Jun 30, 2005 11:06 PM
回復(fù)
發(fā)表人: banq    發(fā)表文章: 5064 / 來  自: 上海 / 注冊時(shí)間: 2002-08
數(shù)據(jù)類型設(shè)計(jì)都是細(xì)節(jié)問題,在J2EE中不重要了。個(gè)人意見僅供參考。


Re: 主鍵設(shè)計(jì)用什么字段類型比較好? 發(fā)表時(shí)間: Jul 18, 2005 8:41 PM
回復(fù)
發(fā)表人: kevin.ma    發(fā)表文章: 16 / 注冊時(shí)間: 2005-07
有必要寫個(gè)主鍵生成器比較好嘛?。?!
----------------------------------
淺見


Re: 主鍵設(shè)計(jì)用什么字段類型比較好? 發(fā)表時(shí)間: Jul 20, 2005 5:07 PM
回復(fù)
發(fā)表人: redlly    發(fā)表文章: 40 / 注冊時(shí)間: 2003-07
其實(shí)在如同hibernate等框架中已經(jīng)提供了適應(yīng)于不同數(shù)據(jù)庫、不同情況的主鍵生成器,如identity、uuid.hex等方式。我比較常用uuid.hex方式自動產(chǎn)生主鍵,它是由Hibernate基于128 位唯一值產(chǎn)生算法生成16 進(jìn)制數(shù)值(編碼后以長度32 的字符串表示)作為主鍵,和數(shù)據(jù)庫無關(guān),也不依賴于sequence,缺點(diǎn)是主鍵只能是32位的字符型,如果要用到數(shù)字型就沒法用這種生成方式了。我不知道ejb中有沒有類似的主鍵生成方式,產(chǎn)生不依賴于數(shù)據(jù)庫、sequence或者不需要額外的數(shù)據(jù)庫表保存主鍵生成歷史狀態(tài)的方法。如果有,能否根據(jù)數(shù)據(jù)庫表中的不同主鍵類型(如數(shù)字、字符)自動產(chǎn)生唯一的主鍵。


Re: 主鍵設(shè)計(jì)用什么字段類型比較好? 發(fā)表時(shí)間: Jul 29, 2005 1:49 PM
回復(fù)
發(fā)表人: kkkk    發(fā)表文章: 3 / 注冊時(shí)間: 2003-04
請問一下redlly,通常設(shè)計(jì)的實(shí)類ID,你是有Sting還是long類型啊,而數(shù)據(jù)庫中是用varchar還是int呢.


Re: 主鍵設(shè)計(jì)用什么字段類型比較好? 發(fā)表時(shí)間: Jul 29, 2005 3:33 PM
回復(fù)
發(fā)表人: mythmoon    發(fā)表文章: 136 / 注冊時(shí)間: 2005-03
學(xué)習(xí)中...實(shí)際操作中我采用自動+1,不從0起從1000起+1,思考后發(fā)覺沒做限制可以插入1000以前的標(biāo)號啊!哈哈!我要趕快去改啊!


________________________________________
被公司封上網(wǎng)了啊(下載東西太多,燒了設(shè)備)!解封不久,剛剛來就學(xué)東西.


Re: 主鍵設(shè)計(jì)用什么字段類型比較好? 發(fā)表時(shí)間: Jul 31, 2005 12:55 PM
回復(fù)
發(fā)表人: aill    發(fā)表文章: 75 / 注冊時(shí)間: 2004-06
我是直接用表示數(shù)據(jù)類型的字符串+System.currentTimeMillis();大家說怎么樣?


Re: 主鍵設(shè)計(jì)用什么字段類型比較好? 發(fā)表時(shí)間: Aug 7, 2005 2:02 PM
回復(fù)
發(fā)表人: JavaUserDL    發(fā)表文章: 5 / 注冊時(shí)間: 2005-07
> 我是直接用表示數(shù)據(jù)類型的字符串+System.currentTimeMilli
> ();大家說怎么樣?

這種方法不太好,如果有并發(fā)的話,容易重復(fù)。


Re: 主鍵設(shè)計(jì)用什么字段類型比較好? 發(fā)表時(shí)間: Jul 31, 2005 8:20 PM
回復(fù)
發(fā)表人: redlly    發(fā)表文章: 40 / 注冊時(shí)間: 2003-07
> 請問一下redlly,通常設(shè)計(jì)的實(shí)類ID,你是有Sting還是long類?> 啊,而數(shù)據(jù)庫中是用varchar還是int呢.


我現(xiàn)在的這個(gè)系統(tǒng)用的是varchar2(32),映射到類是String.


Re: 主鍵設(shè)計(jì)用什么字段類型比較好? 發(fā)表時(shí)間: Sep 11, 2005 7:19 PM
回復(fù)
發(fā)表人: rainbowbuaa    發(fā)表文章: 1 / 注冊時(shí)間: 2005-09
序列


Re: 主鍵設(shè)計(jì)用什么字段類型比較好? 發(fā)表時(shí)間: Aug 1, 2005 10:14 PM
回復(fù)
發(fā)表人: hdcopy    發(fā)表文章: 1 / 注冊時(shí)間: 2005-08
當(dāng)前項(xiàng)目中使用hibernate框架中的uuid.hex方式自動產(chǎn)生主鍵,
但出現(xiàn)了一些問題。

基本系統(tǒng)是用java寫的,但部分輔助還是用的delphi(C/S結(jié)構(gòu)的),
在delphi寫的部分包含大量記錄生成,對并發(fā)基本無要求,
對速度要求很高,這個(gè)時(shí)候新記錄的主鍵無法自動產(chǎn)生。

最后是所有delphi系統(tǒng)生成記錄用的數(shù)據(jù)表的主鍵改用
自動增量了。

因?yàn)槭褂玫臄?shù)據(jù)庫是oracle,采用的是sequence,相對
sqlserver的要靈活很多,要不是改動太大,很可能整個(gè)
項(xiàng)目的數(shù)據(jù)表都會改。


Re: 主鍵設(shè)計(jì)用什么字段類型比較好? 發(fā)表時(shí)間: Aug 9, 2005 1:39 PM
回復(fù)
發(fā)表人: myy    發(fā)表文章: 8 / 注冊時(shí)間: 2005-01
> 當(dāng)前項(xiàng)目中使用hibernate框架中的uuid.hex方式自動產(chǎn)生主?> ,
> 但出現(xiàn)了一些問題。
>
> 基本系統(tǒng)是用java寫的,但部分輔助還是用的delphi(C/S結(jié)?> 的),
> 在delphi寫的部分包含大量記錄生成,對并發(fā)基本無要求,
> 對速度要求很高,這個(gè)時(shí)候新記錄的主鍵無法自動產(chǎn)生。
>
> 最后是所有delphi系統(tǒng)生成記錄用的數(shù)據(jù)表的主鍵改用
> 自動增量了。
>
> 因?yàn)槭褂玫臄?shù)據(jù)庫是oracle,采用的是sequence,相對
> sqlserver的要靈活很多,要不是改動太大,很可能整個(gè)
> 項(xiàng)目的數(shù)據(jù)表都會改。

hibernate中的uuid.hex如果類似GUID的話(本人不是很了解),以上問題其實(shí)并不難解決,可以用兩種方法:

1。客戶端生成GUID,用Delphi很容易的:
function GetGUID: String;
var
g : TGUID;
begin
Result:=‘‘;
if S_OK=CreateGuid(g) then
Result:=GUIDToString(g);
end;


2。Oracle生成,如:
insert into a_tab (id,name) values (sys_guid(), ‘tom‘);
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
數(shù)據(jù)庫主鍵設(shè)計(jì)之思考
UUID 好處 以及 自增主鍵 的優(yōu)缺點(diǎn)
如何寫得一手好SQL ?
數(shù)據(jù)庫命名規(guī)范--Toxly&Tinky
如何寫一手好 SQL ?
SQL注入攻擊
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服