﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-wmcoo-文章分类-SQLServer</title><link>http://www.blogjava.net/wmcoo/category/46422.html</link><description>岁月神偷</description><language>zh-cn</language><lastBuildDate>Mon, 15 Nov 2010 06:53:42 GMT</lastBuildDate><pubDate>Mon, 15 Nov 2010 06:53:42 GMT</pubDate><ttl>60</ttl><item><title>数据库三范式，轻松理解</title><link>http://www.blogjava.net/wmcoo/articles/334985.html</link><dc:creator>岁月神偷</dc:creator><author>岁月神偷</author><pubDate>Wed, 13 Oct 2010 01:45:00 GMT</pubDate><guid>http://www.blogjava.net/wmcoo/articles/334985.html</guid><wfw:comment>http://www.blogjava.net/wmcoo/comments/334985.html</wfw:comment><comments>http://www.blogjava.net/wmcoo/articles/334985.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wmcoo/comments/commentRss/334985.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wmcoo/services/trackbacks/334985.html</trackback:ping><description><![CDATA[<div>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #2a2a2a; font-family: Tahoma, Helvetica, Arial, sans-serif; font-size: 14px; line-height: 25px; "><br />
</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #2a2a2a; font-family: Tahoma, Helvetica, Arial, sans-serif; font-size: 14px; line-height: 25px; ">官方定义：第一范式（1NF）：数据库表中的字段都是单一属性的，不可再分。<br />
我的理解：第一范式这个不用說了，只要是关系数据库都满足第一范式</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #2a2a2a; font-family: Tahoma, Helvetica, Arial, sans-serif; font-size: 14px; line-height: 25px; ">官方定义：第二范式（2NF）：数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖<br />
我的理解：在第二范式中组合主键（AB）【注明：也叫做复合主键】里面的A或者B 与其他字段不能存在组合重复，为解决这个问题，通常的做法是咱们不用组合主键，添加一个ID，做为单一主键即可满足第二范式。如果不想添加ID，请满足组合主键（AB）里面的A或者B 与其他字段不能存在组合重复。<br />
如:不满足第二范式,复合主键中的A与字段C组合重复<br />
+------------+-----------+-------------------+<br />
pk pk row<br />
+------------+-----------+-------------------+<br />
A B C<br />
+------------+-----------+-------------------+<br />
A D C<br />
+------------+-----------+-------------------+<br />
A E C<br />
+------------+-----------+-------------------+</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #2a2a2a; font-family: Tahoma, Helvetica, Arial, sans-serif; font-size: 14px; line-height: 25px; ">改为这样满足第二范式(但是不满足第三范式,字段A与字段C是组合重复):<br />
+---------+------------+-----------+-------------------+<br />
pk row row row<br />
+---------+------------+-----------+-------------------+<br />
1 A B C<br />
+---------+------------+-----------+-------------------+<br />
2 A D C<br />
+---------+------------+-----------+-------------------+<br />
3 A E C<br />
+---------+------------+-----------+-------------------+</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #2a2a2a; font-family: Tahoma, Helvetica, Arial, sans-serif; font-size: 14px; line-height: 25px; ">官方定义：第三范式（3NF）：在第二范式的基础上，数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三 范式。<br />
我的理解：在第三范式中字段与字段之间不能存在组合重复<br />
如:不满足第三范式,字段A与字段C组合重复<br />
+---------+------------+-----------+-------------------+---------------+<br />
pk row row row row<br />
+---------+------------+-----------+-------------------+---------------+<br />
1 A B C F<br />
+---------+------------+-----------+-------------------+---------------+<br />
2 A D C G<br />
+---------+------------+-----------+-------------------+---------------+<br />
3 A E C K<br />
+---------+------------+-----------+-------------------+---------------+</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #2a2a2a; font-family: Tahoma, Helvetica, Arial, sans-serif; font-size: 14px; line-height: 25px; ">改为这样满足第三范式:<br />
表1<br />
+---------+------------+-----------+<br />
pk row row&nbsp;<br />
+---------+------------+-----------+<br />
1 A B&nbsp;<br />
+---------+------------+-----------+<br />
2 A D&nbsp;<br />
+---------+------------+-----------+<br />
3 A E&nbsp;<br />
+---------+------------+-----------+<br />
和表2<br />
+---------+-------------------+------------+<br />
pk row row<br />
+---------+-------------------+------------+<br />
1 C F<br />
+---------+-------------------+------------+<br />
2 C G<br />
+---------+-------------------+------------+<br />
3 C K<br />
+---------+-------------------+------------+</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #2a2a2a; font-family: Tahoma, Helvetica, Arial, sans-serif; font-size: 14px; line-height: 25px; ">原则:当出现字段与字段的组合重复,如上的A和C的组合重复,首先要考虑的就是把他们拆分为2个表,具体是C拆到表1, 还是A拆到表1,看情况而定.</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #2a2a2a; font-family: Tahoma, Helvetica, Arial, sans-serif; font-size: 14px; line-height: 25px; ">关键要理解定义这种范式标准的主要目的是为了减少数据冗余，数据冗余产生的本质就是在一个表中存在字段与字段之间的一对多，或者多对多关系。解决这个几对几的关系问题，就能轻易实现满足第三范式的数据库设计。<br />
<br />
总结:<br />
1NF:不允许用一个字段来表示多个字段的属性.<br />
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; color: #2a2a2a; font-family: Tahoma, Helvetica, Arial, sans-serif; font-size: 14px; line-height: 25px; ">2NF:不允许复合主键与字段之间的组合重复.</p>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; color: #2a2a2a; font-family: Tahoma, Helvetica, Arial, sans-serif; font-size: 14px; line-height: 25px; ">3NF:不允许字段与字段之间的组合重复.</p>
</p>
</div>
<img src ="http://www.blogjava.net/wmcoo/aggbug/334985.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wmcoo/" target="_blank">岁月神偷</a> 2010-10-13 09:45 <a href="http://www.blogjava.net/wmcoo/articles/334985.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>