﻿<?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-轮上飞-随笔分类-&lt;b&gt;DATABASE&lt;/b&gt;</title><link>http://www.blogjava.net/zhyiwww/category/8901.html</link><description>zhyiwww</description><language>zh-cn</language><lastBuildDate>Thu, 08 May 2008 15:00:08 GMT</lastBuildDate><pubDate>Thu, 08 May 2008 15:00:08 GMT</pubDate><ttl>60</ttl><item><title>postgresql初接触</title><link>http://www.blogjava.net/zhyiwww/archive/2008/05/08/199350.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Thu, 08 May 2008 13:08:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2008/05/08/199350.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/199350.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2008/05/08/199350.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/199350.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/199350.html</trackback:ping><description><![CDATA[Linux下，第一次开始尝试使用postpreSQL,我就想启动postgresql服务，但是，系统告诉我失败了。原来是数据库没有初始化，所以，执行以下命令来了初始化数据库<br />/sbin/service postgresql initdb <br />回车，系统会让你输入你要创建的数据库的名称，<br />Initializing database: XXX<br />输入完毕，系统会有一些时间来创建数据库。<br />如果正常完成的话，那么系统会自己启动数据库服务。<br /><br /><br /><img src ="http://www.blogjava.net/zhyiwww/aggbug/199350.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2008-05-08 21:08 <a href="http://www.blogjava.net/zhyiwww/archive/2008/05/08/199350.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Mysql数据移植</title><link>http://www.blogjava.net/zhyiwww/archive/2007/08/27/139999.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Mon, 27 Aug 2007 08:23:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2007/08/27/139999.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/139999.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2007/08/27/139999.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/139999.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/139999.html</trackback:ping><description><![CDATA[以前没有用过mysql数据库，现在由于业务需要，要求把access中的数据转移到远程的mqsql数据库中，怎么办呢？<br />刚开始的时候，我用了一个软件Access2MySQL Pro 5，这个软件，可以直接实现从access导入数据到mysql,但是，我在导入的时候发现，直接从本地导入数据到远程服务器要花费很长的时间，大概一个表，数据有40MB,花了大概两个小时，太慢了。<br />如果是从本地的acess导入到本地mysql的话，还是很快的，软件也很好用。<br />还有，我是在本地操作远程数据库，远程的服务器是linux的，所以，我不能把access的数据库直接在远程直接导入，所以才导致了导入要花很长的时间。<br />所以，后来，我就想了一个办法，直接把access的数据导入到我的本地数据库。然后，通过mysql的管理界面，实现了一个数据库的备份，然后，直接连接到远程数据库，实现对远程数据库的数据导入，果然，速度很快，一个数据库，总共花了还不到一个小时就导入完毕了。<br />具体的实现步骤如下：<br />找到源数据库<br /><img src="http://www.blogjava.net/images/blogjava_net/zhyiwww/mysql/mysql1.JPG" alt="mysql1.JPG" border="0" height="607" width="878" /><br /><br />配置目标数据库<br /><br /><img src="http://www.blogjava.net/images/blogjava_net/zhyiwww/mysql/mysql2.JPG" alt="mysql2.JPG" border="0" height="464" width="694" /><br /><br />下面的步骤省略，实现导入就可以了。<br />数据库的备份如下图<br /><br /><img src="http://www.blogjava.net/images/blogjava_net/zhyiwww/mysql/mysql3.JPG" alt="mysql3.JPG" border="0" height="624" width="836" /><br /><br />假定你的备份文件的路径是e:\aa.sql<br />首先先连接远程数据库<br /><img src="http://www.blogjava.net/images/blogjava_net/zhyiwww/mysql/mysql4.JPG" alt="mysql4.JPG" border="0" height="514" width="829" /><br /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/zhyiwww/mysql/mysql5.JPG" alt="mysql5.JPG" border="0" height="507" width="823" /><br /><br />然后，就可以使用命令<br />source e:\aa.sql<br /><br />通过这种方式，虽然，多了一道工序，但是，速度明显快多了。能省不少的时间。<br />您如果也有这样的业务需求的话，不妨也试一下。<br /><br /><br /><img src ="http://www.blogjava.net/zhyiwww/aggbug/139999.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2007-08-27 16:23 <a href="http://www.blogjava.net/zhyiwww/archive/2007/08/27/139999.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库设计范式(转载)</title><link>http://www.blogjava.net/zhyiwww/archive/2006/06/28/55459.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Wed, 28 Jun 2006 01:27:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2006/06/28/55459.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/55459.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2006/06/28/55459.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/55459.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/55459.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" bordercolordark="white" cellpadding="0" width="100%" bordercolorlight="#bdbabd" border="1">
				<tbody>
						<tr>
								<td height="28">
										<table cellspacing="0" cellpadding="0" width="100%" align="center" border="0">
												<tbody>
														<tr>
																<td bgcolor="#006dbd" height="26">
																		<div align="center">
																				<strong>
																						<font color="#ffffff">数据库设计范式</font>
																				</strong>
																		</div>
																</td>
														</tr>
														<tr>
																<td height="26">
																		<table cellspacing="2" cellpadding="2" width="100%" border="0">
																				<tbody>
																						<tr>
																								<td height="22">关系数据库设计之时是要遵守一定的规则的。尤其是数据库设计范式 现简单介绍1NF（第一范式），2NF（第二范式），3NF（第三范式）和BCNF，另有第四范式和第五范式留到以后再介绍。 在你设计数据库之时，若能符合这几个范式，你就是数据库设计的高手。 <br /><br />第一范式（1NF）：在关系模式R中的每一个具体关系r中，如果每个属性值 都是不可再分的最小数据单位，则称R是第一范式的关系。例：如职工号，姓名，电话号码组成一个表（一个人可能有一个办公室电话 和一个家里电话号码） 规范成为1NF有三种方法： <br />一是重复存储职工号和姓名。这样，关键字只能是电话号码。 <br />二是职工号为关键字，电话号码分为单位电话和住宅电话两个属性 <br />三是职工号为关键字，但强制每条记录只能有一个电话号码。 <br />以上三个方法，第一种方法最不可取，按实际情况选取后两种情况。 <br /><br />第二范式（2NF）：如果关系模式R（U，F）中的所有非主属性都完全依赖于任意一个候选关键字，则称关系R 是属于第二范式的。 <br />例：选课关系 SCI（SNO，CNO，GRADE，CREDIT）其中SNO为学号， CNO为课程号，GRADEGE 为成绩，CREDIT 为学分。 由以上条件，关键字为组合关键字（SNO，CNO） <br />在应用中使用以上关系模式有以下问题： <br />a.数据冗余，假设同一门课由40个学生选修，学分就 重复40次。 <br />b.更新异常，若调整了某课程的学分，相应的元组CREDIT值都要更新，有可能会出现同一门课学分不同。 <br />c.插入异常，如计划开新课，由于没人选修，没有学号关键字，只能等有人选修才能把课程和学分存入。 <br />d.删除异常，若学生已经结业，从当前数据库删除选修记录。某些门课程新生尚未选修，则此门课程及学分记录无法保存。 <br />原因：非关键字属性CREDIT仅函数依赖于CNO，也就是CREDIT部分依赖组合关键字（SNO，CNO）而不是完全依赖。 <br />解决方法：分成两个关系模式 SC1（SNO，CNO，GRADE），C2（CNO，CREDIT）。新关系包括两个关系模式，它们之间通过SC1中的外关键字CNO相联系，需要时再进行自然联接，恢复了原来的关系 <br /><br />第三范式（3NF）：如果关系模式R（U，F）中的所有非主属性对任何候选关键字都不存在传递信赖，则称关系R是属于第三范式的。 <br />例：如S1（SNO，SNAME，DNO，DNAME，LOCATION） 各属性分别代表学号， <br />姓名，所在系，系名称，系地址。 <br />关键字SNO决定各个属性。由于是单个关键字，没有部分依赖的问题，肯定是2NF。但这关系肯定有大量的冗余，有关学生所在的几个属性DNO，DNAME，LOCATION将重复存储，插入，删除和修改时也将产生类似以上例的情况。 <br />原因：关系中存在传递依赖造成的。即SNO -&gt; DNO。 而DNO -&gt; SNO却不存在，DNO -&gt; LOCATION, 因此关键辽 SNO 对 LOCATION 函数决定是通过传递依赖 SNO -&gt; LOCATION 实现的。也就是说，SNO不直接决定非主属性LOCATION。 <br />解决目地：每个关系模式中不能留有传递依赖。 <br />解决方法：分为两个关系 S（SNO，SNAME，DNO），D（DNO，DNAME，LOCATION） <br />注意：关系S中不能没有外关键字DNO。否则两个关系之间失去联系。<br /><br />BCNF：如果关系模式R（U，F）的所有属性（包括主属性和非主属性）都不传递依赖于R的任何候选关键字，那么称关系R是属于BCNF的。或是关系模式R，如果每个决定因素都包含关键字（而不是被关键字所包含），则RCNF的关系模式。 <br />例：配件管理关系模式 WPE（WNO，PNO，ENO，QNT）分别表仓库号，配件号，职工号，数量。有以下条件 <br />a.一个仓库有多个职工。 <br />b.一个职工仅在一个仓库工作。 <br />c.每个仓库里一种型号的配件由专人负责，但一个人可以管理几种配件。 <br />d.同一种型号的配件可以分放在几个仓库中。 <br />分析：由以上得 PNO 不能确定QNT，由组合属性（WNO，PNO）来决定，存在函数依赖（WNO，PNO） -&gt; ENO。由于每个仓库里的一种配件由专人负责，而一个人可以管理几种配件，所以有组合属性（WNO，PNO）才能确定负责人，有（WNO，PNO）-&gt; ENO。因为 一个职工仅在一个仓库工作，有ENO -&gt; WNO。由于每个仓库里的一种配件由专人负责，而一个职工仅在一个仓库工作，有 （ENO，PNO）-&gt; QNT。 <br />找一下候选关键字，因为（WNO，PNO） -&gt; QNT，（WNO，PNO）-&gt; ENO ，因此 （WNO，PNO）可以决定整个元组，是一个候选关键字。根据ENO-&gt;WNO，（ENO，PNO）-&gt;QNT，故（ENO，PNO）也能决定整个元组，为另一个候选关键字。属性ENO，WNO，PNO 均为主属性，只有一个非主属性QNT。它对任何一个候选关键字都是完全函数依赖的，并且是直接依赖，所以该关系模式是3NF。 <br />分析一下主属性。因为ENO-&gt;WNO，主属性ENO是WNO的决定因素，但是它本身不是关键字，只是组合关键字的一部分。这就造成主属性WNO对另外一个候选关键字（ENO，PNO）的部 分依赖，因为（ENO，PNO）-&gt; ENO但反过来不成立，而P-&gt;WNO，故（ENO，PNO）-&gt; WNO 也是传递依赖。 <br />虽然没有非主属性对候选关键辽的传递依赖，但存在主属性对候选关键字的传递依赖，同样也会带来麻烦。如一个新职工分配到仓库工作，但暂时处于实习阶段，没有独立负责对某些配件的管理任务。由于缺少关键字的一部分PNO而无法插入到该关系中去。又如某个人改成不管配件了去负责安全，则在删除配件的同时该职工也会被删除。 <br />解决办法：分成管理EP（ENO，PNO，QNT），关键字是（ENO，PNO）工作EW（ENO，WNO）其关键字是ENO <br />缺点：分解后函数依赖的保持性较差。如此例中，由于分解,函数依赖（WNO，PNO）-&gt; ENO 丢失了, 因而对原来的语义有所破坏。没有体现出每个仓库里一种部件由专人负责。有可能出现 一部件由两个人或两个以上的人来同时管理。因此，分解之后的关系模式降低了部分完整性约束。 <br /><br />一个关系分解成多个关系，要使得分解有意义，起码的要求是分解后不丢失原来的信息。这些信息不仅包括数据本身，而且包括由函数依赖所表示的数据之间的相互制约。进行分解的目标是达到更高一级的规范化程度，但是分解的同时必须考虑两个问题：无损联接性和保持函数依赖。有时往往不可能做到既有无损联接性，又完全保持函数依赖。需要根据需要进行权衡。 <br /><br />1NF直到BCNF的四种范式之间有如下关系： <br />BCNF包含了3NF包含2NF包含1NF <br /><br />小结： <br />目地：规范化目的是使结构更合理，消除存储异常，使数据冗余尽量小，便于插入、删除和更新 <br />原则：遵从概念单一化 "一事一地"原则，即一个关系模式描述一个实体或实体间的一种联系。规范的实质就是概念的单一化。 <br />方法：将关系模式投影分解成两个或两个以上的关系模式。 <br />要求：分解后的关系模式集合应当与原关系模式"等价"，即经过自然联接可以恢复原关系而不丢失信息，并保持属性间合理的联系。 <br /><br />注意：一个关系模式结这分解可以得到不同关系模式集合，也就是说分解方法不是唯一的。最小冗余的要求必须以分解后的数据库能够表达原来数据库所有信息为前提来实现。其根本目标是节省存储空间，避免数据不一致性，提高对关系的操作效率，同时满足应用需求。实际上，并不一定要求全部模式都达到BCNF不可。有时故意保留部分冗余可能更方便数据查询。尤其对于那些更新频度不高，查询频度极高的数据库系统更是如此。 <br /><br />在关系数据库中，除了函数依赖之外还有多值依赖，联接依赖的问题，从而提出了第四范式，第五范式等更高一级的规范化要求。在此，以后再谈。 <br /><br />各位朋友，你看过后有何感想，其实，任何一本数据库基础理论的书都会讲这些东西，考虑到很多网友是半途出家，来做数据库。特找一本书大抄特抄一把，各位有什么问题，也别问我了，自已去找一本关系数据库理论的书去看吧，说不定，对各位大有帮助。说是说以上是基础理论的东西，请大家想想，你在做数据库设计的时候有没有考虑过遵过以上几个范式呢，有没有在数据库设计做得不好之时，想一想，对比以上所讲，到底是违反了第几个范式呢？ <br />我见过的数据库设计，很少有人做到很符合以上几个范式的，一般说来，第一范式大家都可以遵守，完全遵守第二第三范式的人很少了，遵守的人一定就是设计数据库的高手了，BCNF的范式出现机会较少，而且会破坏完整性，你可以在做设计之时不考虑它，当然在ORACLE中可通过触发器解决其缺点。以后我们共同做设计之时，也希望大家遵守以上几个范式。</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
						<tr>
								<td>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/zhyiwww/aggbug/55459.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2006-06-28 09:27 <a href="http://www.blogjava.net/zhyiwww/archive/2006/06/28/55459.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库设计范式的通俗理解(转载)</title><link>http://www.blogjava.net/zhyiwww/archive/2006/06/28/55458.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Wed, 28 Jun 2006 01:25:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2006/06/28/55458.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/55458.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2006/06/28/55458.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/55458.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/55458.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" bordercolordark="white" cellpadding="0" width="100%" bordercolorlight="#bdbabd" border="1">
				<tbody>
						<tr>
								<td height="28">
										<table cellspacing="0" cellpadding="0" width="100%" align="center" border="0">
												<tbody>
														<tr>
																<td bgcolor="#006dbd" height="26">
																		<div align="center">
																				<strong>
																						<font color="#ffffff">数据库设计的范式大纲</font>
																				</strong>
																		</div>
																</td>
														</tr>
														<tr>
																<td height="26">
																		<table cellspacing="2" cellpadding="2" width="100%" border="0">
																				<tbody>
																						<tr>
																								<td>
																										<strong>
																												<br />
																										</strong>
																										<i>
																										</i>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																		<table cellspacing="2" cellpadding="2" width="100%" border="0">
																				<tbody>
																						<tr>
																								<td height="22">第一范式<br /><br />对于表中的每一行，必须且仅仅有唯一的行值.在一行中的每一列仅有唯一的值并且具有原子性.<br /><br />第二范式<br /><br />第二范式要求非主键列是主键的子集，非主键列活动必须完全依赖整个主键。主键必须有唯一性的元素,一个主键可以由一个或更多的组成唯一值的列组成。一旦创建，主键无法改变，外键关联一个表的主键。主外键关联意味着一对多的关系.<br /><br />第三范式<br /><br />第三范式要求非主键列互不依赖.<br /><br />第四范式<br /><br />第四范式禁止主键列和非主键列一对多关系不受约束<br /><br />第五范式<br /><br />第五范式将表分割成尽可能小的块，为了排除在表中所有的冗余</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
						<tr>
								<td>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/zhyiwww/aggbug/55458.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2006-06-28 09:25 <a href="http://www.blogjava.net/zhyiwww/archive/2006/06/28/55458.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle常用数据字典(转载）</title><link>http://www.blogjava.net/zhyiwww/archive/2006/06/14/52808.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Wed, 14 Jun 2006 09:59:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2006/06/14/52808.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/52808.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2006/06/14/52808.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/52808.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/52808.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 说明																																																																										　　以下表格中收集了Oracle数据字典中几乎所有的视图或别名，至于每个视图或别名的字段请用‘Describe’语句来查询。																																										...&nbsp;&nbsp;<a href='http://www.blogjava.net/zhyiwww/archive/2006/06/14/52808.html'>阅读全文</a><img src ="http://www.blogjava.net/zhyiwww/aggbug/52808.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2006-06-14 17:59 <a href="http://www.blogjava.net/zhyiwww/archive/2006/06/14/52808.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>标识关系和非标识关系</title><link>http://www.blogjava.net/zhyiwww/archive/2006/06/13/52492.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Tue, 13 Jun 2006 07:59:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2006/06/13/52492.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/52492.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2006/06/13/52492.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/52492.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/52492.html</trackback:ping><description><![CDATA[
		<font size="5">信息建模方法，又称为数据建模方法。目前这种方法有很多，erwin采用<strong>IDEF1x</strong>和<strong>IE</strong>两种标准。<br /><font color="#3366ff"><strong>     标识关系：发生迁移时，外键将作为子实体的主键的一部分出现。<br />     非标识关系：发生迁移的键不作为子实体的主键出现，即子实体并不是标示依赖于父实体。</strong></font></font>
		<font color="#000000">
				<br />
				<font size="5">      IDEF标准：Integrated Computer-Aided Manufacturing（ICAM）DEFfinition）,起源于美国空军ICAM计划。其中最流行的是由IEEE认证的ANSI/IEEE1320.2.1标准，概念（数据） 建模语言标准―――IDEF1X（object97），已经成为业界公认的规范、标准的信息建模标准。<br />      IE标准：information Engineering。</font>
		</font>
