范式、Sql Server底层和.Net Framework 托管

 昨天一家外包公司的技术人员给我打电话,问了一些数据库的知识,他问我知道什么叫范式吗?我说不知道。他又问我你知道数据库的底层操作吗?我说不知道。当时他问范式我确实是没反映过来,他问数据库的底层操作我是不知道他指的底层操作是什么东西,后来上网查查资料,基本对底层操作有了一个了解。
  一般来说,关系型数据库的范式分为第一至第六范式,我们平常用到的也就是第一、第二、第三范式。关系型数据库必需满足第一范式,否则就不是关系型数据库。
  第一范式指的就是一条记录应该是一行,而不是放到一列,比如公司信息有公司名称、公司地址、联系电话、传真等,这些信息应该都放到一行,而不是在一列,这就是第一范式
  第二范式指的是一条记录应该有一个唯一区别的字段,也就是主键了,我们在数据库常的主键有自增量、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会为你的程序提供垃圾回收机制,直到运行的程序生命周期结束。
  最后,说一句,其实概念性的东西有时候还是很有用,特别是你在找工作的时候,因为他们一般会考这些,所以要多记一些术语、概念、名词,呵呵
posted @ 2009-08-19 17:29  ting_gt  阅读(242)  评论(0编辑  收藏  举报