SQL反模式學習筆記22 偽鍵潔癖,整理數據

  • 2019 年 10 月 4 日
  • 筆記

目標:整理數據,使不連續的主鍵Id數據記錄變的連續。

反模式:填充斷檔的數據空缺。

  1、不按照順序分配編號

在插入新行時,通過遍歷表,找到的第一個未分配的主鍵編號分配給新行,來代替原來自動分配的偽主鍵機制。

使用Select Max(Id) + 1 這種查詢語句,會出現並發訪問的問題。

  2、為現有數據行重新編號:通常做法是找到主鍵最大的行,然後用最小的未被使用的值來更新它。

    缺點:(1)SQL語句比較麻煩;

       (2)必須同時更新所有引用了你重新分配了主鍵的行的子記錄;

       (3)無法避免產生新的斷檔。

  3、製造數據差異

    如果別的外部系統依賴於資料庫中的主鍵來定義數據,那麼你的更新操作就會導致那個系統中的引用失效。

    重用主鍵不是一個號的注意,因為斷檔往往是由於一些合理的刪除或者回滾數據所造成的。

    別因為那些偽鍵看上去是沒用的而重新分配他們。

如何識別反模式:當出現以下情況時,可能是反模式

  1、在我回滾了一個插入操作後,要怎麼重用囊而自動生成的標識?

偽鍵一旦生成後不會回滾。如果非要回滾,RDBMS就必須在一耳光事務的聲明周期內生成一個偽鍵,

而這在多個客戶端並發地插入數據時,會導致競爭或者死鎖。

  2、bugId為3的這條記錄怎麼了?

  3、如何找到第一個未使用的Id?

  4、自增長整形id的數字標識如果達到了最大值怎麼辦?

合理使用反模式

  沒有理由要去改變偽鍵的值,由於它的值本身並沒有什麼重要的意義。如果這個主鍵列有實際的意義,那麼這就是一個自然鍵,而不是偽鍵。

解決方案

  主鍵的值必須是唯一且非空的,因而你才能使用主鍵來唯一確定一行記錄,但這是主鍵的唯一約束,

他們不需要一定非得是連續值才能用來標記行。

  1、定義行號:使用Row_Number()或者Limit等關鍵字來實現;

  2、使用Guid:資料庫全局唯一標識符。

優點:(1)可以再多個資料庫伺服器上並發地生成偽鍵,而不用擔心生成同樣的值。

(2)不存在斷檔的問題。

缺點:(1)Guid的值太長,不方便輸入;

       (2)Guid的值是隨機的,因此找不到任何規則或者依靠最大值來判斷哪一行的最新插入的;

       (3)Guid的存儲需要16位元組,這比傳統的4自檢整形偽鍵佔用更多的控制項,並且查詢的速度更慢

結論:將偽鍵當做行的唯一性標識,但它們不是行號。