<img src ="http://www.blogjava.net/zhyiwww/aggbug/52492.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2006-06-13 15:59 <a href="http://www.blogjava.net/zhyiwww/archive/2006/06/13/52492.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 数据库设计方法、规范与技巧（转载） </title><link>http://www.blogjava.net/zhyiwww/archive/2006/06/13/52482.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Tue, 13 Jun 2006 07:33:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2006/06/13/52482.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/52482.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2006/06/13/52482.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/52482.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/52482.html</trackback:ping><description><![CDATA[
		<font color="#000080" size="5"> </font>
		<a href="http://bowu.blogdriver.com/bowu/395274.html">
				<font color="#000080" size="5">数据库设计方法、规范与技巧（推荐）</font>
		</a>
		<font color="#000080" size="5">
		</font>
		<div class="diaryContent" id="diary395274" style="DISPLAY: block">
				<div>
						<font style="BACKGROUND-COLOR: #d3d3d3" color="#000080" size="5">一、数据库设计过程<br />数据库技术是信息资源管理最有效的手段。数据库设计是指对于一个给定的应用环境，构造最优的数据库模式，建立数据库及其应用系统，有效存储数据，满足用户信息要求和处理要求。<br />数据库设计中需求分析阶段综合各个用户的应用需求（现实世界的需求），在概念设计阶段形成独立于机器特点、独立于各个DBMS产品的概念模式（信息世界模型），用E-R图来描述。在逻辑设计阶段将E-R图转换成具体的数据库产品支持的数据模型如关系模型，形成数据库逻辑模式。然后根据用户处理的要求，安全性的考虑，在基本表的基础上再建立必要的视图（VIEW）形成数据的外模式。在物理设计阶段根据DBMS特点和处理的需要，进行物理存储安排，设计索引，形成数据库内模式。<br />1. 需求分析阶段 <br />需求收集和分析，结果得到数据字典描述的数据需求（和数据流图描述的处理需求）。 <br />需求分析的重点是调查、收集与分析用户在数据管理中的信息要求、处理要求、安全性与完整性要求。<br />需求分析的方法：调查组织机构情况、调查各部门的业务活动情况、协助用户明确对新系统的各种要求、确定新系统的边界。 <br />常用的调查方法有： 跟班作业、开调查会、请专人介绍、询问、设计调查表请用户填写、查阅记录。<br />分析和表达用户需求的方法主要包括自顶向下和自底向上两类方法。自顶向下的结构化分析方法（Structured Analysis，简称SA方法）从最上层的系统组织机构入手，采用逐层分解的方式分析系统，并把每一层用数据流图和数据字典描述。<br />数据流图表达了数据和处理过程的关系。系统中的数据则借助数据字典（Data Dictionary，简称DD）来描述。<br />数据字典是各类数据描述的集合，它是关于数据库中数据的描述，即元数据，而不是数据本身。数据字典通常包括数据项、数据结构、数据流、数据存储和处理过程五个部分(至少应该包含每个字段的数据类型和在每个表内的主外键)。<br />数据项描述＝｛数据项名，数据项含义说明，别名，数据类型，长度， <br />　　　　　　　　　取值范围，取值含义，与其他数据项的逻辑关系｝ <br />数据结构描述＝｛数据结构名，含义说明，组成:｛数据项或数据结构｝｝ <br />数据流描述＝｛数据流名，说明，数据流来源，数据流去向， <br />　　　　　　　　　组成:｛数据结构｝，平均流量，高峰期流量｝ <br />数据存储描述＝｛数据存储名，说明，编号，流入的数据流，流出的数据流， 　　<br />　　　　　　　　组成:｛数据结构｝，数据量，存取方式｝ <br />处理过程描述＝｛处理过程名，说明，输入:｛数据流｝，输出:｛数据流｝, <br />　　　　　　　　　　处理:｛简要说明｝｝ <br />2. 概念结构设计阶段 <br />通过对用户需求进行综合、归纳与抽象，形成一个独立于具体DBMS的概念模型，可以用E-R图表示。 <br />概念模型用于信息世界的建模。概念模型不依赖于某一个DBMS支持的数据模型。概念模型可以转换为计算机上某一DBMS支持的特定数据模型。 <br />概念模型特点：<br />(1) 具有较强的语义表达能力，能够方便、直接地表达应用中的各种语义知识。 <br />(2) 应该简单、清晰、易于用户理解，是用户与数据库设计人员之间进行交流的语言。<br />概念模型设计的一种常用方法为IDEF1X方法，它就是把实体-联系方法应用到语义数据模型中的一种语义模型化技术，用于建立系统信息模型。<br />    使用IDEF1X方法创建E-R模型的步骤如下所示:<br />2.1 第零步——初始化工程<br />这个阶段的任务是从目的描述和范围描述开始，确定建模目标，开发建模计划，组织建模队伍，收集源材料，制定约束和规范。收集源材料是这阶段的重点。通过调查和观察结果，业务流程，原有系统的输入输出，各种报表，收集原始数据，形成了基本数据资料表。<br />2.2 第一步——定义实体<br />实体集成员都有一个共同的特征和属性集，可以从收集的源材料——基本数据资料表中直接或间接标识出大部分实体。根据源材料名字表中表示物的术语以及具有“代码”结尾的术语，如客户代码、代理商代码、产品代码等将其名词部分代表的实体标识出来，从而初步找出潜在的实体，形成初步实体表。<br />2.3 第二步——定义联系<br />IDEF1X模型中只允许二元联系，n元联系必须定义为n个二元联系。根据实际的业务需求和规则，使用实体联系矩阵来标识实体间的二元关系，然后根据实际情况确定出连接关系的势、关系名和说明，确定关系类型，是标识关系、非标识关系（强制的或可选的）还是非确定关系、分类关系。如果子实体的每个实例都需要通过和父实体的关系来标识，则为标识关系，否则为非标识关系。非标识关系中，如果每个子实体的实例都与而且只与一个父实体关联，则为强制的，否则为非强制的。如果父实体与子实体代表的是同一现实对象，那么它们为分类关系。<br />2.4 第三步——定义码<br />通过引入交叉实体除去上一阶段产生的非确定关系，然后从非交叉实体和独立实体开始标识侯选码属性，以便唯一识别每个实体的实例，再从侯选码中确定主码。为了确定主码和关系的有效性，通过非空规则和非多值规则来保证，即一个实体实例的一个属性不能是空值，也不能在同一个时刻有一个以上的值。找出误认的确定关系，将实体进一步分解，最后构造出IDEF1X模型的键基视图（KB图）。<br />2.5 第四步——定义属性<br />从源数据表中抽取说明性的名词开发出属性表，确定属性的所有者。定义非主码属性，检查属性的非空及非多值规则。此外，还要检查完全依赖函数规则和非传递依赖规则，保证一个非主码属性必须依赖于主码、整个主码、仅仅是主码。以此得到了至少符合关系理论第三范式的改进的IDEF1X模型的全属性视图。<br />2.6 第五步——定义其他对象和规则<br />    定义属性的数据类型、长度、精度、非空、缺省值、约束规则等。定义触发器、存储过程、视图、角色、同义词、序列等对象信息。<br />3. 逻辑结构设计阶段 <br />    将概念结构转换为某个DBMS所支持的数据模型（例如关系模型），并对其进行优化。设计逻辑结构应该选择最适于描述与表达相应概念结构的数据模型，然后选择最合适的DBMS。<br />将E-R图转换为关系模型实际上就是要将实体、实体的属性和实体之间的联系转化为关系模式,这种转换一般遵循如下原则： <br />1）一个实体型转换为一个关系模式。实体的属性就是关系的属性。实体的码就是关系的码。 <br />2）一个m:n联系转换为一个关系模式。与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性。而关系的码为各实体码的组合。 <br />3）一个1:n联系可以转换为一个独立的关系模式，也可以与n端对应的关系模式合并。如果转换为一个独立的关系模式，则与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性，而关系的码为n端实体的码。 <br />4）一个1:1联系可以转换为一个独立的关系模式，也可以与任意一端对应的关系模式合并。<br />5）三个或三个以上实体间的一个多元联系转换为一个关系模式。与该多元联系相连的各实体的码以及联系本身的属性均转换为关系的属性。而关系的码为各实体码的组合。  <br />6）同一实体集的实体间的联系，即自联系，也可按上述1:1、1:n和m:n三种情况分别处理。 <br />7）具有相同码的关系模式可合并。 <br />为了进一步提高数据库应用系统的性能，通常以规范化理论为指导，还应该适当地修改、调整数据模型的结构，这就是数据模型的优化。确定数据依赖。消除冗余的联系。确定各关系模式分别属于第几范式。确定是否要对它们进行合并或分解。一般来说将关系分解为3NF的标准，即：<br />表内的每一个值都只能被表达一次。<br />•?表内的每一行都应该被唯一的标识（有唯一键）。<br />表内不应该存储依赖于其他键的非键信息。   <br />4. 数据库物理设计阶段 <br />为逻辑数据模型选取一个最适合应用环境的物理结构（包括存储结构和存取方法）。根据DBMS特点和处理的需要，进行物理存储安排，设计索引，形成数据库内模式。<br />5. 数据库实施阶段 <br />运用DBMS提供的数据语言（例如SQL）及其宿主语言（例如C），根据逻辑设计和物理设计的结果建立数据库，编制与调试应用程序，组织数据入库，并进行试运行。 数据库实施主要包括以下工作：用DDL定义数据库结构、组织数据入库 、编制与调试应用程序、数据库试运行  <br />6. 数据库运行和维护阶段 <br />数据库应用系统经过试运行后即可投入正式运行。在数据库系统运行过程中必须不断地对其进行评价、调整与修改。包括：数据库的转储和恢复、数据库的安全性、完整性控制、数据库性能的监督、分析和改进、数据库的重组织和重构造。<br /><br />建模工具的使用<br />为加快数据库设计速度，目前有很多数据库辅助工具（CASE工具），如Rational公司的Rational Rose，CA公司的Erwin和Bpwin，Sybase公司的PowerDesigner以及Oracle公司的Oracle Designer等。<br />ERwin主要用来建立数据库的概念模型和物理模型。它能用图形化的方式，描述出实体、联系及实体的属性。ERwin支持IDEF1X方法。通过使用ERwin建模工具自动生成、更改和分析IDEF1X模型，不仅能得到优秀的业务功能和数据需求模型，而且可以实现从IDEF1X模型到数据库物理设计的转变。ERwin工具绘制的模型对应于逻辑模型和物理模型两种。在逻辑模型中，IDEF1X工具箱可以方便地用图形化的方式构建和绘制实体联系及实体的属性。在物理模型中，ERwin可以定义对应的表、列，并可针对各种数据库管理系统自动转换为适当的类型。<br />设计人员可根据需要选用相应的数据库设计建模工具。例如需求分析完成之后，设计人员可以使用Erwin画ER图，将ER图转换为关系数据模型，生成数据库结构；画数据流图，生成应用程序。<br />二、数据库设计技巧<br />1. 设计数据库之前（需求分析阶段）<br />1) 理解客户需求，询问用户如何看待未来需求变化。让客户解释其需求，而且随着开发的继续，还要经常询问客户保证其需求仍然在开发的目的之中。<br />2) 了解企业业务可以在以后的开发阶段节约大量的时间。<br />3) 重视输入输出。<br />在定义数据库表和字段需求（输入）时，首先应检查现有的或者已经设计出的报表、查询和视图（输出）以决定为了支持这些输出哪些是必要的表和字段。<br />举例：假如客户需要一个报表按照邮政编码排序、分段和求和，你要保证其中包括了单独的邮政编码字段而不要把邮政编码糅进地址字段里。<br />4) 创建数据字典和ER 图表<br />ER 图表和数据字典可以让任何了解数据库的人都明确如何从数据库中获得数据。ER图对表明表之间关系很有用，而数据字典则说明了每个字段的用途以及任何可能存在的别名。对SQL 表达式的文档化来说这是完全必要的。<br />5) 定义标准的对象命名规范<br />数据库各种对象的命名必须规范。<br />2. 表和字段的设计（数据库逻辑设计）<br />表设计原则<br />1) 标准化和规范化<br />数据的标准化有助于消除数据库中的数据冗余。标准化有好几种形式，但Third Normal Form（3NF）通常被认为在性能、扩展性和数据完整性方面达到了最好平衡。简单来说，遵守3NF 标准的数据库的表设计原则是：“One Fact in One Place”即某个表只包括其本身基本的属性，当不是它们本身所具有的属性时需进行分解。表之间的关系通过外键相连接。它具有以下特点：有一组表专门存放通过键连接起来的关联数据。<br />举例：某个存放客户及其有关定单的3NF 数据库就可能有两个表：Customer 和Order。Order 表不包含定单关联客户的任何信息，但表内会存放一个键值，该键指向Customer 表里包含该客户信息的那一行。<br />事实上，为了效率的缘故，对表不进行标准化有时也是必要的。<br />2) 数据驱动<br />采用数据驱动而非硬编码的方式，许多策略变更和维护都会方便得多，大大增强系统的灵活性和扩展性。<br />举例，假如用户界面要访问外部数据源（文件、XML 文档、其他数据库等），不妨把相应的连接和路径信息存储在用户界面支持表里。还有，如果用户界面执行工作流之类的任务（发送邮件、打印信笺、修改记录状态等），那么产生工作流的数据也可以存放在数据库里。角色权限管理也可以通过数据驱动来完成。事实上，如果过程是数据驱动的，你就可以把相当大的责任推给用户，由用户来维护自己的工作流过程。<br />3) 考虑各种变化<br />在设计数据库的时候考虑到哪些数据字段将来可能会发生变更。<br />举例，姓氏就是如此（注意是西方人的姓氏，比如女性结婚后从夫姓等）。所以，在建立系统存储客户信息时，在单独的一个数据表里存储姓氏字段，而且还附加起始日和终止日等字段，这样就可以跟踪这一数据条目的变化。<br /><br />字段设计原则<br />4) 每个表中都应该添加的3 个有用的字段<br />•?dRecordCreationDate，在VB 下默认是Now()，而在SQL Server 下默认为GETDATE()<br />•?sRecordCreator，在SQL Server 下默认为NOT NULL DEFAULT USER<br />•?nRecordVersion，记录的版本标记；有助于准确说明记录中出现null 数据或者丢失数据的原因<br />5) 对地址和电话采用多个字段<br />描述街道地址就短短一行记录是不够的。Address_Line1、Address_Line2 和Address_Line3 可以提供更大的灵活性。还有，电话号码和邮件地址最好拥有自己的数据表，其间具有自身的类型和标记类别。<br />6) 使用角色实体定义属于某类别的列<br />在需要对属于特定类别或者具有特定角色的事物做定义时，可以用角色实体来创建特定的时间关联关系，从而可以实现自我文档化。<br />举例：用PERSON 实体和PERSON_TYPE 实体来描述人员。比方说，当John Smith, Engineer 提升为John Smith, Director 乃至最后爬到John Smith, CIO 的高位，而所有你要做的不过是改变两个表PERSON 和PERSON_TYPE 之间关系的键值，同时增加一个日期/时间字段来知道变化是何时发生的。这样，你的PERSON_TYPE 表就包含了所有PERSON 的可能类型，比如Associate、Engineer、Director、CIO 或者CEO 等。还有个替代办法就是改变PERSON 记录来反映新头衔的变化，不过这样一来在时间上无法跟踪个人所处位置的具体时间。<br />7) 选择数字类型和文本类型尽量充足<br />在SQL 中使用smallint 和tinyint 类型要特别小心。比如，假如想看看月销售总额，总额字段类型是smallint，那么，如果总额超过了$32,767 就不能进行计算操作了。<br />而ID 类型的文本字段，比如客户ID 或定单号等等都应该设置得比一般想象更大。假设客户ID 为10 位数长。那你应该把数据库表字段的长度设为12 或者13 个字符长。但这额外占据的空间却无需将来重构整个数据库就可以实现数据库规模的增长了。<br />8) 增加删除标记字段<br />在表中包含一个“删除标记”字段，这样就可以把行标记为删除。在关系数据库里不要单独删除某一行；最好采用清除数据程序而且要仔细维护索引整体性。 <br />3. 选择键和索引（数据库逻辑设计）<br />键选择原则：<br />1) 键设计4 原则<br />•?为关联字段创建外键。<br />•?所有的键都必须唯一。<br />•?避免使用复合键。<br />•?外键总是关联唯一的键字段。<br />2) 使用系统生成的主键<br />设计数据库的时候采用系统生成的键作为主键，那么实际控制了数据库的索引完整性。这样，数据库和非人工机制就有效地控制了对存储数据中每一行的访问。采用系统生成键作为主键还有一个优点：当拥有一致的键结构时，找到逻辑缺陷很容易。<br />3) 不要用用户的键(不让主键具有可更新性)<br />在确定采用什么字段作为表的键的时候，可一定要小心用户将要编辑的字段。通常的情况下不要选择用户可编辑的字段作为键。<br />4) 可选键有时可做主键<br />把可选键进一步用做主键，可以拥有建立强大索引的能力。<br /><br />索引使用原则：<br />索引是从数据库中获取数据的最高效方式之一。95%的数据库性能问题都可以采用索引技术得到解决。<br />1) 逻辑主键使用唯一的成组索引，对系统键（作为存储过程）采用唯一的非成组索引，对任何外键列采用非成组索引。考虑数据库的空间有多大，表如何进行访问，还有这些访问是否主要用作读写。<br />2) 大多数数据库都索引自动创建的主键字段，但是可别忘了索引外键，它们也是经常使用的键，比如运行查询显示主表和所有关联表的某条记录就用得上。<br />3) 不要索引memo/note 字段，不要索引大型字段（有很多字符），这样作会让索引占用太多的存储空间。<br />4) 不要索引常用的小型表<br />不要为小型数据表设置任何键，假如它们经常有插入和删除操作就更别这样作了。对这些插入和删除操作的索引维护可能比扫描表空间消耗更多的时间。<br /><br />4. 数据完整性设计（数据库逻辑设计）<br />1) 完整性实现机制：<br />实体完整性：主键<br />参照完整性：<br />父表中删除数据：级联删除；受限删除；置空值<br />父表中插入数据：受限插入；递归插入<br />父表中更新数据：级联更新；受限更新；置空值<br />DBMS对参照完整性可以有两种方法实现：外键实现机制（约束规则）和触发器实现机制<br />用户定义完整性：<br />    NOT NULL；CHECK；触发器<br />2) 用约束而非商务规则强制数据完整性<br />采用数据库系统实现数据的完整性。这不但包括通过标准化实现的完整性而且还包括数据的功能性。在写数据的时候还可以增加触发器来保证数据的正确性。不要依赖于商务层保证数据完整性；它不能保证表之间（外键）的完整性所以不能强加于其他完整性规则之上。<br />3) 强制指示完整性<br />在有害数据进入数据库之前将其剔除。激活数据库系统的指示完整性特性。这样可以保持数据的清洁而能迫使开发人员投入更多的时间处理错误条件。<br />4) 使用查找控制数据完整性<br />控制数据完整性的最佳方式就是限制用户的选择。只要有可能都应该提供给用户一个清晰的价值列表供其选择。这样将减少键入代码的错误和误解同时提供数据的一致性。某些公共数据特别适合查找：国家代码、状态代码等。<br />5) 采用视图<br />为了在数据库和应用程序代码之间提供另一层抽象，可以为应用程序建立专门的视图而不必非要应用程序直接访问数据表。这样做还等于在处理数据库变更时给你提供了更多的自由。<br />5. 其他设计技巧<br />1) 避免使用触发器<br />触发器的功能通常可以用其他方式实现。在调试程序时触发器可能成为干扰。假如你确实需要采用触发器，你最好集中对它文档化。<br />2) 使用常用英语（或者其他任何语言）而不要使用编码<br />在创建下拉菜单、列表、报表时最好按照英语名排序。假如需要编码，可以在编码旁附上用户知道的英语。<br />3) 保存常用信息<br />让一个表专门存放一般数据库信息非常有用。在这个表里存放数据库当前版本、最近检查/修复（对Access）、关联设计文档的名称、客户等信息。这样可以实现一种简单机制跟踪数据库，当客户抱怨他们的数据库没有达到希望的要求而与你联系时，这样做对非客户机/服务器环境特别有用。<br />4) 包含版本机制<br />在数据库中引入版本控制机制来确定使用中的数据库的版本。时间一长，用户的需求总是会改变的。最终可能会要求修改数据库结构。把版本信息直接存放到数据库中更为方便。 <br />5) 编制文档<br />对所有的快捷方式、命名规范、限制和函数都要编制文档。<br />采用给表、列、触发器等加注释的数据库工具。对开发、支持和跟踪修改非常有用。<br />对数据库文档化，或者在数据库自身的内部或者单独建立文档。这样，当过了一年多时间后再回过头来做第2 个版本，犯错的机会将大大减少。<br />6) 测试、测试、反复测试<br />建立或者修订数据库之后，必须用用户新输入的数据测试数据字段。最重要的是，让用户进行测试并且同用户一道保证选择的数据类型满足商业要求。测试需要在把新数据库投入实际服务之前完成。<br />7) 检查设计<br />在开发期间检查数据库设计的常用技术是通过其所支持的应用程序原型检查数据库。换句话说，针对每一种最终表达数据的原型应用，保证你检查了数据模型并且查看如何取出数据。<br />三、数据库命名规范<br />1. 实体（表）的命名<br />1) 表以名词或名词短语命名，确定表名是采用复数还是单数形式，此外给表的别名定义简单规则（比方说，如果表名是一个单词，别名就取单词的前4 个字母；如果表名是两个单词，就各取两个单词的前两个字母组成4 个字母长的别名；如果表的名字由3 个单词组成，从头两个单词中各取一个然后从最后一个单词中再取出两个字母，结果还是组成4 字母长的别名，其余依次类推）<br />对工作用表来说，表名可以加上前缀WORK_ 后面附上采用该表的应用程序的名字。在命名过程当中，根据语义拼凑缩写即可。注意，由于ORCLE会将字段名称统一成大写或者小写中的一种，所以要求加上下划线。<br />举例：<br />定义的缩写 Sales: Sal 销售；<br />Order: Ord 订单；<br />Detail: Dtl 明细；<br />则销售订单明细表命名为：Sal_Ord_Dtl;<br />2) 如果表或者是字段的名称仅有一个单词，那么建议不使用缩写，而是用完整的单词。<br />举例：<br />定义的缩写 Material Ma 物品；<br />物品表名为：Material, 而不是 Ma.<br />但是字段物品编码则是：Ma_ID;而不是Material_ID<br />3) 所有的存储值列表的表前面加上前缀Z<br />目的是将这些值列表类排序在数据库最后。<br />4) 所有的冗余类的命名(主要是累计表)前面加上前缀X<br />冗余类是为了提高数据库效率，非规范化数据库的时候加入的字段或者表<br />5) 关联类通过用下划线连接两个基本类之后，再加前缀R的方式命名,后面按照字母顺序罗列两个表名或者表名的缩写。<br />关联表用于保存多对多关系。<br />如果被关联的表名大于10个字母，必须将原来的表名的进行缩写。如果没有其他原因，建议都使用缩写。<br />举例：表Object与自身存在多对多的关系,则保存多对多关系的表命名为：R_Object；<br />表 Depart和Employee;存在多对多的关系；则关联表命名为R_Dept_Emp<br />2. 属性（列）的命名<br />1) 采用有意义的列名，表内的列要针对键采用一整套设计规则。每一个表都将有一个自动ID作为主健,逻辑上的主健作为第一组候选主健来定义,如果是数据库自动生成的编码，统一命名为：ID;如果是自定义的逻辑上的编码则用缩写加“ID”的方法命名。如果键是数字类型，你可以用_NO 作为后缀；如果是字符类型则可以采用_CODE 后缀。对列名应该采用标准的前缀和后缀。<br />举例：销售订单的编号字段命名：Sal_Ord_ID；如果还存在一个数据库生成的自动编号，则命名为：ID。<br />2) 所有的属性加上有关类型的后缀，注意，如果还需要其它的后缀，都放在类型后缀之前。<br />注: 数据类型是文本的字段，类型后缀TX可以不写。有些类型比较明显的字段，可以不写类型后缀。<br />3) 采用前缀命名<br />给每个表的列名都采用统一的前缀，那么在编写SQL表达式的时候会得到大大的简化。这样做也确实有缺点，比如破坏了自动表连接工具的作用，后者把公共列名同某些数据库联系起来。<br />3. 视图的命名<br />1) 视图以V作为前缀，其他命名规则和表的命名类似；<br />2) 命名应尽量体现各视图的功能。<br />4. 触发器的命名<br />触发器以TR作为前缀，触发器名为相应的表名加上后缀，Insert触发器加'_I'，Delete触发器加'_D'，Update触发器加'_U'，如：TR_Customer_I，TR_Customer_D，TR_Customer_U。<br />5. 存储过程名<br />存储过程应以'UP_'开头，和系统的存储过程区分，后续部分主要以动宾形式构成，并用下划线分割各个组成部分。如增加代理商的帐户的存储过程为'UP_Ins_Agent_Account'。<br />6. 变量名<br />变量名采用小写，若属于词组形式，用下划线分隔每个单词，如@my_err_no。<br />7. 命名中其他注意事项<br />1)  以上命名都不得超过30个字符的系统限制。变量名的长度限制为29（不包括标识字符@）。<br />2)  数据对象、变量的命名都采用英文字符，禁止使用中文命名。绝对不要在对象名的字符之间留空格。<br />3) 小心保留词，要保证你的字段名没有和保留词、数据库系统或者常用访问方法冲突<br />5) 保持字段名和类型的一致性，在命名字段并为其指定数据类型的时候一定要保证一致性。假如数据类型在一个表里是整数，那在另一个表里可就别变成字符型了。</font>
				</div>
		</div>
