資料庫的基本概念(二)
曾士熊
原文:http://www.ascc.sinica.edu.tw/nl/83/1009/section3_3.html
劉建文整理(http://blog.csdn.net/keminlau)
本文接第10個卷08期68頁
常見的電腦檔案包括:可執行程式檔案,批處理檔案,文字檔案和資料庫檔案等。可執行程式檔案主要是由一連串的機器碼指令所組成的,這些指令構成可處理特定工作或解決特定問題的程式。批處理檔案(batch file)的內容包括命令(command)和可執行程式檔案的主檔名,通常用來設定電腦系統的使用者環境或簡化執行程式的程式。文字檔案(text file)主要包括:文書檔案和原始程式檔案,其內容完全由字元(character)所構成。資料檔案(data file)則是用來存放程式執行時的輸入,輸出資料。電腦系統常利用擴充套件檔名來區別不同性質的檔案,例如:可執行程式檔案為.exe 或.com,批處理檔案為.bat,程式源**檔案通常以所用程式語言的名稱為副檔名。文字檔案和資料庫檔案的副檔名,除少數特例外,可由使用者依規定自選。
資料檔案的檔案結構:資料檔案通常是由一組格式相同但內容有異的記錄(record)所組成的,而且任何資料庫檔案所包含的記錄數量不固定。詳言之,同一檔案裡每一條記錄都是由相同的列(field)所構成的,這些列的資料型別可以是整數,實數或字串,有時候部份列還會再分成更小的次列。
仔細比對**資料型別和資料檔案的檔案結構,可發現兩者的區別只是專有名詞不同而已。換言之,若是把**內容儲存到電腦系統裡,必然形成具有特定記錄格式的資料檔案。圖七所示為一些專有名詞在三個領域裡的說法,圖中任何同列的三個不同用語其實說的是相同事物。請注意:圖七中最右邊直欄的「關係式(relational)」 為關係(relation)的形容詞。關係為代數學的專有名詞:指的是由一組定義域所形成的笛卡爾乘積(cartesian product)的子集合,其定義極為嚴謹,但卻是經常有人誤以為指的是**間的關係(正確說法是關聯) 。 2023年年6月,codd 博士在學術期刊《communication of acm》上,發表他那篇有名的**``a relational model of data for large shared data banks''倡議以代數學的關係來描述**,從此開啟了學術界研究關係式資料模式和軟體業者研發關係式資料庫的熱潮。多年之後,關係式資料庫擊敗了原先頗為風行的網狀式和層次式資料庫,成為**式資料庫領域裡獨領**的唯一要角。
由於在資料檔案裡的各個記錄(或**裡的行),其格式相同而數量不定,因此定義資料檔案(或**)時,只需宣告**名稱及其記錄(或行)格式即可,例如:圖八所示為參考的dbase規則所編寫的薪資單記錄格式。在圖八里,由左而右各個直欄分別是:列序號(num) ,列名稱(field name) ,資料型別(field type) ,寬度(width) ,小數字數(dec)和索引(index) 。在資料型別列裡, 「字元」代表該列的內容為字元或字串, 「數字」表示該列內容為可用以計算的數字。寬度列記錄各列的長度(位元組數),原則為:每個英文本母或阿拉伯數字佔1位元組,每個中文字佔2位元組。在索引欄中, 「y 」表示需針對該列另建索引檔案, "n"則表示不必。建索引的目的在於:當使用者需透過該列,從資料庫檔案(或**)查詢所要的記錄(或行)時,借索引之助,可大幅提高資料檢索的速度。不過建索引有利亦有弊:增加維護資料庫系統時的工作負擔。
建立資料庫檔案的目的非常明確:儲存和維護資料,以備使用者能隨時取用。很顯然的,如何從檔案裡讀出資料,必定會受到事前的資料存放方式所約制。因此如何安排記錄的訪問方式,便成為建立資料庫檔案時的重要課題。所謂檔案組織,指的就是如何去安排記錄在檔案裡的儲存方式,以方便應用程式檢索(retrieve)資料的一些技術。主要的檔案組織有四種,包括:順序訪問(sequential access),直接訪問(direct access) ,索引順序訪問(indexed sequential access)和多鍵檢索(multi-key retrieval) 。
順序訪問組織:這是構造最簡單但檢索速度最慢的一種檔案組織,其作法只是把記錄依照先來後到的順序一條接一條的存放在檔案裡,不加以任何特別處理,如圖九所示。在順序訪問式檔案組織裡,由於前後記錄之間只有先來後到的差別,而無任何關聯性,因此要從這種檔案中讀取任何一條記錄,都必須從頭開始,逐一讀取並且比對每一條記錄的指定列,直到找出所要的記錄,或是讀完整個檔案為止(即查詢失敗)。這種作法稱為線性查詢(linear search) 。假設檔案的記錄總數為ñ且每一條記錄被查詢的機會均等,則利用線性查詢法找出個別記錄所需的平均比對次數為ñ / 2 。
排序式順序訪問組織:由於上述簡單型順序訪問檔案的檢索效能太差,通常程式設計人員會把資料檔案裡的記錄,指定列由小而大的加以排序,用以排序的列稱為鍵(key)。排序式順序訪問可用二分查詢(binary search)法來檢索資料(但是只對鍵列有效) 。同樣具有ñ條記錄的檔案,使用二分查詢法只需要大約(log n)的次的比對就能找到或確定找不到目標記錄。請注意,這裡的日誌是以2為底而非以十為底。就具有1000條記錄的檔案而言,採用線性查詢法所需的平均比對次數為500 ,而採用二分查詢法所需的比對次數至多10個次。就記錄的數量較大的資料庫檔案而言,二分查詢法的資料檢索速度要比線性查詢法快上許多,但必須付出事前將資料檔案加以排序的代價。排序式順序訪問檔案的另一項優點是:排序時所用的鍵,往往也就是用以分類資料的關鍵列,因而有利於需要對資料順序處理的作業,例如:檔案批處理維護,製作統計報表等。
直接訪問組織:這種檔案組織的特點是只要給予目標記錄的鍵值,即可透過預定程式,轉換成目標記錄的位址(address) ,然後依此位址直接讀出所要的記錄。換言之,直接訪問式組織可用以從資料庫檔案裡迅速的檢索出個別的記錄。直接訪問式檔案組織的主要技術有二:
索引順序訪問組織:顧名思義,就是把排序過的資料主檔案附加上索引檔案所構成的檔案組織。簡要的說,索引順序訪問組織類似於把圖十里的資料主檔案加以排序,而排序過的資料庫檔案就形同排序式順序訪問檔案。因此這種檔案組織的第乙個特點是:兼具排序式順序訪問組織有利於順序處理作業,以及直接訪問組織便於檢索個別記錄的優點。索引順序訪問組織的第二個特點是:新增或刪除任何記錄時,資料主檔案和索引檔案不僅可及時更新,而且資料主檔案仍保持排序狀態。為了能做到這一點,索引順序訪問檔案的組織要比前面所說的複雜許多。常見的作法是:把資料主檔案安排成串接的區塊(block),並且把索引檔案安排成b樹或b*樹結構,如圖十一所示。詳情請參考 mary es loomis 所著《data management and file processing》 一書的第十二及第二十章。
多鍵檢索組織:前述的排序式順序訪問,直接訪問檔案和索引順序訪問等三種檔案組織,都只能針對單一的非重複鍵(即不同記錄的鍵值亦不相同)做建立檔案組織的工作,依慣例都會選擇資料庫檔案的主鍵(primary key)。若遇有除了主鍵以外,還需要另以其他列(習慣上稱為副鍵,secondary key)檢索記錄的場合,就得另外建立多鍵檢索組織,較常見的作法是建反列(inversion)檔案。就以圖十二的客戶帳號資料表為例,假設要以列`` group-code/branch-type為''副鍵,建立反列檔案:首先就資料主檔案的每一條記錄,將預備當做副鍵的列和主鍵(列 id)一併摘錄出來; 然後仿照目錄查表式直接訪問組織的作法,另外建立原副鍵對原主鍵的反列檔案,如圖十三所示。 (待續)
python檔案資料操作
coding utf 8 import re import sys import struct import array import numpy as np define 8000 3 if name main sourcefilename r c users sophie desktop all...
解析txt檔案資料
publicclassfileaccessextendsactivitycatch exception e 讀檔案在.data data 包名 files 下面 param filename return publicstring readfiledata string filename catch...
oracle 檔案資料匯入
其中 load data infile x test123 4444.txt 為需要匯入的檔案路徑 into table t d win prize 為需要匯入的的表名稱 1 insert 為預設方式,在資料裝載開始時要求表為空 3 replace 刪除舊記錄 用 delete from table...