天天躁日日躁狠狠躁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知識庫小議數據庫主鍵選取策略(原創),轉載需保留來源!

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

主站蜘蛛池模板: 用快播看av的网站 | 美女张开让男生桶 | 把她带到密室调教性奴 | 在线观看免费亚洲 | 国产日韩精品一区二区在线观看 | 97人摸人人澡人人人超一碰 | 国产欧美国日产在线播放 | 天美传媒在线完整免费观看网站 | 福利一区福利二区 | 国产精品无码亚洲精品 | 狠狠插狠狠干 | 成人国产精品免费网站 | 综合精品欧美日韩国产在线 | 精品免费视在线视频观看 | 国产成人刺激视频在线观看 | 多男同时插一个女人8p | 入室强伦女教师被学生 | 欧美日韩在线亚洲一 | 99久久精品费精品国产一区二 | 3D动漫网站HOXXXxes | 国产一区在线观看免费 | 纯h超级大尺度小黄文 | 亚洲1卡二卡3卡4卡新区在线 | 国产午夜精品美女免费大片 | 火影小南被爆羞羞网站 | thermo脱色摇床安卓下载 | 精选国产AV精选一区二区三区 | 国产偷国产偷亚州清高 | 免费女性裸身照无遮挡网站 | 国产成人亚洲精品午夜国产馆 | 97久久精品视频 | 老师你下面好紧夹死了 | 国产AV无码成人黄网站免费 | A级韩国乱理伦片在线观看 a级成人免费毛片完整版 | 欧洲兽交另类AVXXX | 浪荡受自我调教纯肉BL | 精品一区二区三区免费观看 | 佐山爱痴汉theav | JIZZ学生13| 国语自产拍大学生在线观看 | 在线免费视频国产 |