<img src ="http://www.blogjava.net/zhyiwww/aggbug/52482.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2006-06-13 15:33 <a href="http://www.blogjava.net/zhyiwww/archive/2006/06/13/52482.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>简单谈谈关系数据库中范式理论(转载)</title><link>http://www.blogjava.net/zhyiwww/archive/2006/06/13/52469.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Tue, 13 Jun 2006 06:12:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2006/06/13/52469.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/52469.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2006/06/13/52469.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/52469.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/52469.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="760" align="center" border="0">
				<tbody>
						<tr>
								<td class="title" valign="center" align="middle" height="56">
										<p align="left"> </p>
								</td>
						</tr>
						<tr>
								<td class="formtitle" align="middle" height="40">
										<p align="left"> </p>
								</td>
						</tr>
				</tbody>
		</table>
		<table height="65" cellspacing="0" cellpadding="0" width="760" align="center" border="0">
				<tbody>
						<tr>
								<td class="content" height="65">
										<!-- #BeginEditable "3" -->
										<table width="760" align="center">
												<tbody>
														<tr>
																<td class="content">
																		<p>第一范式：</p>
																		<p>所有的属性都是不可分割的原子单位。</p>
																		<p>第二范式：</p>
																		<p>如果关系模式R（U，F）中的所有非主属性都完全依赖于任意一个候选关键字，则称关系R 是属于第二范式。</p>
																		<p>第三范式：</p>
																		<p>如果关系模式R（U，F）中的所有非主属性对任何候选关键字都不存在传递信赖，则称关系R是属于第三范式的</p>
																		<p>BC范式：(BCNF)</p>
																		<p>如果关系模式R（U，F）的所有属性（包括主属性和非主属性）都不传递依赖于R的任何候选关键字，那么称关系R是属于BCNF的。</p>
																		<p>举例说明：</p>
																		<p>第一范式(1NF):</p>
																		<p>如果关系模式R的每个关系都是r的属性值不可分割的原子值,则称关系R是第一范式的模式.</p>　　不满足第一范式的情况:<br />　　关系R(name,address,phone)<br />　　----------------------------------------------------------------------<br />　　name address phone 
