MS SQL Server 心得與猜想:
數據庫是門高深的學問,有些知識雖然不太清楚,但我們可以推測可以思考。我們知道一個數據庫裡有很多個表,一個表裡有很多字段,一個字段上定義有很多規則。那讓我們想想,一個記錄裡包含所有字段對應的值,而記錄的數量是可變的,字段的個數也是可變的,可變加可變讓我們創建維護管理數據庫帶來了方便,問題是,怎樣實現這樣的功能呢?我們查找數據修改數據時可以選擇指定的字段指定的記錄,我們也一樣用得很高興,可是,為什麼這樣子可行呢?在沒有看過數據庫存儲結構有關書籍之前,讓我大膽地猜測:字段是相對獨立的對象,他擁有自己的屬性,我們用數組鏈表把表中的各個字段鏈接起來,這樣我們就可以動態地增減字段數,各個記錄字段的對應值都應該有指向上一個與下一個對應字段值的指針,這樣就形成一個十字交叉鏈表,記錄也就可以方便地管理了,我們好像也能自由選擇特定的字段來顯示與修改了,而且因為有指針這位大俠的幫忙,數據就可以方便地亂放了;可是,還有問題,增減一個字段好像要修改所有的記錄,我們的SQL語言好像也是面向集合的語言,這樣子的結構可行麼,高效麼?我不知道,我只是隨便想想罷了。還有啊,數據庫裡表與表之間的關系,在儲存結構裡又該如何表述呢?缺省與規則又是如何的綁定到字段呢?唉,算了,到此為止,有空再想。
存儲過程:存儲過程由一組SQL語句組成,他們共同完成一個任務,我們用一個名字(可能還和一些叫參數的符號組成的一串符號)來表示這組語句;那麼,在遠程訪問數據庫時,我們就可以向數據庫所在的服務器發送這個名字,那麼服務器就執行對應的SQL語句組,並返回結果給客務機,這就達到減少發送的數據效果。
觸發器:觸發器定義了一組SQL語句,當我們對指定的表進行修改時,SQL Server 就會觸發對應的觸發器,執行特定的SQL語句組,以保證數據的正確性和一致性。
索引:由索引頁和數據頁組成;索引頁由一個或幾個數據項為關鍵字進行排序而組成,同一個關鍵字可以對應一個以上的記錄,並存儲有指向特定記錄的指針,通過關鍵字的排序可以加快查找記錄的速度,數據頁是實際的存儲數據的頁面。填充因子的作用是:因為在內存與硬盤的數據交換中,總是預先或優先把存儲位置相近的數據調入內存以減少缺頁中斷;所以在每個索引頁中預先留出一部分空間,使得系統在新增索引信息時能夠保持數據的連續性,從而加快查詢速度。
數據庫的安全:我們要使用SQL Server,需要使用一個登錄名來連接SQL服務器,登錄名提供了使用服務器的權力但並沒有提供使用服務器中的數據庫的權力;用戶帳號提供了使用數據庫的權力,所以我需要為登錄名提供一個用戶賬號以便在登錄服務器的同時能使用其中特定的數據庫;不同的用戶賬號使用數據庫的權限是不同的,比如有的用戶只能查看數據而不能修改,有的用戶能夠賦給別的用戶使用數據庫的權力,於是我們使用角色來為擁有不同權限的用戶分類,把擁有相同權限的用用戶集中起來管理,我們在創建數據庫用戶的同時也指定了他在數據中扮演的角色(使用數據庫的權限)。系統管理員與數據庫擁有者擁有管理數據庫的最高權力。我們還可以為數據庫用戶指定對數據庫中的表,視圖,函數,存儲過程所擁有的權限,以從更低級的數據對象來管理數據庫安全。
當我們擁有了使用數據庫應有的權限時,在用戶應用程序中,我們是怎樣使用數據庫中的數據的呢?我們可以使用SELECT語句來創建一個臨時表,應用程序用戶能夠看到的使用的僅限於這個臨時表,這個臨時表擁有指向基表(實際上的有存儲數據的表)對應字段數據的指針,通過這個指針,我們就可以間接地修改選定的表中記錄記段的數據了。臨時表中的指針指向的,可以是基於特定表中特定字段中的數據,擁有如此小對象的數據的地址,我們因此可以聯合查詢修改數個表中的數據。視圖,可以理解為用一個字符串替換一句SELECT語句,以後要使用特定的SELECT時只需使用這字符串替換就行,這樣減輕了我們書寫SELECT語句的負擔,當然也浪費了存儲空間來存儲(存在系統表中)SELECT語句的信息。因為應用程序用戶是通過指針間接訪問數據的,所以當我們改變數據庫的物理存儲結構時,不必修改用戶程序,只需修改用戶程序中臨時表的數據地址就行了,而地址是動態自動分配的,這樣就保證的用戶程序的穩定性。也許改變物理存儲結構,我們只需重新編譯一下索引就行了,索引頁存有數據的地址,臨時表中的地址可方便地從索引頁中獲取,索引頁不大,獲取地址的效率很高。
COM的思考;