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

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

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

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

  • 自動增長字段
  • 手動增長字段
  • 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知識庫小議數據庫主鍵選取策略(原創),轉載需保留來源!

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

主站蜘蛛池模板: 国产成人无码免费精品果冻传媒 | 国产伦精品一区二区三区免费观看 | 97成人精品视频在线播放 | 美女脱18以下禁止看免费 | 精品人妻一区二区三区视频53 | 美女也烦恼主题曲 | 婷婷精品国产亚洲AV在线观看 | 肉动漫3D卡通无修在线播放 | 外女思春台湾三级 | 精品视频久久久久 | 4388成人 | 嫩草AV久久伊人妇女 | 6080yy 久久 亚洲 日本 | 色愁愁久久久 | 免费观看成人www精品视频在线 | 亚洲色欲啪啪久久WWW综合网 | 尹人综合网 | 久久香蕉国产免费天天 | chinese东北老年tv视频 | 日本妈妈xxxx| 亚洲性夜夜夜色综合网 | 国产第一页在线视频 | 超碰在线线公开免费视频 | 毛片手机在线看 | 97视频在线免费 | 在线视频 中文字幕 | av天堂电影网在线观看 | 浪荡女天天不停挨CAO日常视 | 夜色88V精品国产亚洲AV | 黄色a三级免费看 | 91国在线产 | 麻豆官网入口 | 国产人妻系列无码专区97SS | 免费在线亚洲视频 | 日本特交大片免费观看 | 伊人国产在线视频 | 最新高清无码专区 | 婷婷射精AV这里只有精品 | 歪歪漫画羞羞漫画国产 | 免费无码一区二区三区蜜桃大 | 久久re这里精品23 |