<p>AA 山西太原 2204446<br />　　 AA 山西太原 8350524<br />　　----------------------------------------------------------------------<br />说明:phone可以再分(可以分为phone1和phone2).</p><p>*************************************************************************************</p><p>第二范式(2NF):</p><p>1):局部依赖:<br />　　对于依赖关系 W-&gt;A (A依赖于W),如果存在X归属于W,且X-&gt;A(A依赖于X),那么称W-&gt;A是局部依赖;否则称W-&gt;A是完全依赖.<br />　　比如:<br />　　关系模式R(sno,cno,grade,tname,taddr)<br />　　sno:学生学号;cno:课程编号;grade:成绩;tname:老师姓名;taddr:老师住址<br />　　(sno,cno)-&gt;(tname,taddr)(sno,cno决定于tname以及cno)是局部依赖,因为cno-&gt;(tname,taddr).</p><p>2):二范式定义:<br />　　如果关系模式R满足第一范式,且每个非主属性完全依赖于侯选键,则称R满足第二范式.</p><p>不满足第二范式的情况:<br />　　关系模式R(sno,cno,grade,tname,taddr)<br />　　sno:学生学号;cno:课程编号;grade:成绩;tname:老师姓名;taddr:老师住址<br />　　----------------------------------------------------------------------<br />　　sno cno grade tname taddr</p>　　101 001 100 张老师 山西太原....<br />　　102 001 95 张老师 山西太原....<br />　　103 001 98 张老师 山西太原....<br />　　104 002 95 李老师 中国北京....<br />　　105 003 90 刘老师 中国上海....<br />　　----------------------------------------------------------------------<br />　　说明:出现相同的tname,taddr三次<br />　　消除方法:分解关系模式R<br />　　----------------------------------------------------------------------<br />　　R1(sno,cno,grade) 
<p>　　sno cno grade </p>　　101 001 100<br />　　102 001 95<br />　　103 001 98<br />　　104 002 95<br />　　105 003 90 
<p><br />　　R2(cno,tname,taddr)</p><p>　　cno tname taddr</p>　　001 张老师 山西太原....<br />　　002 李老师 中国北京....<br />　　003 刘老师 中国上海....<br />　　---------------------------------------------------------------------- 
<p>*************************************************************************************</p><p>第三范式(3NF):</p><p>1):传递依赖:如果X-&gt;Y,Y-&gt;A,且Y不依赖X和A不是Y的子集,那么称X-&gt;A是传递依赖.(A传递依赖于X)</p><p>2):三范式定义:<br />　　如果关系模式R是1NF,且每个非主属性都不依赖于R的侯选键,那么称R满足第三范式.</p>不满足第三范式的情况:<br />　　关系模式R2(cno,tname,taddr)是2NF模式,如果在R2中存在cno-&gt;tname,tname-&gt;taddr,那么cno-&gt;taddr就是个传递依赖,及不满足第三范式.<br />　　----------------------------------------------------------------------<br />　　cno tname taddr<br /><br />　　001 张老师 山西太原....<br />　　002 李老师 中国北京....<br />　　003 刘老师 中国上海....<br />　　004 张老师 山西太原....<br />　　005 张老师 山西太原....<br />　　----------------------------------------------------------------------<br />　　说明:张老师开设了3门课程,上面就出现了3个元组,教师地址重复了3次.<br />　　消除方法:分解关系模式R2<br />　　----------------------------------------------------------------------<br />　　R3(cno,tname) 
<p>　　cno tname </p>　　001 张老师<br />　　002 李老师<br />　　003 刘老师<br />　　004 张老师<br />　　005 张老师 
<p>　　R4(tname,taddr)</p><p>　　tname taddr</p>　　张老师 山西太原....<br />　　李老师 中国北京....<br />　　刘老师 中国上海....<br />　　---------------------------------------------------------------------- 
<p>再补充一下：</p><p>第四范式(4NF)</p><p>第四范式禁止主键列和非主键列一对多关系不受约束 </p><p>第五范式(5NF)</p><p>第五范式将表分割成尽可能小的块，为了排除在表中所有的冗余. </p></td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/zhyiwww/aggbug/52469.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2006-06-13 14:12 <a href="http://www.blogjava.net/zhyiwww/archive/2006/06/13/52469.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库设计三大范式应用实例剖析(转载)</title><link>http://www.blogjava.net/zhyiwww/archive/2006/06/13/52459.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Tue, 13 Jun 2006 05:58:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2006/06/13/52459.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/52459.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2006/06/13/52459.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/52459.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/52459.html</trackback:ping><description><![CDATA[
		<div class="postText">
				<strong>引言<br /><br /></strong>　　<a href="http://www.chinahtml.com/databases/" target="_blank">数据库</a>的设计范式是<a href="http://www.chinahtml.com/databases/" target="_blank">数据库</a>设计所需要满足的规范，满足这些规范的<a href="http://www.chinahtml.com/databases/" target="_blank">数据库</a>是简洁的、结构明晰的，同时，不会发生插入（insert）、删除（delete）和更新（update）操作异常。反之则是乱七八糟，不仅给<a href="http://www.chinahtml.com/databases/" target="_blank">数据库</a>的编程人员制造麻烦，而且面目可憎，可能存储了大量不需要的冗余信息。<br /><br />　　设计范式是不是很难懂呢？非也，大学教材上给我们一堆数学公式我们当然看不懂，也记不住。所以我们很多人就根本不按照范式来设计<a href="http://www.chinahtml.com/databases/" target="_blank">数据库</a>。<br /><br />　　实质上，设计范式用很形象、很简洁的话语就能说清楚，道明白。本文将对范式进行通俗地说明，并以笔者曾经设计的一个简单论坛的<a href="http://www.chinahtml.com/databases/" target="_blank">数据库</a>为例来讲解怎样将这些范式应用于实际工程。<br /><br />　　<strong>范式说明</strong><br /><br />　　第一范式（1NF）：<a href="http://www.chinahtml.com/databases/" target="_blank">数据库</a>表中的字段都是单一属性的，不可再分。这个单一属性由基本类型构成，包括整型、实数、字符型、逻辑型、日期型等。<br /><br />　　例如，如下的<a href="http://www.chinahtml.com/databases/" target="_blank">数据库</a>表是符合第一范式的：<br /><br /><table cellspacing="0" cellpadding="2" width="90%" align="center" border="1"><tbody><tr><td>字段1 </td><td>字段2 </td><td>字段3 </td><td>字段4</td></tr><tr><td> </td><td> </td><td> </td><td> </td></tr></tbody></table><br />　　而这样的<a href="http://www.chinahtml.com/databases/" target="_blank">数据库</a>表是不符合第一范式的：<br /><br /><table cellspacing="0" cellpadding="2" width="90%" align="center" border="1"><tbody><tr><td>字段1 </td><td>字段2 </td><td colspan="2"><div align="center">字段3 </div></td><td>字段4</td></tr><tr><td> </td><td> </td><td>字段3.1</td><td>字段3.2 </td><td> </td></tr></tbody></table><p><br />　　很显然，在当前的任何关系<a href="http://www.chinahtml.com/databases/" target="_blank">数据库</a>管理系统（DBMS）中，傻瓜也不可能做出不符合第一范式的<a href="http://www.chinahtml.com/databases/" target="_blank">数据库</a>，因为这些DBMS不允许你把<a href="http://www.chinahtml.com/databases/" target="_blank">数据库</a>表的一列再分成二列或多列。因此，你想在现有的DBMS中设计出不符合第一范式的<a href="http://www.chinahtml.com/databases/" target="_blank">数据库</a>都是不可能的。<br /><br />　　第二范式（2NF）：<a href="http://www.chinahtml.com/databases/" target="_blank">数据库</a>表中不存在非关键字段对任一候选关键字段的部分函数依赖（部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况），也即所有非关键字段都完全依赖于任意一组候选关键字。假定选课关系表为SelectCourse(学号, 姓名, 年龄, 课程名称, 成绩, 学分)，关键字为组合关键字(学号, 课程名称)，因为存在如下决定关系：<br /><br />　　(学号, 课程名称) → (姓名, 年龄, 成绩, 学分)<br /><br />　　这个<a href="http://www.chinahtml.com/databases/" target="_blank">数据库</a>表不满足第二范式，因为存在如下决定关系：<br /><br />　　(课程名称) → (学分)<br /><br />　　(学号) → (姓名, 年龄)<br /><br />　　即存在组合关键字中的字段决定非关键字的情况。<br /><br />　　由于不符合2NF，这个选课关系表会存在如下问题：<br /><br />　　(1) 数据冗余：<br /><br />　　同一门课程由n个学生选修，"学分"就重复n-1次；同一个学生选修了m门课程，姓名和年龄就重复了m-1次。<br /><br />　　(2) 更新异常：<br /><br />　　若调整了某门课程的学分，数据表中所有行的"学分"值都要更新，否则会出现同一门课程学分不同的情况。<br /><br />　　(3) 插入异常：<br /><br />　　假设要开设一门新的课程，暂时还没有人选修。这样，由于还没有"学号"关键字，课程名称和学分也无法记录入<a href="http://www.chinahtml.com/databases/" target="_blank">数据库</a>。<br /><br />　　(4) 删除异常：<br /><br />　　假设一批学生已经完成课程的选修，这些选修记录就应该从<a href="http://www.chinahtml.com/databases/" target="_blank">数据库</a>表中删除。但是，与此同时，课程名称和学分信息也被删除了。很显然，这也会导致插入异常。 <br /><br />　　把选课关系表SelectCourse改为如下三个表：<br /><br />　　学生：Student(学号, 姓名, 年龄)；<br /><br />　　课程：Course(课程名称, 学分)；<br /><br />　　选课关系：SelectCourse(学号, 课程名称, 成绩)。<br /><br />　　这样的<a href="http://www.chinahtml.com/databases/" target="_blank">数据库</a>表是符合第二范式的，消除了数据冗余、更新异常、插入异常和删除异常。<br /><br />　　另外，所有单关键字的<a href="http://www.chinahtml.com/databases/" target="_blank">数据库</a>表都符合第二范式，因为不可能存在组合关键字。<br /><br />　　第三范式（3NF）：在第二范式的基础上，数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖，指的是如果存在"A → B → C"的决定关系，则C传递函数依赖于A。因此，满足第三范式的<a href="http://www.chinahtml.com/databases/" target="_blank">数据库</a>表应该不存在如下依赖关系：<br /><br />　　关键字段 → 非关键字段x → 非关键字段y<br /><br />　　假定学生关系表为Student(学号, 姓名, 年龄, 所在学院, 学院地点, 学院电话)，关键字为单一关键字"学号"，因为存在如下决定关系：<br /><br />　　(学号) → (姓名, 年龄, 所在学院, 学院地点, 学院电话)<br /><br />　　这个<a href="http://www.chinahtml.com/databases/" target="_blank">数据库</a>是符合2NF的，但是不符合3NF，因为存在如下决定关系：<br /><br />　　(学号) → (所在学院) → (学院地点, 学院电话)<br /><br />　　即存在非关键字段"学院地点"、"学院电话"对关键字段"学号"的传递函数依赖。<br /><br />　　它也会存在数据冗余、更新异常、插入异常和删除异常的情况，读者可自行分析得知。<br /><br />　　把学生关系表分为如下两个表：<br /><br />　　学生：(学号, 姓名, 年龄, 所在学院)；<br /><br />　　学院：(学院, 地点, 电话)。<br /><br />　　这样的<a href="http://www.chinahtml.com/databases/" target="_blank">数据库</a>表是符合第三范式的，消除了数据冗余、更新异常、插入异常和删除异常。<br /><br />　　鲍依斯-科得范式（BCNF）：在第三范式的基础上，<a href="http://www.chinahtml.com/databases/" target="_blank">数据库</a>表中如果不存在任何字段对任一候选关键字段的传递函数依赖则符合第三范式。<br /><br />　　假设仓库管理关系表为StorehouseManage(仓库ID, 存储物品ID, 管理员ID, 数量)，且有一个管理员只在一个仓库工作；一个仓库可以存储多种物品。这个<a href="http://www.chinahtml.com/databases/" target="_blank">数据库</a>表中存在如下决定关系：<br /><br />　　(仓库ID, 存储物品ID) →(管理员ID, 数量)<br /><br />　　(管理员ID, 存储物品ID) → (仓库ID, 数量)<br /><br />　　所以，(仓库ID, 存储物品ID)和(管理员ID, 存储物品ID)都是StorehouseManage的候选关键字，表中的唯一非关键字段为数量，它是符合第三范式的。但是，由于存在如下决定关系：<br /><br />　　(仓库ID) → (管理员ID)<br /><br />　　(管理员ID) → (仓库ID)<br /><br />　　即存在关键字段决定关键字段的情况，所以其不符合BCNF范式。它会出现如下异常情况：<br /><br />　　(1) 删除异常：<br /><br />　　当仓库被清空后，所有"存储物品ID"和"数量"信息被删除的同时，"仓库ID"和"管理员ID"信息也被删除了。<br /><br />　　(2) 插入异常：<br /><br />　　当仓库没有存储任何物品时，无法给仓库分配管理员。<br /><br />　　(3) 更新异常：<br /><br />　　如果仓库换了管理员，则表中所有行的管理员ID都要修改。<br /><br />　　把仓库管理关系表分解为二个关系表：<br /><br />　　仓库管理：StorehouseManage(仓库ID, 管理员ID)；<br /><br />　　仓库：Storehouse(仓库ID, 存储物品ID, 数量)。<br /><br />　　这样的<a href="http://www.chinahtml.com/databases/" target="_blank">数据库</a>表是符合BCNF范式的，消除了删除异常、插入异常和更新异常。</p><p><strong>范式应用<br /><br /></strong>　　我们来逐步搞定一个论坛的<a href="http://www.chinahtml.com/databases/" target="_blank">数据库</a>，有如下信息：<br /><br />　　（1） 用户：用户名，email，主页，电话，联系地址<br /><br />　　（2） 帖子：发帖标题，发帖内容，回复标题，回复内容 <br /><br />　　第一次我们将<a href="http://www.chinahtml.com/databases/" target="_blank">数据库</a>设计为仅仅存在表：<br />　　 </p><p></p><table cellspacing="0" cellpadding="2" width="90%" align="center" border="1"><tbody><tr><td>用户名 </td><td>email </td><td>主页</td><td>电话</td><td>联系地址</td><td>发帖标题</td><td>发帖内容</td><td>回复标题</td><td>回复内容</td></tr></tbody></table><p><br />　　这个<a href="http://www.chinahtml.com/databases/" target="_blank">数据库</a>表符合第一范式，但是没有任何一组候选关键字能决定<a href="http://www.chinahtml.com/databases/" target="_blank">数据库</a>表的整行，唯一的关键字段用户名也不能完全决定整个元组。我们需要增加"发帖ID"、"回复ID"字段，即将表修改为：<br /><br /></p><p></p><table cellspacing="0" cellpadding="2" width="90%" align="center" border="1"><tbody><tr><td>用户名</td><td>email</td><td>主页</td><td>电话</td><td>联系地址</td><td>发帖ID</td><td>发帖标题</td><td>发帖内容</td><td>回复ID</td><td>回复标题</td><td>回复内容</td></tr></tbody></table><p><br />　　这样数据表中的关键字(用户名，发帖ID，回复ID)能决定整行：<br /><br />　　(用户名,发帖ID,回复ID) → (email,主页,电话,联系地址,发帖标题,发帖内容,回复标题,回复内容)<br /><br />　　但是，这样的设计不符合第二范式，因为存在如下决定关系：<br /><br />　　(用户名) → (email,主页,电话,联系地址)<br /><br />　　(发帖ID) → (发帖标题,发帖内容)<br /><br />　　(回复ID) → (回复标题,回复内容)<br /><br />　　即非关键字段部分函数依赖于候选关键字段，很明显，这个设计会导致大量的数据冗余和操作异常。 <br /><br />　　我们将<a href="http://www.chinahtml.com/databases/" target="_blank">数据库</a>表分解为（带下划线的为关键字）：<br /><br />　　（1） 用户信息：用户名，email，主页，电话，联系地址<br /><br />　　（2） 帖子信息：发帖ID，标题，内容<br /><br />　　（3） 回复信息：回复ID，标题，内容<br /><br />　　（4） 发贴：用户名，发帖ID<br /><br />　　（5） 回复：发帖ID，回复ID<br /><br />　　这样的设计是满足第1、2、3范式和BCNF范式要求的，但是这样的设计是不是最好的呢？<br /><br />　　不一定。<br /><br />　　观察可知，第4项"发帖"中的"用户名"和"发帖ID"之间是1：N的关系，因此我们可以把"发帖"合并到第2项的"帖子信息"中；第5项"回复"中的 "发帖ID"和"回复ID"之间也是1：N的关系，因此我们可以把"回复"合并到第3项的"回复信息"中。这样可以一定量地减少数据冗余，新的设计为：<br /><br />　　（1） 用户信息：用户名，email，主页，电话，联系地址<br /><br />　　（2） 帖子信息：用户名，发帖ID，标题，内容<br /><br />　　（3） 回复信息：发帖ID，回复ID，标题，内容<br /><br />　　<a href="http://www.chinahtml.com/databases/" target="_blank">数据库</a>表1显然满足所有范式的要求；<br /><br />　　<a href="http://www.chinahtml.com/databases/" target="_blank">数据库</a>表2中存在非关键字段"标题"、"内容"对关键字段"发帖ID"的部分函数依赖，即不满足第二范式的要求，但是这一设计并不会导致数据冗余和操作异常；<br /><br />　　<a href="http://www.chinahtml.com/databases/" target="_blank">数据库</a>表3中也存在非关键字段"标题"、"内容"对关键字段"回复ID"的部分函数依赖，也不满足第二范式的要求，但是与<a href="http://www.chinahtml.com/databases/" target="_blank">数据库</a>表2相似，这一设计也不会导致数据冗余和操作异常。<br /><br />　　由此可以看出，并不一定要强行满足范式的要求，对于1：N关系，当1的一边合并到N的那边后，N的那边就不再满足第二范式了，但是这种设计反而比较好！<br /><br />　　对于M：N的关系，不能将M一边或N一边合并到另一边去，这样会导致不符合范式要求，同时导致操作异常和数据冗余。 <br />对于1：1的关系，我们可以将左边的1或者右边的1合并到另一边去，设计导致不符合范式要求，但是并不会导致操作异常和数据冗余。<br /><br />　　<strong>结论</strong><br /><br />　　满足范式要求的<a href="http://www.chinahtml.com/databases/" target="_blank">数据库</a>设计是结构清晰的，同时可避免数据冗余和操作异常。这并意味着不符合范式要求的设计一定是错误的，在<a href="http://www.chinahtml.com/databases/" target="_blank">数据库</a>表中存在1：1或1：N关系这种较特殊的情况下，合并导致的不符合范式要求反而是合理的。<br /><br />　　在我们设计<a href="http://www.chinahtml.com/databases/" target="_blank">数据库</a>的时候，一定要时刻考虑范式的要求。</p></div>
