天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

小議數(shù)據(jù)庫(kù)主鍵選取策略(原創(chuàng))

我們?cè)诮?shù)據(jù)庫(kù)的時(shí)候,需要為每張表指定一個(gè)主鍵,所謂主鍵就是能夠唯一標(biāo)識(shí)表中某一行的屬性或?qū)傩越M,一個(gè)表只能有一個(gè)主鍵,但可以有多個(gè)候選索引。因?yàn)橹麈I可以唯一標(biāo)識(shí)某一行記錄,所以可以確保執(zhí)行數(shù)據(jù)更新、刪除的時(shí)候不會(huì)出現(xiàn)張冠李戴的錯(cuò)誤。當(dāng)然,其它字段可以輔助我們?cè)趫?zhí)行這些操作時(shí)消除共享沖突,不過(guò)就不在這里討論了。主鍵除了上述作用外,常常與外鍵構(gòu)成參照完整性約束,防止出現(xiàn)數(shù)據(jù)不一致。所以數(shù)據(jù)庫(kù)在設(shè)計(jì)時(shí),主鍵起到了很重要的作用。

常見(jiàn)的數(shù)據(jù)庫(kù)主鍵選取方式有:

  • 自動(dòng)增長(zhǎng)字段
  • 手動(dòng)增長(zhǎng)字段
  • UniqueIdentifier
  • “COMB(Combine)”類(lèi)型

一、自動(dòng)增長(zhǎng)型字段

很多數(shù)據(jù)庫(kù)設(shè)計(jì)者喜歡使用自動(dòng)增長(zhǎng)型字段,因?yàn)樗褂煤?jiǎn)單。自動(dòng)增長(zhǎng)型字段允許我們?cè)谙驍?shù)據(jù)庫(kù)添加數(shù)據(jù)時(shí),不考慮主鍵的取值,記錄插入后,數(shù)據(jù)庫(kù)系統(tǒng)會(huì)自動(dòng)為其分配一個(gè)值,確保絕對(duì)不會(huì)出現(xiàn)重復(fù)。如果使用SQL Server數(shù)據(jù)庫(kù)的話(huà),我們還可以在記錄插入后使用@@IDENTITY全局變量獲取系統(tǒng)分配的主鍵鍵值。

盡管自動(dòng)增長(zhǎng)型字段會(huì)省掉我們很多繁瑣的工作,但使用它也存在潛在的問(wèn)題,那就是在數(shù)據(jù)緩沖模式下,很難預(yù)先填寫(xiě)主鍵與外鍵的值。假設(shè)有兩張表:

Order(OrderID, OrderDate)
OrderDetial(OrderID, LineNum, ProductID, Price)

Order表中的OrderID是自動(dòng)增長(zhǎng)型的字段。現(xiàn)在需要我們錄入一張訂單,包括在Order表中插入一條記錄以及在OrderDetail表中插入若干條記錄。因?yàn)镺rder表中的OrderID是自動(dòng)增長(zhǎng)型的字段,那么我們?cè)谟涗浾讲迦氲綌?shù)據(jù)庫(kù)之前無(wú)法事先得知它的取值,只有在更新后才能知道數(shù)據(jù)庫(kù)為它分配的是什么值。這會(huì)造成以下矛盾發(fā)生:

首先,為了能在OrderDetail的OrderID字段中添入正確的值,必須先更新Order表以獲取到系統(tǒng)為其分配的OrderID值,然后再用這個(gè)OrderID填充OrderDetail表。最后更新OderDetail表。但是,為了確保數(shù)據(jù)的一致性,Order與OrderDetail在更新時(shí)必須在事務(wù)保護(hù)下同時(shí)進(jìn)行,即確保兩表同時(shí)更行成功。顯然它們是相互矛盾的。(此處表述有錯(cuò)誤。呂震宇 2005-6-15)

【補(bǔ)充2005-6-15】---------------------------------------------

聽(tīng)棠.NET指出:主檔放在事務(wù)中提交時(shí),通過(guò)@@IDENTITY 就可以取到生成值的,因此可以傳給明細(xì)當(dāng)外鍵用,而且在事務(wù)發(fā)生錯(cuò)誤回滾時(shí),主檔記錄也會(huì)被回滾取消的。

呂震宇補(bǔ)充:使用自動(dòng)增長(zhǎng)字段會(huì)增加網(wǎng)絡(luò)的roundTrip。盡管可以使用@@IDENTITY取得主鍵的值,但在更新過(guò)程中,不得不增加一次數(shù)據(jù)往返(以C/S結(jié)構(gòu)為例):

1、客戶(hù)端發(fā)送開(kāi)始事務(wù)命令
2、客戶(hù)端提交主表更新
3、服務(wù)器返回@@IDENTITY
4、客戶(hù)端根據(jù)返回的主鍵更新從表緩沖
5、客戶(hù)端將從表提交服務(wù)器更新
6、客戶(hù)端提交事務(wù)

在這里多了一次往返就會(huì)增加了事務(wù)處理的時(shí)間。降低并發(fā)性能。

如果不用自動(dòng)增長(zhǎng)型字段,將是以下情景:

