一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

小議數據庫主鍵選取策略(原創)

我們在建立數據庫的時候,需要為每張表指定一個主鍵,所謂主鍵就是能夠唯一標識表中某一行的屬性或屬性組,一個表只能有一個主鍵,但可以有多個候選索引。因為主鍵可以唯一標識某一行記錄,所以可以確保執行數據更新、刪除的時候不會出現張冠李戴的錯誤。當然,其它字段可以輔助我們在執行這些操作時消除共享沖突,不過就不在這里討論了。主鍵除了上述作用外,常常與外鍵構成參照完整性約束,防止出現數據不一致。所以數據庫在設計時,主鍵起到了很重要的作用。

常見的數據庫主鍵選取方式有:

  • 自動增長字段
  • 手動增長字段
  • UniqueIdentifier
  • “COMB(Combine)”類型

一、自動增長型字段

很多數據庫設計者喜歡使用自動增長型字段,因為它使用簡單。自動增長型字段允許我們在向數據庫添加數據時,不考慮主鍵的取值,記錄插入后,數據庫系統會自動為其分配一個值,確保絕對不會出現重復。如果使用SQL Server數據庫的話,我們還可以在記錄插入后使用@@IDENTITY全局變量獲取系統分配的主鍵鍵值。

盡管自動增長型字段會省掉我們很多繁瑣的工作,但使用它也存在潛在的問題,那就是在數據緩沖模式下,很難預先填寫主鍵與外鍵的值。假設有兩張表:

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

Order表中的OrderID是自動增長型的字段。現在需要我們錄入一張訂單,包括在Order表中插入一條記錄以及在OrderDetail表中插入若干條記錄。因為Order表中的OrderID是自動增長型的字段,那么我們在記錄正式插入到數據庫之前無法事先得知它的取值,只有在更新后才能知道數據庫為它分配的是什么值。這會造成以下矛盾發生:

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

【補充2005-6-15】---------------------------------------------

聽棠.NET指出:主檔放在事務中提交時,通過@@IDENTITY 就可以取到生成值的,因此可以傳給明細當外鍵用,而且在事務發生錯誤回滾時,主檔記錄也會被回滾取消的。

呂震宇補充:使用自動增長字段會增加網絡的roundTrip。盡管可以使用@@IDENTITY取得主鍵的值,但在更新過程中,不得不增加一次數據往返(以C/S結構為例):

1、客戶端發送開始事務命令
2、客戶端提交主表更新
3、服務器返回@@IDENTITY
4、客戶端根據返回的主鍵更新從表緩沖
5、客戶端將從表提交服務器更新
6、客戶端提交事務

在這里多了一次往返就會增加了事務處理的時間。降低并發性能。

如果不用自動增長型字段,將是以下情景:

1、客戶端發送開始事務命令
2、客戶端提交主表更新
3、客戶端提交從表更新
4、客戶端提交事務

因此我不贊成使用自動增長型字段作為主鍵與外鍵鏈接的紐帶。

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

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

ADO.NET允許我們在DataSet中將某一個字段設置為自動增長型字段,但千萬記住,這個自動增長字段僅僅是個占位符而已,當數據庫進行更新時,數據庫生成的值會自動取代ADO.NET分配的值。所以為了防止用戶產生誤解,建議大家將ADO.NET中的自動增長初始值以及增量都設置成-1。此外,在ADO.NET中,我們可以為兩張表建立DataRelation,這樣存在級聯關系的兩張表更新時,一張表更新后另外一張表對應鍵的值也會自動發生變化,這會大大減少了我們對存在級聯關系的兩表間更新時自動增長型字段帶來的麻煩。

二、手動增長型字段

既然自動增長型字段會帶來如此的麻煩,我們不妨考慮使用手動增長型的字段,也就是說主鍵的值需要自己維護,通常情況下需要建立一張單獨的表存儲當前主鍵鍵值。還用上面的例子來說,這次我們新建一張表叫IntKey,包含兩個字段,KeyName以及KeyValue。就像一個HashTable,給一個KeyName,就可以知道目前的KeyValue是什么,然后手工實現鍵值數據遞增。在SQL Server中可以編寫這樣一個存儲過程,讓取鍵值的過程自動進行。代碼如下:

 

CREATE PROCEDURE [GetKey]

@KeyName 
char(10), 
@KeyValue 
int OUTPUT 

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

it知識庫小議數據庫主鍵選取策略(原創),轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 国产农村乱子伦精品视频 | 91精品久久久久久久99蜜桃 | 国产欧美一区二区精品性色 | 国产精品女在线观看 | 欧美成人三级网站在线观看 | 欧美7777kkkk免费看258 | 免费国产一区 | 99精品伊人久久久大香线蕉 | 国产美女在线免费观看 | 久久老色鬼天天综合网观看 | 五月婷婷丁香网 | 国产乱人伦精品一区二区 | 亚洲国产成人在线观看 | 亚洲免费二区 | 天天拍夜夜拍高清视频 | 97成人精品 | 多人伦精品一区二区三区视频 | 99热国产在线 | 在线xxxx| 女人ass人体下部pic | 亚洲精品高清视频 | 成人久久久久久 | 婷婷激情五月 | 加勒比视频一区 | 国产成人ay手机在线观看 | 久久五月天婷婷 | 国语精品91自产拍在线观看二区 | 国产精品自拍视频 | 一二三四在线播放免费视频中国 | 人人爱天天做夜夜爽2020麻豆 | 久久综合一区 | 亚洲第一影院 | 好吊妞视频这里有精品 | 亚洲国产最新在线一区二区 | 亚洲免费精品视频 | 久久久久久久久女黄 | 久久成年片色大黄全免费网站 | 91无套极品外围在线播放 | 日韩精品中文字幕一区二区三区 | 久久怡红院国产精品 | 午夜国产大片免费观看 |