<img src ="http://www.blogjava.net/zhyiwww/aggbug/52459.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2006-06-13 13:58 <a href="http://www.blogjava.net/zhyiwww/archive/2006/06/13/52459.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库设计范式解析(转载)</title><link>http://www.blogjava.net/zhyiwww/archive/2006/06/13/52457.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Tue, 13 Jun 2006 05:55:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2006/06/13/52457.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/52457.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2006/06/13/52457.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/52457.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/52457.html</trackback:ping><description><![CDATA[
		<strong>
				<br />
		</strong>引言  
<p></p><p>　　 数据库的设计范式是数据库设计所需要满足的规范，满足这些规范的数据库是简洁的、结构明晰的，同时，不会发生插入（insert）、删除（delete）和更新（update）操作异常。反之则是乱七八糟，不仅给数据库的编程人员制造麻烦，而且面目可憎，可能存储了大量不需要的冗余信息。 </p><p>　　 设计范式是不是很难懂呢？非也，大学教材上给我们一堆数学公式我们当然看不懂，也记不住。所以我们很多人就根本不按照范式来设计数据库。 </p><p>　　 实质上，设计范式用很形象、很简洁的话语就能说清楚，道明白。本文将对范式进行通俗地说明，并以笔者曾经设计的一个简单论坛的数据库为例来讲解怎样将这些范式应用于实际工程。 </p><p>　　 范式说明 </p><p>　　 第一范式（1NF）：数据库表中的字段都是单一属性的，不可再分。这个单一属性由基本类型构成，包括整型、实数、字符型、逻辑型、日期型等。 </p><p>例如，如下的数据库表是符合第一范式的： <br />　　 字段1  字段2  字段3  字段4  <br />　　  　　  　　  　　  </p><p>而这样的数据库表是不符合第一范式的： <br />　　 字段1 |字段2 | 字段3  　　 　　 　　 |字段4  <br />　　  　　   |　　  |　　 字段3.1  字段3.2  |　　  </p><p><br />　　 很显然，在当前的任何关系数据库管理系统（DBMS）中，傻瓜也不可能做出不符合第一范式的数据库，因为这些DBMS不允许你把数据库表的一列再分成二列或多列。因此，你想在现有的DBMS中设计出不符合第一范式的数据库都是不可能的。 </p><p>　　 第二范式（2NF）：数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖（部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况），也即所有非关键字段都完全依赖于任意一组候选关键字。 </p><p>　　 假定选课关系表为SelectCourse(学号, 姓名, 年龄, 课程名称, 成绩, 学分)，关键字为组合关键字(学号, 课程名称)，因为存在如下决定关系： </p><p>　　 (学号, 课程名称) → (姓名, 年龄, 成绩, 学分) </p><p>　　 这个数据库表不满足第二范式，因为存在如下决定关系： </p><p>　　 (课程名称) → (学分) </p><p>　　 (学号) → (姓名, 年龄) </p><p>　　 即存在组合关键字中的字段决定非关键字的情况。 </p><p>　　 由于不符合2NF，这个选课关系表会存在如下问题： </p><p>　　 (1) 数据冗余： </p><p>　　 同一门课程由n个学生选修，"学分"就重复n-1次；同一个学生选修了m门课程，姓名和年龄就重复了m-1次。 </p><p>　　 (2) 更新异常： </p><p>　　 若调整了某门课程的学分，数据表中所有行的"学分"值都要更新，否则会出现同一门课程学分不同的情况。 </p><p>　　 (3) 插入异常： </p><p>　　 假设要开设一门新的课程，暂时还没有人选修。这样，由于还没有"学号"关键字，课程名称和学分也无法记录入数据库。 </p><p>　　 (4) 删除异常： </p><p>　　 假设一批学生已经完成课程的选修，这些选修记录就应该从数据库表中删除。但是，与此同时，课程名称和学分信息也被删除了。很显然，这也会导致插入异常。 </p><p>　　 把选课关系表SelectCourse改为如下三个表： </p><p>　　 学生：Student(学号, 姓名, 年龄)； </p><p>　　 课程：Course(课程名称, 学分)； </p><p>　　 选课关系：SelectCourse(学号, 课程名称, 成绩)。 </p><p>　　 这样的数据库表是符合第二范式的， 消除了数据冗余、更新异常、插入异常和删除异常。 </p><p>　　 另外，所有单关键字的数据库表都符合第二范式，因为不可能存在组合关键字。 </p><p>　　 第三范式（3NF）：在第二范式的基础上，数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖，指的是如果存在"A → B → C"的决定关系，则C传递函数依赖于A。因此，满足第三范式的数据库表应该不存在如下依赖关系： </p><p>　　 关键字段 → 非关键字段x → 非关键字段y </p><p>　　 假定学生关系表为Student(学号, 姓名, 年龄, 所在学院, 学院地点, 学院电话)，关键字为单一关键字"学号"，因为存在如下决定关系： </p><p>　　 (学号) → (姓名, 年龄, 所在学院, 学院地点, 学院电话) </p><p>　　 这个数据库是符合2NF的，但是不符合3NF，因为存在如下决定关系： </p><p>　　 (学号) → (所在学院) → (学院地点, 学院电话) </p><p>　　 即存在非关键字段"学院地点"、"学院电话"对关键字段"学号"的传递函数依赖。 </p><p>　　 它也会存在数据冗余、更新异常、插入异常和删除异常的情况，读者可自行分析得知。 </p><p>　　 把学生关系表分为如下两个表： </p><p>　　 学生：(学号, 姓名, 年龄, 所在学院)； </p><p>　　 学院：(学院, 地点, 电话)。 </p><p>　　 这样的数据库表是符合第三范式的，消除了数据冗余、更新异常、插入异常和删除异常。 </p><p>　　 鲍依斯-科得范式（BCNF）：在第三范式的基础上，数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖则符合第三范式。 </p><p>　　 假设仓库管理关系表为StorehouseManage(仓库ID, 存储物品ID, 管理员ID, 数量)，且有一个管理员只在一个仓库工作；一个仓库可以存储多种物品。这个数据库表中存在如下决定关系： </p><p>　　 (仓库ID, 存储物品ID) →(管理员ID, 数量) </p><p>　　 (管理员ID, 存储物品ID) → (仓库ID, 数量) </p><p>　　 所以，(仓库ID, 存储物品ID)和(管理员ID, 存储物品ID)都是StorehouseManage的候选关键字，表中的唯一非关键字段为数量，它是符合第三范式的。但是，由于存在如下决定关系： </p><p>　　 (仓库ID) → (管理员ID) </p><p>　　 (管理员ID) → (仓库ID) </p><p>　　 即存在关键字段决定关键字段的情况，所以其不符合BCNF范式。它会出现如下异常情况： </p><p>　　 (1) 删除异常： </p><p>　　 当仓库被清空后，所有"存储物品ID"和"数量"信息被删除的同时，"仓库ID"和"管理员ID"信息也被删除了。 </p><p>　　 (2) 插入异常： </p><p>　　 当仓库没有存储任何物品时，无法给仓库分配管理员。 </p><p>　　 (3) 更新异常： </p><p>　　 如果仓库换了管理员，则表中所有行的管理员ID都要修改。 </p><p>　　 把仓库管理关系表分解为二个关系表： </p><p>　　 仓库管理：StorehouseManage(仓库ID, 管理员ID)； </p><p>　　 仓库：Storehouse(仓库ID, 存储物品ID, 数量)。 </p><p>　　 这样的数据库表是符合BCNF范式的，消除了删除异常、插入异常和更新异常。 </p><p>　　 范式应用 </p><p>　　 我们来逐步搞定一个论坛的数据库，有如下信息： </p><p>　　 （1） 用户：用户名，email，主页，电话，联系地址 </p><p>　　 （2） 帖子：发帖标题，发帖内容，回复标题，回复内容 </p><p>　　 第一次我们将数据库设计为仅仅存在表： </p><p><br />用户名  email  主页  电话  联系地址  发帖标题  发帖内容  回复标题  回复内容  </p><p>　　 这个数据库表符合第一范式，但是没有任何一组候选关键字能决定数据库表的整行，唯一的关键字段用户名也不能完全决定整个元组。我们需要增加"发帖ID"、"回复ID"字段，即将表修改为： </p><p>用户名  email  主页  电话  联系地址  发帖ID  发帖标题  发帖内容  回复ID  回复标题  回复内容  </p><p>　　 这样数据表中的关键字(用户名，发帖ID，回复ID)能决定整行： </p><p>　　 (用户名,发帖ID,回复ID) → (email,主页,电话,联系地址,发帖标题,发帖内容,回复标题,回复内容) </p><p>　　 但是，这样的设计不符合第二范式，因为存在如下决定关系： </p><p>　　 (用户名) → (email,主页,电话,联系地址) </p><p>　　 (发帖ID) → (发帖标题,发帖内容) </p><p>　　 (回复ID) → (回复标题,回复内容) </p><p>　　 即非关键字段部分函数依赖于候选关键字段，很明显，这个设计会导致大量的数据冗余和操作异常。 </p><p>　　 我们将数据库表分解为（带下划线的为关键字）： </p><p>　　 （1） 用户信息：用户名，email，主页，电话，联系地址 </p><p>　　 （2） 帖子信息：发帖ID，标题，内容 </p><p>　　 （3） 回复信息：回复ID，标题，内容 </p><p>　　 （4） 发贴：用户名，发帖ID </p><p>　　 （5） 回复：发帖ID，回复ID </p><p>　　 这样的设计是满足第1、2、3范式和BCNF范式要求的，但是这样的设计是不是最好的呢？ </p><p>　　 不一定。 </p><p>　　 观察可知，第4项"发帖"中的"用户名"和"发帖ID"之间是1：N的关系，因此我们可以把"发帖"合并到第2项的"帖子信息"中；第5项"回复"中的"发帖ID"和"回复ID"之间也是1：N的关系，因此我们可以把"回复"合并到第3项的"回复信息"中。这样可以一定量地减少数据冗余，新的设计为： </p><p>　　 （1） 用户信息：用户名，email，主页，电话，联系地址 </p><p>　　 （2） 帖子信息：用户名，发帖ID，标题，内容 </p><p>　　 （3） 回复信息：发帖ID，回复ID，标题，内容 </p><p>　　 数据库表1显然满足所有范式的要求； </p><p>　　 数据库表2中存在非关键字段"标题"、"内容"对关键字段"发帖ID"的部分函数依赖，即不满足第二范式的要求，但是这一设计并不会导致数据冗余和操作异常； </p><p>　　 数据库表3中也存在非关键字段"标题"、"内容"对关键字段"回复ID"的部分函数依赖，也不满足第二范式的要求，但是与数据库表2相似，这一设计也不会导致数据冗余和操作异常。 </p><p>　　 由此可以看出，并不一定要强行满足范式的要求，对于1：N关系，当1的一边合并到N的那边后，N的那边就不再满足第二范式了，但是这种设计反而比较好！ </p><p>　　 对于M：N的关系，不能将M一边或N一边合并到另一边去，这样会导致不符合范式要求，同时导致操作异常和数据冗余。 <br />对于1：1的关系，我们可以将左边的1或者右边的1合并到另一边去，设计导致不符合范式要求，但是并不会导致操作异常和数据冗余。 </p><p>　　 结论 </p><p>　　 满足范式要求的数据库设计是结构清晰的，同时可避免数据冗余和操作异常。这并意味着不符合范式要求的设计一定是错误的，在数据库表中存在1：1或1：N关系这种较特殊的情况下，合并导致的不符合范式要求反而是合理的。 </p><p>　　 在我们设计数据库的时候，一定要时刻考虑范式的要求。<br /></p><img src ="http://www.blogjava.net/zhyiwww/aggbug/52457.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2006-06-13 13:55 <a href="http://www.blogjava.net/zhyiwww/archive/2006/06/13/52457.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库设计范式解释(转载)</title><link>http://www.blogjava.net/zhyiwww/archive/2006/06/13/52456.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Tue, 13 Jun 2006 05:54:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2006/06/13/52456.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/52456.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2006/06/13/52456.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/52456.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/52456.html</trackback:ping><description><![CDATA[
		<p style="LINE-HEIGHT: 150%">
				<font face="宋体" size="2">
						<span style="FONT-SIZE: 10.5pt; LINE-HEIGHT: 150%">第一范式（</span>
				</font>
				<font face="Arial" size="2">
						<span lang="EN-US" style="FONT-SIZE: 10.5pt; LINE-HEIGHT: 150%; FONT-FAMILY: Arial">1NF</span>
				</font>
				<font size="2">
						<span style="FONT-SIZE: 10.5pt; LINE-HEIGHT: 150%">）：在关系模式</span>
				</font>
				<font face="Arial" size="2">
						<span lang="EN-US" style="FONT-SIZE: 10.5pt; LINE-HEIGHT: 150%; FONT-FAMILY: Arial">R</span>
				</font>
				<font size="2">
						<span style="FONT-SIZE: 10.5pt; LINE-HEIGHT: 150%">中的每一个具体关系</span>
				</font>
				<font face="Arial" size="2">
						<span lang="EN-US" style="FONT-SIZE: 10.5pt; LINE-HEIGHT: 150%; FONT-FAMILY: Arial">r</span>
				</font>
				<font size="2">
						<span style="FONT-SIZE: 10.5pt; LINE-HEIGHT: 150%">中，如果每个属性值都是不可再分的最小数据单位，则称</span>
				</font>
				<font face="Arial" size="2">
						<span lang="EN-US" style="FONT-SIZE: 10.5pt; LINE-HEIGHT: 150%; FONT-FAMILY: Arial">R</span>
				</font>
				<font size="2">
						<span style="FONT-SIZE: 10.5pt; LINE-HEIGHT: 150%">是属于第一范式的关系。</span>
				</font>
				<font face="Arial" size="2">
						<span style="FONT-SIZE: 10.5pt; LINE-HEIGHT: 150%; FONT-FAMILY: Arial">
								<span lang="EN-US">
										<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
										<o:p>
										</o:p>
								</span>
						</span>
				</font>
		</p>
		<p style="LINE-HEIGHT: 150%">
				<font face="宋体" size="2">
						<span style="FONT-SIZE: 10.5pt; LINE-HEIGHT: 150%">第二范式（</span>
				</font>
				<font face="Arial" size="2">
						<span lang="EN-US" style="FONT-SIZE: 10.5pt; LINE-HEIGHT: 150%; FONT-FAMILY: Arial">2NF</span>
				</font>
				<font size="2">
						<span style="FONT-SIZE: 10.5pt; LINE-HEIGHT: 150%">）：如果关系模式</span>
				</font>
				<font face="Arial" size="2">
						<span lang="EN-US" style="FONT-SIZE: 10.5pt; LINE-HEIGHT: 150%; FONT-FAMILY: Arial">R</span>
				</font>
				<font size="2">
						<span style="FONT-SIZE: 10.5pt; LINE-HEIGHT: 150%">（</span>
				</font>
				<font face="Arial" size="2">
						<span lang="EN-US" style="FONT-SIZE: 10.5pt; LINE-HEIGHT: 150%; FONT-FAMILY: Arial">U</span>
				</font>
				<font size="2">
						<span style="FONT-SIZE: 10.5pt; LINE-HEIGHT: 150%">，</span>
				</font>
				<font face="Arial" size="2">
						<span lang="EN-US" style="FONT-SIZE: 10.5pt; LINE-HEIGHT: 150%; FONT-FAMILY: Arial">F</span>
				</font>
				<font size="2">
						<span style="FONT-SIZE: 10.5pt; LINE-HEIGHT: 150%">）中的所有非主属性都完全依赖于任意一个候选关键字，则称</span>
				</font>
				<font face="Arial" size="2">
						<span lang="EN-US" style="FONT-SIZE: 10.5pt; LINE-HEIGHT: 150%; FONT-FAMILY: Arial"> R</span>
				</font>
				<font size="2">
						<span style="FONT-SIZE: 10.5pt; LINE-HEIGHT: 150%">是属于第二范式的。</span>
				</font>
				<font face="Arial" size="2">
						<span style="FONT-SIZE: 10.5pt; LINE-HEIGHT: 150%; FONT-FAMILY: Arial">
								<span lang="EN-US">
										<o:p>
										</o:p>
								</span>
						</span>
				</font>
		</p>
		<p style="LINE-HEIGHT: 150%">
				<font face="宋体" size="2">
						<span style="FONT-SIZE: 10.5pt; LINE-HEIGHT: 150%">第三范式（</span>
				</font>
				<font face="Arial" size="2">
						<span lang="EN-US" style="FONT-SIZE: 10.5pt; LINE-HEIGHT: 150%; FONT-FAMILY: Arial">3NF</span>
				</font>
				<font size="2">
						<span style="FONT-SIZE: 10.5pt; LINE-HEIGHT: 150%">）：如果关系模式</span>
				</font>
				<font face="Arial" size="2">
						<span lang="EN-US" style="FONT-SIZE: 10.5pt; LINE-HEIGHT: 150%; FONT-FAMILY: Arial">R</span>
				</font>
				<font size="2">
						<span style="FONT-SIZE: 10.5pt; LINE-HEIGHT: 150%">（</span>
				</font>
				<font face="Arial" size="2">
						<span lang="EN-US" style="FONT-SIZE: 10.5pt; LINE-HEIGHT: 150%; FONT-FAMILY: Arial">U</span>
				</font>
				<font size="2">
						<span style="FONT-SIZE: 10.5pt; LINE-HEIGHT: 150%">，</span>
				</font>
				<font face="Arial" size="2">
						<span lang="EN-US" style="FONT-SIZE: 10.5pt; LINE-HEIGHT: 150%; FONT-FAMILY: Arial">F</span>
				</font>
				<font size="2">
						<span style="FONT-SIZE: 10.5pt; LINE-HEIGHT: 150%">）中的所有非主属性对任何候选关键字都不存在传递信赖，则称</span>
				</font>
				<font face="Arial" size="2">
						<span lang="EN-US" style="FONT-SIZE: 10.5pt; LINE-HEIGHT: 150%; FONT-FAMILY: Arial"> R</span>
				</font>
				<font size="2">
						<span style="FONT-SIZE: 10.5pt; LINE-HEIGHT: 150%">是属于第三范式的。</span>
				</font>
				<font face="Arial" size="2">
						<span lang="EN-US" style="FONT-SIZE: 10.5pt; LINE-HEIGHT: 150%; FONT-FAMILY: Arial">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoNormal">
				<br />
				<br />第一范式是关系数据库的最小要求<font face="Arial" color="navy" size="1"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial"><o:p></o:p></span></font></p>
		<p class="MsoNormal">
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">比如</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoNormal">
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">
								<o:p> </o:p>
						</span>
				</font>
		</p>
		<p class="MsoNormal">
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">姓名</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">                    </span>
				</font>
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">性别</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">                    </span>
				</font>
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">身高</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoNormal">
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">Billy                    </span>
				</font>
				<font face="Arial" color="red" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: red; FONT-FAMILY: Arial">Male </span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">             <?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /?><st1:chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="180" unitname="cm">180CM</st1:chmetcnv><o:p></o:p></span>
				</font>
		</p>
		<p class="MsoNormal">
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">这就是第一范式</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">.<o:p></o:p></span>
				</font>
		</p>
		<p class="MsoNormal">
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">如果改成</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoNormal">
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">                                                        </span>
				</font>
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">三</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">                                 </span>
				</font>
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">围</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">     <o:p></o:p></span>
				</font>
		</p>
		<p class="MsoNormal">
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">姓名</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">                    </span>
				</font>
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">性别</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">                    </span>
				</font>
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">胸围</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">          </span>
				</font>
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">臀围</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">          </span>
				</font>
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">腰围</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoNormal">
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">这个就不是第一范式了</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">.<o:p></o:p></span>
				</font>
		</p>
		<p class="MsoNormal">
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">
								<o:p> </o:p>
						</span>
				</font>
		</p>
		<p class="MsoNormal">
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">第二范式说通俗一点就是不存在部分依赖</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">,</span>
				</font>
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">举例如下</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">:<o:p></o:p></span>
				</font>
		</p>
		<p class="MsoNormal">
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">促销员的销量表</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">,</span>
				</font>
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">字段为促销员</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">OID,</span>
				</font>
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">产品</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">OID,</span>
				</font>
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">产品颜色</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">,</span>
				</font>
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">产品重量</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoNormal">
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">业务上主键应该为</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">
						</span>
				</font>
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">促销员</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">OID</span>
				</font>
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">和产品</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">OID<o:p></o:p></span>
				</font>
		</p>
		<p class="MsoNormal">
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">但是产品颜色和产品重量显然依赖于产品</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">OID,</span>
				</font>
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">不能因为某个促销员长得漂亮产品颜色就艳丽一些</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">.<o:p></o:p></span>
				</font>
		</p>
		<p class="MsoNormal">
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">所以产品颜色和产品重量就部分依赖于候选主键促销员</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">OID</span>
				</font>
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">和产品</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">OID,</span>
				</font>
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">这样就满足第二范式</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">.<o:p></o:p></span>
				</font>
		</p>
		<p class="MsoNormal">
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">
								<o:p> </o:p>
						</span>
				</font>
		</p>
		<p class="MsoNormal">
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">
								<o:p> </o:p>
						</span>
				</font>
		</p>
		<p class="MsoNormal">
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">第三范式说通俗一点就是不存在传递依赖</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">.</span>
				</font>
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">举例如下</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">:<o:p></o:p></span>
				</font>
		</p>
		<p class="MsoNormal">
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">促销员表</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">,</span>
				</font>
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">字段为促销员</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">OID,</span>
				</font>
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">所属销售部</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">OID,</span>
				</font>
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">销售部地址</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">.<o:p></o:p></span>
				</font>
		</p>
		<p class="MsoNormal">
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">那么促销员</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">OID</span>
				</font>
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">是业务主键</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">,</span>
				</font>
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">由于只有一个字段做主键</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">,</span>
				</font>
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">所以肯定不存在部分依赖</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoNormal">
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">但是这个存在传递依赖</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoNormal">
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">促销员</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">OID</span>
				</font>
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">决定了所属销售部</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">OID,</span>
				</font>
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">而所属销售部又能决定销售部地址</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">.<o:p></o:p></span>
				</font>
		</p>
		<p class="MsoNormal">
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">所以销售部地址间接依赖于销售部</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">OID<o:p></o:p></span>
				</font>
		</p>
		<p class="MsoNormal">
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">于是存在传递依赖</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">.<o:p></o:p></span>
				</font>
		</p>
		<p class="MsoNormal">
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">
								<o:p> </o:p>
						</span>
				</font>
		</p>
		<p class="MsoNormal">
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">
								<o:p> </o:p>
						</span>
				</font>
		</p>
		<p class="MsoNormal">
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">由于我们采用</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">OID</span>
				</font>
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">一个字段做表的主键</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">,</span>
				</font>
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">所以肯定满足第二范式</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">.</span>
				</font>
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">至于满不满足第三范式就要分析一下了</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">.<o:p></o:p></span>
				</font>
		</p>
		<p class="MsoNormal">
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">但是有些情况下是需要保存历史信息的</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoNormal">
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">比如销售部的地址变动了</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoNormal">
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">这些另当别论</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">,</span>
				</font>
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">打破第三范式就好了</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoNormal">
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">另外联合查询的性能损失很大</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">,</span>
				</font>
				<font face="宋体" color="navy" size="1">
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 宋体">有时候破坏范式来换取报表的运行效率也是值得的</span>
				</font>
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">.<o:p></o:p></span>
				</font>
		</p>
		<p class="MsoNormal">
				<font face="Arial" color="navy" size="1">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">
								<o:p>
								</o:p>
						</span>
				</font> </p>
