昨天一家外包公司的技術人員給我打電話,問了一些資料庫的知識,他問我知道什麼叫範式嗎?我說不知道。他又問我你知道資料庫的底層操作嗎?我說不知道。當時他問範式我確實是沒反映過來,他問資料庫的底層操作我是不知道他指的底層操作是什麼東西,後來上網查查資料,基本對底層操作有了一個瞭解。
一般來說,關係型資料庫的範式分為第一至第六範式,我們平常用到的也就是第一、第二、第三範式。關係型資料庫必需滿足第一範式,否則就不是關係型資料庫。
第一範式指的就是一條記錄應該是一行,而不是放到一列,比如公司資訊有公司名稱、公司地址、聯絡電話、傳真等,這些資訊應該都放到一行,而不是在一列,這就是第一範式。
第二範式指的是一條記錄應該有一個唯一區別的欄位,也就是主鍵了,我們在資料庫常的主鍵有自增量、GUID等,主鍵也是索引鍵。
第三範式實際上就是關係庫中用得最多的了,一對多,多對多都屬於第三範式範疇,這樣可能不太好理解。我們這麼講吧,比如說產品的資訊中有一個與廠商相關的資訊,這個廠商的資訊包括名稱、地址、電話等,那麼我們就應該將廠商的資訊獨立出來作為一個表,在產品資訊表中只一個索引與廠商表的主鍵相匹配。
一般來說,我們在建表的過程中,第二範式與第三範式用得最多,第一範式幾乎很少用,因為沒有主鍵的記錄幾乎是沒有意義的。但我們在建庫的時候是否一定要合乎某一範式呢?我給的答案是No,建庫一定要符合實際情況,而不是死搬硬套建庫要符合第三範式這個原則。第三範式確實有他的好處,如減少資料冗餘,但我們也不能忽略第三範式給我們帶來的麻煩,如更加複雜的Sql語句,我們在查詢的時候需要用到聯結查詢或者子查詢才能得到結果,這樣在使用.Net架構開發中並不太好處理;又如多表查詢會減慢速度。所以我們在建庫的時候應該根據實際情況來確定是用第三範式還是第二範式,像我先提到的廠商資訊與產品資訊,就一定要使用第三範式。
關於第二個問題,就是資料庫的底層操作,我當時不明白他說的資料庫底層是什麼東西,後來到網上一查,資料庫的底層就是資料庫的一些系統資料表、插入及更新資料等。
Sql Server在建一個庫的時候,每一個庫都會有一些系統資料表,如Sys_Objects、Sys_Columus等,這些表是幹嘛的呢,這些表是描述你所建表、預存程序、觸發、索引等的資訊的,也就是說,你所有建立的表都是儲存在系統資料表中,例如Sys_Columus儲存表的列資訊。
另一個是資料庫的插入資料方式,當資料在插入時,會有一條臨時資料(inserted);在更新資料時,會先刪除原有的記錄,將新的記錄再插進去;而刪除資料就是直接刪除了。所以觸發時,資料庫的動作只有inserted和updated兩種,根據這兩種特性,在寫觸發時很有用的。 還有第三個問題,不記得是哪家公司問我了,是關於.net代碼託管的問題,我當是以為是回調機制的託管,因為在C#中是有一個託管的,但他實際問的是.Net的代碼託管。
要想瞭解託管,我們需要從.Net的工作機制說起,.Net實際是上將你編寫的代碼編譯成中繼語言(MSIL),也就是說不管你使用C#還是.Net,都會編譯成為一個MSIL,而不是本地機器碼(根據特定的作業系統與特定的硬體環境產生的二進位代碼)。在啟動並執行程式的時候,首先必需啟動.Net Framework(隨作業系統啟動的一個服務)來運行你的程式,也就是說.Net Framework是一個環境,你的程式不是運行在作業系統中,而是運行在.Net Framework中。.Net Framework會把你的程式編譯成與本地機器相符合的二進位碼,叫做Just-in-time(JIT,運行時編譯),運行時編譯是一種按需編譯的機制。
這個過程就是託管了,在你的程式被.Net Framework託管的時候,.Net Framework會為你的程式提供記憶體回收機制,直到啟動並執行程式生命週期結束。 最後,說一句,其實概念性的東西有時候還是很有用,特別是你在找工作的時候,因為他們一般會考這些,所以要多記一些術語、概念、名詞,呵呵