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