<img src ="http://www.blogjava.net/zhyiwww/aggbug/52456.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2006-06-13 13:54 <a href="http://www.blogjava.net/zhyiwww/archive/2006/06/13/52456.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库设计范式(转载)</title><link>http://www.blogjava.net/zhyiwww/archive/2006/06/13/52455.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Tue, 13 Jun 2006 05:52:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2006/06/13/52455.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/52455.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2006/06/13/52455.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/52455.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/52455.html</trackback:ping><description><![CDATA[
		<div id="banner">
				<h1>
						<span style="FONT-SIZE: 12px">关系数据库设计之时是要遵守一定的规则的。尤其是数据库设计范式 现简单介绍1NF（第一范式），2NF（第二范式），3NF（第三范式）和BCNF，另有第四范式和第五范式留到以后再介绍。 在你设计数据库之时，若能符合这几个范式，你就是数据库设计的高手</span>
						<br />
						<span style="FONT-SIZE: 12px">关系数据库设计之时是要遵守一定的规则的。尤其是数据库设计范式 现简单介绍1NF（第一范式），2NF（第二范式），3NF（第三范式）和BCNF，另有第四范式和第五范式留到以后再介绍。 在你设计数据库之时，若能符合这几个范式，你就是数据库设计的高手。 <br /><br />第一范式（1NF）：在关系模式R中的每一个具体关系r中，如果每个属性值 都是不可再分的最小数据单位，则称R是第一范式的关系。例：如职工号，姓名，电话号码组成一个表（一个人可能有一个办公室电话 和一个家里电话号码） 规范成为1NF有三种方法： <br />一是重复存储职工号和姓名。这样，关键字只能是电话号码。 <br />二是职工号为关键字，电话号码分为单位电话和住宅电话两个属性 <br />三是职工号为关键字，但强制每条记录只能有一个电话号码。 <br />以上三个方法，第一种方法最不可取，按实际情况选取后两种情况。 <br /><br />第二范式（2NF）：如果关系模式R（U，F）中的所有非主属性都完全依赖于任意一个候选关键字，则称关系R 是属于第二范式的。 <br />例：选课关系 SCI（SNO，CNO，GRADE，CREDIT）其中SNO为学号， CNO为课程号，GRADEGE 为成绩，CREDIT 为学分。 由以上条件，关键字为组合关键字（SNO，CNO） <br />在应用中使用以上关系模式有以下问题： <br />a.数据冗余，假设同一门课由40个学生选修，学分就 重复40次。 <br />b.更新异常，若调整了某课程的学分，相应的元组CREDIT值都要更新，有可能会出现同一门课学分不同。 <br />c.插入异常，如计划开新课，由于没人选修，没有学号关键字，只能等有人选修才能把课程和学分存入。 <br />d.删除异常，若学生已经结业，从当前数据库删除选修记录。某些门课程新生尚未选修，则此门课程及学分记录无法保存。 <br />原因：非关键字属性CREDIT仅函数依赖于CNO，也就是CREDIT部分依赖组合关键字（SNO，CNO）而不是完全依赖。 <br />解决方法：分成两个关系模式 SC1（SNO，CNO，GRADE），C2（CNO，CREDIT）。新关系包括两个关系模式，它们之间通过SC1中的外关键字CNO相联系，需要时再进行自然联接，恢复了原来的关系 <br /><br />第三范式（3NF）：如果关系模式R（U，F）中的所有非主属性对任何候选关键字都不存在传递信赖，则称关系R是属于第三范式的。 <br />例：如S1（SNO，SNAME，DNO，DNAME，LOCATION） 各属性分别代表学号， <br />姓名，所在系，系名称，系地址。 <br />关键字SNO决定各个属性。由于是单个关键字，没有部分依赖的问题，肯定是2NF。但这关系肯定有大量的冗余，有关学生所在的几个属性DNO，DNAME，LOCATION将重复存储，插入，删除和修改时也将产生类似以上例的情况。 <br />原因：关系中存在传递依赖造成的。即SNO -&gt; DNO。 而DNO -&gt; SNO却不存在，DNO -&gt; LOCATION, 因此关键辽 SNO 对 LOCATION 函数决定是通过传递依赖 SNO -&gt; LOCATION 实现的。也就是说，SNO不直接决定非主属性LOCATION。 <br />解决目地：每个关系模式中不能留有传递依赖。 <br />解决方法：分为两个关系 S（SNO，SNAME，DNO），D（DNO，DNAME，LOCATION） <br />注意：关系S中不能没有外关键字DNO。否则两个关系之间失去联系。<br /><br />BCNF：如果关系模式R（U，F）的所有属性（包括主属性和非主属性）都不传递依赖于R的任何候选关键字，那么称关系R是属于BCNF的。或是关系模式R，如果每个决定因素都包含关键字（而不是被关键字所包含），则RCNF的关系模式。 <br />例：配件管理关系模式 WPE（WNO，PNO，ENO，QNT）分别表仓库号，配件号，职工号，数量。有以下条件 <br />a.一个仓库有多个职工。 <br />b.一个职工仅在一个仓库工作。 <br />c.每个仓库里一种型号的配件由专人负责，但一个人可以管理几种配件。 <br />d.同一种型号的配件可以分放在几个仓库中。 <br />分析：由以上得 PNO 不能确定QNT，由组合属性（WNO，PNO）来决定，存在函数依赖（WNO，PNO） -&gt; ENO。由于每个仓库里的一种配件由专人负责，而一个人可以管理几种配件，所以有组合属性（WNO，PNO）才能确定负责人，有（WNO，PNO）-&gt; ENO。因为 一个职工仅在一个仓库工作，有ENO -&gt; WNO。由于每个仓库里的一种配件由专人负责，而一个职工仅在一个仓库工作，有 （ENO，PNO）-&gt; QNT。 <br />找一下候选关键字，因为（WNO，PNO） -&gt; QNT，（WNO，PNO）-&gt; ENO ，因此 （WNO，PNO）可以决定整个元组，是一个候选关键字。根据ENO-&gt;WNO，（ENO，PNO）-&gt;QNT，故（ENO，PNO）也能决定整个元组，为另一个候选关键字。属性ENO，WNO，PNO 均为主属性，只有一个非主属性QNT。它对任何一个候选关键字都是完全函数依赖的，并且是直接依赖，所以该关系模式是3NF。 <br />分析一下主属性。因为ENO-&gt;WNO，主属性ENO是WNO的决定因素，但是它本身不是关键字，只是组合关键字的一部分。这就造成主属性WNO对另外一个候选关键字（ENO，PNO）的部 分依赖，因为（ENO，PNO）-&gt; ENO但反过来不成立，而P-&gt;WNO，故（ENO，PNO）-&gt; WNO 也是传递依赖。 <br />虽然没有非主属性对候选关键辽的传递依赖，但存在主属性对候选关键字的传递依赖，同样也会带来麻烦。如一个新职工分配到仓库工作，但暂时处于实习阶段，没有独立负责对某些配件的管理任务。由于缺少关键字的一部分PNO而无法插入到该关系中去。又如某个人改成不管配件了去负责安全，则在删除配件的同时该职工也会被删除。 <br />解决办法：分成管理EP（ENO，PNO，QNT），关键字是（ENO，PNO）工作EW（ENO，WNO）其关键字是ENO <br />缺点：分解后函数依赖的保持性较差。如此例中，由于分解,函数依赖（WNO，PNO）-&gt; ENO 丢失了, 因而对原来的语义有所破坏。没有体现出每个仓库里一种部件由专人负责。有可能出现 一部件由两个人或两个以上的人来同时管理。因此，分解之后的关系模式降低了部分完整性约束。 <br /><br />一个关系分解成多个关系，要使得分解有意义，起码的要求是分解后不丢失原来的信息。这些信息不仅包括数据本身，而且包括由函数依赖所表示的数据之间的相互制约。进行分解的目标是达到更高一级的规范化程度，但是分解的同时必须考虑两个问题：无损联接性和保持函数依赖。有时往往不可能做到既有无损联接性，又完全保持函数依赖。需要根据需要进行权衡。 <br /><br />1NF直到BCNF的四种范式之间有如下关系： <br />BCNF包含了3NF包含2NF包含1NF <br /><br />小结： <br />目地：规范化目的是使结构更合理，消除存储异常，使数据冗余尽量小，便于插入、删除和更新 <br />原则：遵从概念单一化 "一事一地"原则，即一个关系模式描述一个实体或实体间的一种联系。规范的实质就是概念的单一化。 <br />方法：将关系模式投影分解成两个或两个以上的关系模式。 <br />要求：分解后的关系模式集合应当与原关系模式"等价"，即经过自然联接可以恢复原关系而不丢失信息，并保持属性间合理的联系。 <br /><br />注意：一个关系模式结这分解可以得到不同关系模式集合，也就是说分解方法不是唯一的。最小冗余的要求必须以分解后的数据库能够表达原来数据库所有信息为前提来实现。其根本目标是节省存储空间，避免数据不一致性，提高对关系的操作效率，同时满足应用需求。实际上，并不一定要求全部模式都达到BCNF不可。有时故意保留部分冗余可能更方便数据查询。尤其对于那些更新频度不高，查询频度极高的数据库系统更是如此。 <br /><br />在关系数据库中，除了函数依赖之外还有多值依赖，联接依赖的问题，从而提出了第四范式，第五范式等更高一级的规范化要求。在此，以后再谈。</span>
						<br />
				</h1>
		</div>
		<div id="content">
				<div class="blog">
						<div class="blogbody">
								<div class="posted">作者 <a href="http://blog.phpx.com/user/36">C1G</a> (<a href="http://blog.phpx.com/category/36/76">mysql数据库</a>) :: <a href="http://blog.phpx.com/post/36/247">Comment (0)</a></div>
						</div>
				</div>
		</div>