1、客戶(hù)端發(fā)送開(kāi)始事務(wù)命令
2、客戶(hù)端提交主表更新
3、客戶(hù)端提交從表更新
4、客戶(hù)端提交事務(wù)

因此我不贊成使用自動(dòng)增長(zhǎng)型字段作為主鍵與外鍵鏈接的紐帶。

------------------------------------------------

除此之外,當(dāng)我們需要在多個(gè)數(shù)據(jù)庫(kù)間進(jìn)行數(shù)據(jù)的復(fù)制時(shí)(SQL Server的數(shù)據(jù)分發(fā)、訂閱機(jī)制允許我們進(jìn)行庫(kù)間的數(shù)據(jù)復(fù)制操作),自動(dòng)增長(zhǎng)型字段可能造成數(shù)據(jù)合并時(shí)的主鍵沖突。設(shè)想一個(gè)數(shù)據(jù)庫(kù)中的Order表向另一個(gè)庫(kù)中的Order表復(fù)制數(shù)據(jù)庫(kù)時(shí),OrderID到底該不該自動(dòng)增長(zhǎng)呢?

ADO.NET允許我們?cè)贒ataSet中將某一個(gè)字段設(shè)置為自動(dòng)增長(zhǎng)型字段,但千萬(wàn)記住,這個(gè)自動(dòng)增長(zhǎng)字段僅僅是個(gè)占位符而已,當(dāng)數(shù)據(jù)庫(kù)進(jìn)行更新時(shí),數(shù)據(jù)庫(kù)生成的值會(huì)自動(dòng)取代ADO.NET分配的值。所以為了防止用戶(hù)產(chǎn)生誤解,建議大家將ADO.NET中的自動(dòng)增長(zhǎng)初始值以及增量都設(shè)置成-1。此外,在ADO.NET中,我們可以為兩張表建立DataRelation,這樣存在級(jí)聯(lián)關(guān)系的兩張表更新時(shí),一張表更新后另外一張表對(duì)應(yīng)鍵的值也會(huì)自動(dòng)發(fā)生變化,這會(huì)大大減少了我們對(duì)存在級(jí)聯(lián)關(guān)系的兩表間更新時(shí)自動(dòng)增長(zhǎng)型字段帶來(lái)的麻煩。

二、手動(dòng)增長(zhǎng)型字段

既然自動(dòng)增長(zhǎng)型字段會(huì)帶來(lái)如此的麻煩,我們不妨考慮使用手動(dòng)增長(zhǎng)型的字段,也就是說(shuō)主鍵的值需要自己維護(hù),通常情況下需要建立一張單獨(dú)的表存儲(chǔ)當(dāng)前主鍵鍵值。還用上面的例子來(lái)說(shuō),這次我們新建一張表叫IntKey,包含兩個(gè)字段,KeyName以及KeyValue。就像一個(gè)HashTable,給一個(gè)KeyName,就可以知道目前的KeyValue是什么,然后手工實(shí)現(xiàn)鍵值數(shù)據(jù)遞增。在SQL Server中可以編寫(xiě)這樣一個(gè)存儲(chǔ)過(guò)程,讓取鍵值的過(guò)程自動(dòng)進(jìn)行。代碼如下:

 

CREATE PROCEDURE [GetKey]

@KeyName 
char(10), 
@KeyValue 
int OUTPUT 

AS
UPDATE IntKey SET @KeyValue = KeyValue = KeyValue + 1 WHERE KeyName = @KeyName
GO

it知識(shí)庫(kù)小議數(shù)據(jù)庫(kù)主鍵選取策略(原創(chuàng)),轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 亚洲精品中文字幕一二三四区 | 国产色情短视频在线网站 | 欧美丰满白嫩bbxx | 国产成人综合在线视频 | 久久re热线视频精品99 | 国产AV高清怡春院 | 亚洲欧美偷拍视频一区 | 偷柏自拍亚洲综合在线 | 大学生第一次破女在线观看 | 久久久久久亚洲精品影院 | 国产精品99久久久久久AV蜜臀 | 夫妻性姿势真人做视频 | 香蕉视频国产精品 | 99精品视频免费在线观看 | 99国产精品欲AV蜜桃臀麻豆 | 97人妻久久久精品系列A片 | 亚洲看片无码免费视频 | 国产欧美日韩综合精品一区二区 | 免费视频不卡 | 办公室韩国电影免费完整版 | 亚洲高清无码在线 视频 | yellow在线观看免费高清的日本 | 精品国产在线观看福利 | 羞羞答答的免费视频在线观看 | 啦啦啦视频在线观看WWW | 亚洲a免费 | 公粗挺进了我的密道在线播放贝壳 | 两个人看的www免费高清直播 | 免费观看成人www精品视频在线 | 国产在线AV一区二区香蕉 | 22eee在线播放成人免费视频 | 好男人WWW免费高清视频在线 | 亚洲欧美精品一中文字幕 | 开心成人社区 | 久草在线一免费新视频 | 国产亚洲精品首页在线播放 | 天堂精品国产自在自线 | 口内射精颜射极品合集 | 中文字幕亚洲综合小综合在线 | 国内免费视频成人精品 | 秋霞av伦理片在线观看 |