<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>枫芸志 &#187; 程序开发</title>
	<atom:link href="http://witmax.cn/category/programming/feed" rel="self" type="application/rss+xml" />
	<link>http://witmax.cn</link>
	<description>记录成长路途上的点滴总结</description>
	<lastBuildDate>Thu, 09 Feb 2012 14:23:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>【C#】MVC请求统一验证的方法</title>
		<link>http://witmax.cn/mvc-request-unified-authentication.html</link>
		<comments>http://witmax.cn/mvc-request-unified-authentication.html#comments</comments>
		<pubDate>Sun, 05 Feb 2012 02:55:25 +0000</pubDate>
		<dc:creator>晴枫</dc:creator>
				<category><![CDATA[程序开发]]></category>
		<category><![CDATA[CSharp]]></category>

		<guid isPermaLink="false">http://witmax.cn/?p=1947</guid>
		<description><![CDATA[MVC出色的地方是优雅的URL格式和代码结构，很实用。 使用过程中遇到一个问题是需要对MVC的请求做统一的token验证，如果验证不过则跳转到制定页面。网上方法不多，不过还是找到了解决办法，即重写控制器的OnActionExecuting方法，在动作执行前进行统一的预处理，实现代码如下： 再修改其他所有的控制器继承自BaseController就OK了。上面的代码实现了出Home控制器外的请求在token验证失败时跳转到错误提示页面。]]></description>
			<content:encoded><![CDATA[<p>MVC出色的地方是优雅的URL格式和代码结构，很实用。</p>
<p>使用过程中遇到一个问题是需要对MVC的请求做统一的token验证，如果验证不过则跳转到制定页面。网上方法不多，不过还是找到了解决办法，即重写控制器的OnActionExecuting方法，在动作执行前进行统一的预处理，实现代码如下：</p>
<p><span id="more-1947"></span></p>
<p>public class BaseController : Controller<br />
{<br />
    protected override void OnActionExecuting(ActionExecutingContext context)<br />
    {<br />
        // 非错误提示接口则判断是否授权<br />
        if (!(context.ActionDescriptor.ControllerDescriptor.ControllerName == &quot;Home&quot;))<br />
        {<br />
            if (!CheckToken())<br />
            {<br />
                context.Result = RedirectToRoute(&quot;Default&quot;, new { Controller = &quot;Home&quot;, Action = &quot;Error&quot;, errCode = Error.TOKEN_ERR_CODE, errMsg = Error.TOKEN_ERR_MSG });<br />
            }<br />
        }<br />
        base.OnActionExecuting(context);<br />
    }</p>
<p>    /// &lt;summary&gt;<br />
    /// 验证token是否正确<br />
    /// &lt;/summary&gt;<br />
    /// &lt;returns&gt;&lt;/returns&gt;<br />
    private bool CheckToken()<br />
    {<br />
        if (System.Configuration.ConfigurationManager.AppSettings[&quot;check_token&quot;] == &quot;true&quot;)<br />
        {<br />
            string token = System.Configuration.ConfigurationManager.AppSettings[&quot;app_token&quot;];<br />
            return (Request[&quot;token&quot;] != null &amp;&amp; Request[&quot;token&quot;].ToString() == token);<br />
        }<br />
        else<br />
        {<br />
            return true;<br />
        }<br />
    }<br />
}<br />
再修改其他所有的控制器继承自BaseController就OK了。上面的代码实现了出Home控制器外的请求在token验证失败时跳转到错误提示页面。</pre>
]]></content:encoded>
			<wfw:commentRss>http://witmax.cn/mvc-request-unified-authentication.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【.NET】”若要针对 .NET Framework 4.0 或更高版本进行编译，则提供程序选项中“compilerVersion”特性的值必须为“v4.0”或更高版本。……”的解决办法</title>
		<link>http://witmax.cn/dotnet-web-config-compilerversion.html</link>
		<comments>http://witmax.cn/dotnet-web-config-compilerversion.html#comments</comments>
		<pubDate>Wed, 01 Feb 2012 15:11:35 +0000</pubDate>
		<dc:creator>晴枫</dc:creator>
				<category><![CDATA[程序开发]]></category>
		<category><![CDATA[DotNet]]></category>

		<guid isPermaLink="false">http://witmax.cn/?p=1928</guid>
		<description><![CDATA[用C#基于.NET Framework 4.0开发的程序，调试一切正常，但发布后放到正式环境就出现了以下错误 若 要针对 .NET Framework 4.0 或更高版本进行编译，则提供程序选项中“compilerVersion”特性的值必须为“v4.0”或更高版本。若要针对 .NET Framework 3.5 或更低版本编译此 Web 应用程序，则请从 Web.config 文件的 &#60;compilation&#62; 元素中移除 targetFramework 特性。 解决办法： 在网站的Web.config中增加或修改configuration&#62;system.codedom配置节]]></description>
			<content:encoded><![CDATA[<p>用C#基于.NET Framework 4.0开发的程序，调试一切正常，但发布后放到正式环境就出现了以下错误</p>
<blockquote><p>若 要针对 .NET Framework 4.0 或更高版本进行编译，则提供程序选项中“compilerVersion”特性的值必须为“v4.0”或更高版本。若要针对 .NET Framework 3.5 或更低版本编译此 Web 应用程序，则请从 Web.config 文件的 &lt;compilation&gt; 元素中移除 targetFramework 特性。</p></blockquote>
<p>解决办法：</p>
<p>在网站的Web.config中增加或修改configuration&gt;system.codedom配置节</p>
<p><span id="more-1928"></span></p>
<pre class="brush: plain; title: ; notranslate">&lt;system.codedom&gt;
      &lt;compilers&gt;
         &lt;compiler language=&quot;c#;cs;csharp&quot; extension=&quot;.cs&quot; type=&quot;Microsoft.CSharp.CSharpCodeProvider,System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&quot; warningLevel=&quot;4&quot;&gt;
             &lt;providerOption name=&quot;CompilerVersion&quot; value=&quot;v4.0&quot;/&gt;
             &lt;providerOption name=&quot;WarnAsError&quot; value=&quot;false&quot;/&gt;
       &lt;/compiler&gt;
         &lt;compiler language=&quot;vb;vbs;visualbasic;vbscript&quot; extension=&quot;.vb&quot; type=&quot;Microsoft.VisualBasic.VBCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&quot; warningLevel=&quot;4&quot;&gt;
          &lt;providerOption name=&quot;CompilerVersion&quot; value=&quot;v4.0&quot;/&gt;
          &lt;providerOption name=&quot;OptionInfer&quot; value=&quot;true&quot;/&gt;
          &lt;providerOption name=&quot;WarnAsError&quot; value=&quot;false&quot;/&gt;
         &lt;/compiler&gt;
      &lt;/compilers&gt;
  &lt;/system.codedom&gt;</pre>
]]></content:encoded>
			<wfw:commentRss>http://witmax.cn/dotnet-web-config-compilerversion.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>【SQL】找不到存储过程 &#8216;dbo.aspnet_CheckSchemaVersion&#8217;的解决办法</title>
		<link>http://witmax.cn/aspnet_checkschemaversion.html</link>
		<comments>http://witmax.cn/aspnet_checkschemaversion.html#comments</comments>
		<pubDate>Sun, 22 Jan 2012 11:36:09 +0000</pubDate>
		<dc:creator>晴枫</dc:creator>
				<category><![CDATA[程序开发]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://witmax.cn/?p=1917</guid>
		<description><![CDATA[在C#中用Membership时遇到了这个问题，如下 找不到存储过程 &#8216;dbo.aspnet_CheckSchemaVersion&#8217; 根据提示，通过数据库管理器建立这个存储过程就OK了，这个方法这里不提。但因为数据库是新建的，所以很可能有很多相关的存储过程都没有。于是找到了一下的方法： 运行C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_regsql.exe ASP.NET SQL Server数据库安装向导来进行配置。 通过配置对应的数据库即可，问题解决。]]></description>
			<content:encoded><![CDATA[<p>在C#中用Membership时遇到了这个问题，如下</p>
<blockquote><p>找不到存储过程 &#8216;dbo.aspnet_CheckSchemaVersion&#8217;</p></blockquote>
<p>根据提示，通过数据库管理器建立这个存储过程就OK了，这个方法这里不提。但因为数据库是新建的，所以很可能有很多相关的存储过程都没有。于是找到了一下的方法：</p>
<p>运行C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_regsql.exe ASP.NET SQL Server数据库安装向导来进行配置。</p>
<p>通过配置对应的数据库即可，问题解决。</p>
]]></content:encoded>
			<wfw:commentRss>http://witmax.cn/aspnet_checkschemaversion.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【SQL】找不到存储过程 &#8216;dbo.aspnet_Membership_GetUserByUserId&#8217; 的解决办法</title>
		<link>http://witmax.cn/aspnet_membership_getuserbyuserid.html</link>
		<comments>http://witmax.cn/aspnet_membership_getuserbyuserid.html#comments</comments>
		<pubDate>Sun, 22 Jan 2012 09:54:12 +0000</pubDate>
		<dc:creator>晴枫</dc:creator>
				<category><![CDATA[程序开发]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://witmax.cn/?p=1913</guid>
		<description><![CDATA[C#用Membership功能时报了这么个错误 找不到存储过程 &#8216;dbo.aspnet_Membership_GetUserByUserId&#8217; 根据提示，很显然数据库里缺少响应的存储过程，用数据库管理器打开对应的数据库执行以下sql语句即可。 参考：[dbo].[aspnet_Membership_GetUserByUserId]]]></description>
			<content:encoded><![CDATA[<p>C#用Membership功能时报了这么个错误</p>
<blockquote><p>找不到存储过程 &#8216;dbo.aspnet_Membership_GetUserByUserId&#8217;</p></blockquote>
<p>根据提示，很显然数据库里缺少响应的存储过程，用数据库管理器打开对应的数据库执行以下sql语句即可。</p>
<p><span id="more-1913"></span></p>
<pre class="brush: sql; title: ; notranslate">SET QUOTED_IDENTIFIER OFF
GO

CREATE PROCEDURE dbo.aspnet_Membership_GetUserByUserId
    @UserId               uniqueidentifier,
    @CurrentTimeUtc       datetime,
    @UpdateLastActivity   bit = 0
AS
BEGIN
    IF ( @UpdateLastActivity = 1 )
    BEGIN
        UPDATE   dbo.aspnet_Users
        SET      LastActivityDate = @CurrentTimeUtc
        FROM     dbo.aspnet_Users
        WHERE    @UserId = UserId

        IF ( @@ROWCOUNT = 0 ) -- User ID not found
            RETURN -1
    END

    SELECT  m.Email, m.PasswordQuestion, m.Comment, m.IsApproved,
            m.CreateDate, m.LastLoginDate, u.LastActivityDate,
            m.LastPasswordChangedDate, u.UserName, m.IsLockedOut,
            m.LastLockoutDate
    FROM    dbo.aspnet_Users u, dbo.aspnet_Membership m
    WHERE   @UserId = u.UserId AND u.UserId = m.UserId

    IF ( @@ROWCOUNT = 0 ) -- User ID not found
       RETURN -1

    RETURN 0
END

GO</pre>
<p>参考：<a href="http://docs.imis.com/15.1/Schema/Programmability/Stored_Procedures/aspnet_Membership_GetUserByUserId.html" target="_blank">[dbo].[aspnet_Membership_GetUserByUserId]</a></pre>
]]></content:encoded>
			<wfw:commentRss>http://witmax.cn/aspnet_membership_getuserbyuserid.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【C#】class与struct的区别</title>
		<link>http://witmax.cn/csharp-class-vs-struct.html</link>
		<comments>http://witmax.cn/csharp-class-vs-struct.html#comments</comments>
		<pubDate>Thu, 12 Jan 2012 13:51:11 +0000</pubDate>
		<dc:creator>晴枫</dc:creator>
				<category><![CDATA[程序开发]]></category>
		<category><![CDATA[CSharp]]></category>

		<guid isPermaLink="false">http://witmax.cn/?p=1898</guid>
		<description><![CDATA[class和struct语法几乎相同，但其本质却截然不同：class是引用类型，struct是值类型，也就是说在内存中存储方式有别，由此产生的一系列差异性。 class(类)是面向对象编程的基本概念，是一种自定义数据结构类型，通常包含字段、属性、方法、构造函数、索引器、事件等。在.NET中，所有的类都继承自System.Object类，是一种引用类型，也就是说，当我们new出一个类的实例时，对象保存了该实例实际数据的引用地址，而对象的值保存在托管堆中。 struct(结构)是一种值类型，用于将一组相关的信息变量组织成为一个单一的变量实体。所有的结构都继承自System.ValueType类，是一种值类型，我们可以像使用int和char一样去使用struct。struct实例分配在线程的堆栈上，它本身存储了值，而不是指向该值的指针。 了解了class和struct的本质，我们可以通过分析和实验来总结二者的区别： （1）关于实质：class是引用类型，struct是值类型 （2）关于职能：class是行为的封装，用来表述对象，而struct是数据的封装，用来储存数据 （3）关于继承：class支持继承自类和接口；而struct只能支继承接口。struct不能从class继承，也不能作为class的基类。 （4）关于构造函数：class可以声明无参构造函数，可以声明析构函数；而struct只能声明带参数构造函数，且不能声明析构函数。 （5）关于实例化：class要使用new关键字；而struct可以不使用new关键字，struct在声明时就进行了初始化过程，所有的成员变量均默认为0或null。 （6）关于抽象：class可以实抽象类(abstract)，可以声明抽象函数；而struct不能。 （7）关于重载：class可以声明protected成员、virtual成员、sealed成员和override成员；而struct不可以，但是值得注意的是，struct可以重载System.Object的3个虚方法，Equals()、ToString()和GetHashTable()。 （8）关于比较：两个class的比较有Equals和==两种，即值相等和引用相同；而两个struct可以直接通过==来判断。 （9）关于销毁：class实例由垃圾回收机制来保证内存的回收处理；而struct变量使用完后立即自动解除内存分配。 （10）关于参数传递：class变量是以按址方式传递；而struct变量是以按值方式传递的。 既然class几乎可以完全替代struct来实现所有的功能，那么struct还有存在的必要吗？至少在以下情况下，我们应该考虑使用struct来代替class： 实现一个用于存储数据的结构时，可以考虑struct。 考虑与某些非托管代码通信的兼容性问题时，可以考虑struct。 原文：NET中class与struct的区别简析 P.S. 附一篇《C#中虚函数和抽象函数的区别》]]></description>
			<content:encoded><![CDATA[<p>class和struct语法几乎相同，但其本质却截然不同：class是引用类型，struct是值类型，也就是说在内存中存储方式有别，由此产生的一系列差异性。</p>
<p>class(类)是面向对象编程的基本概念，是一种自定义数据结构类型，通常包含字段、属性、方法、构造函数、索引器、事件等。在.NET中，所有的类都继承自System.Object类，是一种引用类型，也就是说，当我们new出一个类的实例时，对象保存了该实例实际数据的引用地址，而对象的值保存在托管堆中。</p>
<p><span id="more-1898"></span></p>
<p>struct(结构)是一种值类型，用于将一组相关的信息变量组织成为一个单一的变量实体。所有的结构都继承自System.ValueType类，是一种值类型，我们可以像使用int和char一样去使用struct。struct实例分配在线程的堆栈上，它本身存储了值，而不是指向该值的指针。</p>
<p>了解了class和struct的本质，我们可以通过分析和实验来总结二者的区别：</p>
<p>（1）关于实质：class是引用类型，struct是值类型</p>
<p>（2）关于职能：class是行为的封装，用来表述对象，而struct是数据的封装，用来储存数据</p>
<p>（3）关于继承：class支持继承自类和接口；而struct只能支继承接口。struct不能从class继承，也不能作为class的基类。</p>
<p>（4）关于构造函数：class可以声明无参构造函数，可以声明析构函数；而struct只能声明带参数构造函数，且不能声明析构函数。</p>
<p>（5）关于实例化：class要使用new关键字；而struct可以不使用new关键字，struct在声明时就进行了初始化过程，所有的成员变量均默认为0或null。</p>
<p>（6）关于抽象：class可以实抽象类(abstract)，可以声明抽象函数；而struct不能。</p>
<p>（7）关于重载：class可以声明protected成员、virtual成员、sealed成员和override成员；而struct不可以，但是值得注意的是，struct可以重载System.Object的3个虚方法，Equals()、ToString()和GetHashTable()。</p>
<p>（8）关于比较：两个class的比较有Equals和==两种，即值相等和引用相同；而两个struct可以直接通过==来判断。</p>
<p>（9）关于销毁：class实例由垃圾回收机制来保证内存的回收处理；而struct变量使用完后立即自动解除内存分配。</p>
<p>（10）关于参数传递：class变量是以按址方式传递；而struct变量是以按值方式传递的。</p>
<p>既然class几乎可以完全替代struct来实现所有的功能，那么struct还有存在的必要吗？至少在以下情况下，我们应该考虑使用struct来代替class：</p>
<ol>
<li>实现一个用于存储数据的结构时，可以考虑struct。</li>
<li>考虑与某些非托管代码通信的兼容性问题时，可以考虑struct。</li>
</ol>
<p>原文：<a href="http://www.cnblogs.com/tangself/archive/2009/12/10/1621416.html" target="_blank">NET中class与struct的区别简析</a></p>
<p>P.S. 附一篇《<a href="http://hi.baidu.com/liaidongyinhu/blog/item/85fe0cc6d66acaa48326ac43.html" target="_blank">C#中虚函数和抽象函数的区别</a>》</p>
]]></content:encoded>
			<wfw:commentRss>http://witmax.cn/csharp-class-vs-struct.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>数据库范式解析（1NF 2NF 3NF BCNF）</title>
		<link>http://witmax.cn/database-normal-form.html</link>
		<comments>http://witmax.cn/database-normal-form.html#comments</comments>
		<pubDate>Mon, 09 Jan 2012 12:53:40 +0000</pubDate>
		<dc:creator>晴枫</dc:creator>
				<category><![CDATA[程序开发]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://witmax.cn/?p=1896</guid>
		<description><![CDATA[数据库设计范式是关系型数据库的设计准则。其目的在于通过规划设计使得数据库结构合理，尽量减少数据冗余，消除存储异常，方便数据的插入、更新和删除操作。目前常用范式包括1NF（第一范式）、2NF（第二范式）、3NF（第三范式）和BCNF（鲍依斯-科得范式）。 1NF 第一范式 如果一个关系模式R的所有属性都是不可分的基本数据项，则R∈1NF。 也可表述为：数据库表中的字段都是单一属性的，不可再分。 比如“地址”属性应该拆分为“城市”、“区县”、“具体地址”便于使用。 2NF 第二范式 若关系模式R∈1NF，并且每一个非主属性都完全函数依赖于R的码（多个主属性字段的组合），则R∈2NF 也可表述为：数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖（部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况），也即所有非关键字段都完全依赖于任意一组候选关键字。 比如选课关系表(学号, 姓名, 年龄, 课程名称, 成绩, 学分)，码为组合关键字(学号, 课程名称)，因为存在如下决定关系： 这个数据库表不满足第二范式，因为存在如下决定关系：(课程名称) → (学分) 和 (学号) → (姓名, 年龄)，即存在码中的部分字段决定非关键字的情况，所以不符合2NF。应修改为一以下三个表： 学生：Student(学号, 姓名, 年龄)； 课程：Course(课程名称, 学分)； 选课关系：SelectCourse(学号, 课程名称, 成绩)。 3NF 第三范式 关系模式R&#60;U，F&#62; 中若不存在这样的码X、属性组Y及非主属性Z（Z  Y）, 使得X→Y，Y→Z，成立，则称R&#60;U，F&#62; ∈ 3NF。 也可表述为：在第二范式的基础上，数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖，指的是如果存在”A → B → C”的决定关系，则C传递函数依赖于A。因此，满足第三范式的数据库表应该不存在如下依赖关系：关键字段 → 非关键字段x → 非关键字段y 比如：学生关系表为Student(学号, 姓名, 年龄, 所在学院, [...]]]></description>
			<content:encoded><![CDATA[<p>数据库设计范式是关系型数据库的设计准则。其目的在于通过规划设计使得数据库结构合理，尽量减少数据冗余，消除存储异常，方便数据的插入、更新和删除操作。目前常用范式包括1NF（第一范式）、2NF（第二范式）、3NF（第三范式）和BCNF（鲍依斯-科得范式）。</p>
<p><strong>1NF 第一范式</strong></p>
<p><em>如果一个关系模式R的所有属性都是不可分的基本数据项，则R∈1NF。</em></p>
<p>也可表述为：<em>数据库表中的字段都是单一属性的，不可再分。</em></p>
<p>比如“地址”属性应该拆分为“城市”、“区县”、“具体地址”便于使用。</p>
<p><span id="more-1896"></span></p>
<p><strong>2NF 第二范式</strong></p>
<p><em>若关系模式R∈1NF，并且每一个非主属性都</em><em>完全函数依赖</em><em>于R的码（多个主属性字段的组合），则R∈2NF</em></p>
<p>也可表述为：<em>数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖（部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况），也即所有非关键字段都完全依赖于任意一组候选关键字。</em></p>
<p>比如选课关系表(学号, 姓名, 年龄, 课程名称, 成绩, 学分)，码为组合关键字(学号, 课程名称)，因为存在如下决定关系：</p>
<p>这个数据库表不满足第二范式，因为存在如下决定关系：(课程名称) → (学分) 和 (学号) → (姓名, 年龄)，即存在码中的部分字段决定非关键字的情况，所以不符合2NF。应修改为一以下三个表：</p>
<p>学生：Student(学号, 姓名, 年龄)；</p>
<p>课程：Course(课程名称, 学分)；</p>
<p>选课关系：SelectCourse(学号, 课程名称, 成绩)。</p>
<p><strong>3NF 第三范式</strong></p>
<p><em>关系模式</em><em>R&lt;U，F&gt; 中若不存在这样的码X、属性组Y及非主属性Z（Z  Y）, 使得X→Y，Y→Z，成立，则称R&lt;U，F&gt; ∈ 3NF。</em></p>
<p>也可表述为：<em>在第二范式的基础上，数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖，指的是如果存在”A → B → C”的决定关系，则C传递函数依赖于A。因此，满足第三范式的数据库表应该不存在如下依赖关系：关键字段 → 非关键字段x → 非关键字段y</em></p>
<p>比如：学生关系表为Student(学号, 姓名, 年龄, 所在学院, 学院地点, 学院电话)关键字段为“学号”，存在以下决定关系(学号) → (姓名, 年龄, 所在学院, 学院地点, 学院电话)，符合2NF；但存在(学号) → (所在学院) → (学院地点, 学院电话)，不符合3NF。应改为：</p>
<p>学生：(学号, 姓名, 年龄, 所在学院)；</p>
<p>学院：(学院, 地点, 电话)。</p>
<p><strong>BCNF 鲍依斯-科得范式</strong></p>
<p><em>设</em><em>关系模式</em><em>R&lt;U，F&gt;∈1NF，如果对于R的每个函数依赖X→Y，若Y不属于X，则X必含有候选码，那么R∈BCNF。</em></p>
<p>也可表述为：在第三范式的基础上，数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖则符合第三范式。</p>
<p>比如：仓库管理关系表为(仓库ID, 存储物品ID, 管理员ID, 数量)，且有一个管理员只在一个仓库工作；一个仓库可以存储多种物品。这个数据库表中存在如下决定关系：</p>
<p>　　(仓库ID, 存储物品ID) →(管理员ID, 数量)</p>
<p>　　(管理员ID, 存储物品ID) → (仓库ID, 数量)</p>
<p>所以，(仓库ID, 存储物品ID)和(管理员ID, 存储物品ID)都是表的候选关键字，表中的唯一非关键字段为数量，它是符合第三范式的。但是，由于存在如下决定关系：</p>
<p>　　(仓库ID) → (管理员ID)</p>
<p>　　(管理员ID) → (仓库ID)</p>
<p>即存在关键字段决定关键字段的情况，所以其不符合BCNF范式。数据表应修改为：</p>
<p>　　仓库管理：(仓库ID, 管理员ID)；</p>
<p>　　仓库：(仓库ID, 存储物品ID, 数量)。</p>
<p><strong>四种范氏之间的关系</strong></p>
<p>每一个范氏都是进一步约束的关系，如下图：</p>
<div class="wp-caption aligncenter" style="width: 295px"><a href="http://witmax.cn/img/database-normal-form.gif" rel="lightbox[1896]" title="四种范式之间的关系"><img title="四种范式之间的关系" src="http://witmax.cn/img/database-normal-form.gif" alt="四种范式之间的关系" width="285" height="187" /></a><p class="wp-caption-text">四种范式之间的关系</p></div>
<p>参考：</p>
<ol>
<li><a href="http://jacki6.iteye.com/blog/774866" target="_blank">数据库范式（1NF 2NF 3NF BCNF）详解一</a></li>
<li><a href="http://jacki6.iteye.com/blog/774889" target="_blank">数据库范式（1NF 2NF 3NF BCNF）详解二</a></li>
<li><a href="http://blog.163.com/clevertanglei900@126/blog/static/111352259201131133326275/" target="_blank">SQL范式</a></li>
<li><a href="http://www.cnblogs.com/kissknife/archive/2009/10/26/1590029.html" target="_blank">细说数据库范式</a></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://witmax.cn/database-normal-form.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>【C】不用额外变量实现交换变量值</title>
		<link>http://witmax.cn/c-change-values.html</link>
		<comments>http://witmax.cn/c-change-values.html#comments</comments>
		<pubDate>Sat, 31 Dec 2011 09:07:42 +0000</pubDate>
		<dc:creator>晴枫</dc:creator>
				<category><![CDATA[程序开发]]></category>
		<category><![CDATA[C]]></category>

		<guid isPermaLink="false">http://witmax.cn/?p=1858</guid>
		<description><![CDATA[不用额外变量实现交换变量值，方法也很简单，纯记录]]></description>
			<content:encoded><![CDATA[<p>不用额外变量实现交换变量值，方法也很简单，纯记录</p>
<pre class="brush: plain; title: ; notranslate">#include &lt;stdio.h&gt;

void swap1(int &amp;a, int &amp;b)
{
 a += b;
 b = a - b;
 a = a - b;
}
void swap2(int &amp;a, int &amp;b)
{
 a = a ^ b;
 b = a ^ b;
 a = a ^ b;
}
void swap3(char &amp;a, char &amp;b)
{
 a = a ^ b;
 b = a ^ b;
 a = a ^ b;
}
int main()
{
    char a = '*';
    char b = '#';
    printf(&quot;%c %c\n&quot;, a, b);
    swap3(a, b);
    printf(&quot;%c %c\n&quot;, a, b);    

    scanf(&quot;%c&quot;, &amp;a);
    return 0;
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://witmax.cn/c-change-values.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【MySQL】修改时区设置</title>
		<link>http://witmax.cn/mysql-modify-time-zone-settings.html</link>
		<comments>http://witmax.cn/mysql-modify-time-zone-settings.html#comments</comments>
		<pubDate>Fri, 30 Dec 2011 10:30:18 +0000</pubDate>
		<dc:creator>晴枫</dc:creator>
				<category><![CDATA[程序开发]]></category>
		<category><![CDATA[软件技巧]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://witmax.cn/?p=1852</guid>
		<description><![CDATA[实践中遇到的一个问题，开发环境的时间数据一切正常，但正式环境数据库中的时间数据与实际相比差了8个小时。根据以往的PHP时区问题经验，断定问题处在MySQL的时区设定上。 用命令行连上去看一下时间，可以确认问题 修改方法： 修改mysql安装目录下的bin/my.ini，增加以下一行配置项 重启mysql，搞定了 p.s. PHP的时区配置项为 PHP代码中可以通过以下代码来设置时区 时区问题是个小问题，但有时候会影响数据展现，所以统一设置一下比较好。]]></description>
			<content:encoded><![CDATA[<p>实践中遇到的一个问题，开发环境的时间数据一切正常，但正式环境数据库中的时间数据与实际相比差了8个小时。根据以往的PHP时区问题经验，断定问题处在MySQL的时区设定上。</p>
<p>用命令行连上去看一下时间，可以确认问题</p>
<p><span id="more-1852"></span></p>
<pre class="brush: plain; title: ; notranslate">mysql&gt; show variables like '%time_zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone |        |
| time_zone        | SYSTEM |
+------------------+--------+
2 rows in set, 1 warning (0.00 sec)

mysql&gt; select now();
+---------------------+
| now()               |
+---------------------+
| 2011-12-30 18:12:25 |
+---------------------+
1 row in set (0.00 sec)</pre>
<p>修改方法：</p>
<p>修改mysql安装目录下的bin/my.ini，增加以下一行配置项</p>
<pre class="brush: plain; title: ; notranslate">default-time-zone       = &quot;+8:00&quot;</pre>
<p>重启mysql，搞定了</p>
<pre class="brush: plain; title: ; notranslate">mysql&gt; show variables like '%time_zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone |        |
| time_zone        | +08:00 |
+------------------+--------+
2 rows in set, 1 warning (0.00 sec)</pre>
<p>p.s. PHP的时区配置项为</p>
<pre class="brush: plain; title: ; notranslate">date.timezone = &quot;Asia/Shanghai&quot;</pre>
<p>PHP代码中可以通过以下代码来设置时区</p>
<pre class="brush: php; title: ; notranslate">date_default_timezone_set(&quot;Asia/Shanghai&quot;);</pre>
<p>时区问题是个小问题，但有时候会影响数据展现，所以统一设置一下比较好。</p>
]]></content:encoded>
			<wfw:commentRss>http://witmax.cn/mysql-modify-time-zone-settings.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【PHP】检测数字字符串is_numeric与ctype_digit的区别</title>
		<link>http://witmax.cn/php-is_numeric-vs-ctype_digit.html</link>
		<comments>http://witmax.cn/php-is_numeric-vs-ctype_digit.html#comments</comments>
		<pubDate>Fri, 02 Dec 2011 02:14:12 +0000</pubDate>
		<dc:creator>晴枫</dc:creator>
				<category><![CDATA[程序开发]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://witmax.cn/?p=1836</guid>
		<description><![CDATA[PHP中有两个函数is_numeric和ctype_digit都是检测字符串是否是数字，但也存在一点区别 is_numeric：检测是否为数字字符串，可为负数和小数 ctype_digit：检测字符串中的字符是否都是数字，负数和小数会检测不通过 写了个测试代码测试一下：]]></description>
			<content:encoded><![CDATA[<p>PHP中有两个函数is_numeric和ctype_digit都是检测字符串是否是数字，但也存在一点区别</p>
<ul>
<li>is_numeric：检测是否为数字字符串，可为负数和小数</li>
<li>ctype_digit：检测字符串中的字符是否都是数字，负数和小数会检测不通过</li>
</ul>
<p>写了个测试代码测试一下：</p>
<p><span id="more-1836"></span></p>
<pre class="brush: php; title: ; notranslate">&lt;?php
$a = '0001111222';
var_dump($a);
var_dump(is_numeric($a)); //true
var_dump(ctype_digit($a)); //true
$a = '0.1';
var_dump($a);
var_dump(is_numeric($a)); //true
var_dump(ctype_digit($a)); //false

$a = '-1';
var_dump($a);
var_dump(is_numeric($a)); //true
var_dump(ctype_digit($a)); //false

$a = 'a';
var_dump($a);
var_dump(is_numeric($a)); //false
var_dump(ctype_digit($a)); //false

?&gt;</pre>
]]></content:encoded>
			<wfw:commentRss>http://witmax.cn/php-is_numeric-vs-ctype_digit.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>【C】笔试题：从字符串中删除子字符串</title>
		<link>http://witmax.cn/c-code-filter-string.html</link>
		<comments>http://witmax.cn/c-code-filter-string.html#comments</comments>
		<pubDate>Wed, 30 Nov 2011 15:31:49 +0000</pubDate>
		<dc:creator>晴枫</dc:creator>
				<category><![CDATA[程序开发]]></category>
		<category><![CDATA[C]]></category>

		<guid isPermaLink="false">http://witmax.cn/?p=1829</guid>
		<description><![CDATA[一道面试题：从字符串A中删除所有的字符串B，返回结果。 写了下，代码如下：]]></description>
			<content:encoded><![CDATA[<p>一道面试题：从字符串A中删除所有的字符串B，返回结果。</p>
<p>写了下，代码如下：</p>
<pre class="brush: plain; title: ; notranslate">#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

char *filter(char *str, char *word)
{
 char *p, *q;
 char *src, *dst;
 dst = src = str;
 while(*src != '&#92;&#48;')
 {
   p = src;
   q = word;
   while(*p == *q &amp;&amp; *q != '&#92;&#48;')
   {
       p++;
       q++;
   }
   if (*q == '&#92;&#48;')
   {
       src = p;
   }
   else
   {
       *dst++ = *src++;
   }  
 }
 *dst = '&#92;&#48;';
 return str;
}

int main(int argc, char *argv[])
{
    char str[] = &quot;The food is good!&quot;;
    char word[] = &quot;oo&quot;;
    printf(&quot;%s&quot;, filter(str, word));
    return 0;
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://witmax.cn/c-code-filter-string.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