<img src ="http://www.blogjava.net/zhyiwww/aggbug/52455.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2006-06-13 13:52 <a href="http://www.blogjava.net/zhyiwww/archive/2006/06/13/52455.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库设计范式深入浅出(转载)</title><link>http://www.blogjava.net/zhyiwww/archive/2006/06/13/52384.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Tue, 13 Jun 2006 03:28:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2006/06/13/52384.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/52384.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2006/06/13/52384.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/52384.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/52384.html</trackback:ping><description><![CDATA[
		<p>
				<strong> </strong>关系数据库设计之时是要遵守一定的规则的。尤其是数据库设计范式现简单介绍1NF（第一范式），2NF（第二范式），3NF（第三范式）和BCNF，另有第四范式和第五范式留到以后再介绍。在你设计数据库之时，若能符合这几个范式，你就是数据库设计的高手。 </p>
		<p style="LINE-HEIGHT: 16.5pt">
				<strong>第一范式（</strong>
				<strong>1NF</strong>
				<strong>）：</strong>在关系模式R中的每一个具体关系r中，如果每个属性值都是不可再分的最小数据单位，则称R是第一范式的关系。例：如职工号，姓名，电话号码组成一个表（一个人可能有一个办公室电话和一个家里电话号码）规范成为1NF有三种方法： <br /><br />一是重复存储职工号和姓名。这样，关键字只能是电话号码。 <br /><br />二是职工号为关键字，电话号码分为单位电话和住宅电话两个属性 <br /><br />三是职工号为关键字，但强制每条记录只能有一个电话号码。 <br /><br />以上三个方法，第一种方法最