定長記錄與不定長記錄

文件是操作系統的一種基本的數據結構。在邏輯上可看作是記錄的序列,物理上這些記錄被映射到磁盤塊中。一般數據模型中的記錄在文件中有兩種不同的組織格式:定長記錄和不定長記錄。

把數據庫映射到文件的一種方法是使用多個文件,每個關係表被映射到一個文件中存儲,這樣每個文件中就只存儲一個固定長度的記錄,這就是定長記錄格式的文件。另一種方法是自己構造文件,使之能夠容納多種長度的記錄,這樣整個數據庫就可以被映射到一個文件中存儲,即使用變長記錄格式的文件。

1.定長記錄

create table student(
  studentNo char,
  courseNo  char,
  float score,
)

假設一個字符佔1B,float類型佔4B,那麼student表中的一條記錄佔16B。這種方法就是用16B來存儲第一條記錄,接下來的16B來存儲第二條記錄。如圖1所示。

 

                                                                                   圖1

這種簡單的方法明顯的有兩個問題:

1.刪除一條記錄比較困難。要麼填充被刪空間,要麼標記被刪空間。

2.除非塊的大小是16的倍數,否則有的記錄會跨塊存儲。對於跨塊存儲的記錄的訪問就需要進行兩次磁盤的I/O操作。

當一條記錄被刪除時,緊隨其後的第二條記錄移到被刪除記錄的位置。如果表中含有大量的記錄時顯然這種方法需要移動大量的記錄。另一種方法是將文件的最後一條記錄移動到被刪除記錄的位置。移動記錄來填充刪除記錄所釋放的空間的做法並不理想,這樣做需要付出額外的塊訪問操作。所以一種做法是把刪除記錄的空間空着。等待隨後的插入記錄來使用這個空間。剛開始講到在可以在被刪除記錄上做一個已刪除標記,但當你去插入某條記錄時往往要找到這個空間比較困難。所以引入了一種額外的結構。

在文件的開始處分配一定數量的字節作爲文件頭,文件頭中存儲有關文件的各種信息。在文件頭中存儲第一條記錄被刪除記錄的地址。在第一條被刪除記錄中存儲被刪除第二條記錄的地址。這樣就形成了一條鏈表,稱爲空閒列表。如圖2所示。

                                                                                     圖2               

在插入一條記錄時,可以使用頭文件所指向的記錄。並改變文件頭的指針方向下一條記錄。如果空閒列表爲空,就將插入的記錄添加到文件末尾。

2.變長記錄

在數據庫系統中,以下幾種情況會使用變長記錄:

1.多種記錄類型(即多個關係表)在一個文件中存儲;

2.允許記錄類型中包含一個或多個變長字段;

3.允許記錄類型中包含重複字段,如數組等。

有多種變長記錄的存儲管理技術,這裏僅介紹分槽頁結構。分槽頁結構一般用於在塊中組織記錄。如圖所示。每個塊的開始處有一個塊頭,塊頭中包含的信息有:1.塊頭中已存儲的條目個數#E;2.塊中空閒空間的末尾地址EFS;3.條目數組,每個條目中存儲了該條目所對應變長記錄的大小ES和地址EP。

        如果一條記錄被刪除,首先,它所佔用的空間被釋放,他所對應的條目被置成刪除狀態(例如將ES置爲-1,該條目可以留作後面插入的記錄使用);其次,塊中位於被刪除記錄左邊的所有記錄右移,使刪除而被釋放的空間集中到塊的中部,所有被移動的記錄所對應條目的EP值也需要跟着修改,使其指向記錄的起始位置;最後,修改EFS的值,使它指向空閒空間的尾部,只要塊中有空閒的空間,使用類似的技術可以使記錄增長或縮短。 由於塊的大小有限,典型爲4KB,因此在塊內移動記錄的代價並不會太高。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章