📄 关系数据库中范式理论(转)_咖啡.htm
字号:
cmt.focus();
}
G("cancleReLink").style.display="none";
cmtForm.btn_ok.value="发表评论";
}
function gotoreply()
{//to checking whether reply cmt
if( window.location.hash.indexOf("&re=1")<0) return;
var cmtID=window.location.hash.split("&")[0].replace("#","");
var cmtlinks=document.getElementsByTagName("a");
for(var i=0,n=cmtlinks.length;i<n;i++)
{
if(cmtlinks[i].name==cmtID){ var rename=cmtlinks[i].getAttribute("rename"); repid=cmtlinks[i].getAttribute("repid"); break;}
}
if(typeof(rename)!="undefined"){
cmtreply(rename, repid);
}
}
//-->
</SCRIPT>
<SCRIPT type=text/javascript>
/*<![CDATA[*/
window.onerror=function(){return true;}
var RelatedDocData = null, GetAndEval = false;
(function(){
var xhr = BdAjax.getXHR();
if(xhr == null){
RelatedDocData = -1;
return;
}
xhr.open("GET", "/sys/search?type=8&word=%B9%D8%CF%B5%CA%FD%BE%DD%BF%E2%D6%D0%B7%B6%CA%BD%C0%ED%C2%DB%28%D7%AA%29&item=e2358da18e08508c47106431&t=" + new Date().getTime(), true);
xhr.onreadystatechange = function(){
if(xhr.readyState == 4){
if(xhr.status == 0 || xhr.status == 200){
if(GetAndEval){
eval(xhr.responseText);
}else{
RelatedDocData = xhr.responseText;
}
}
}
}
xhr.send(null);
})();
/*]]>*/
</SCRIPT>
<META content="MSHTML 6.00.2900.5512" name=GENERATOR></HEAD>
<BODY onload=formatonlinpic();>
<CENTER>
<SCRIPT type=text/javascript>/*<![CDATA[*/if(top.location != self.location){ top.location = self.location;}var myref = encodeURIComponent("http://hi.baidu.com/liukai1987/blog/item/e2358da18e08508c47106431%2Ehtml");/*]]>*/</SCRIPT>
<LINK href="关系数据库中范式理论(转)_咖啡.files/mods.css" type=text/css rel=stylesheet><LINK
href="关系数据库中范式理论(转)_咖啡.files/eef166da505391dbb6fd48aa.css" type=text/css
rel=stylesheet><LINK href="关系数据库中范式理论(转)_咖啡.files/space.css" type=text/css
rel=stylesheet>
<STYLE type=text/css>#usrbar {
PADDING-RIGHT: 10px; PADDING-LEFT: 0px; FONT-SIZE: 12px; BACKGROUND: #ffffff; FILTER: alpha(opacity=65); PADDING-BOTTOM: 3px; WIDTH: 100%; COLOR: #000000; LINE-HEIGHT: 19px; PADDING-TOP: 4px; FONT-FAMILY: Arial; LETTER-SPACING: normal; HEIGHT: 19px; TEXT-ALIGN: right; moz-opacity: 0.5
}
#usrbar A {
COLOR: #0000cc; TEXT-DECORATION: underline
}
#usrbar A:link {
COLOR: #0000cc; TEXT-DECORATION: underline
}
#usrbar A:visited {
COLOR: #0000cc; TEXT-DECORATION: underline
}
#ft {
CLEAR: both; FONT-SIZE: 12px; COLOR: #666666; LINE-HEIGHT: 20px; FONT-FAMILY: Arial; HEIGHT: 20px; TEXT-ALIGN: center
}
#ft A {
COLOR: #7777cc; TEXT-DECORATION: underline
}
#ft A:link {
COLOR: #7777cc; TEXT-DECORATION: underline
}
#ft A:visited {
COLOR: #7777cc; TEXT-DECORATION: underline
}
#usrbar {
LETTER-SPACING: normal
}
#usrbar A {
LETTER-SPACING: normal
}
#usrbar A:link {
LETTER-SPACING: normal
}
#usrbar A:visited {
LETTER-SPACING: normal
}
#ft {
LETTER-SPACING: normal
}
#ft A {
LETTER-SPACING: normal
}
#ft A:link {
LETTER-SPACING: normal
}
#ft A:visited {
LETTER-SPACING: normal
}
</STYLE>
<DIV id=usrbar><NOBR><A id=hi_index href="http://hi.baidu.com/"
target=_blank>百度空间</A> | <A href="http://www.baidu.com/"
target=_blank>百度首页</A>
<SCRIPT type=text/javascript> document.write('| <a href="https://passport.baidu.com/?login&tpl=sp&tpl_reg=sp&u=http://hi.baidu.com' + encodeURIComponent('/liukai1987/blog/item/e2358da18e08508c47106431%2Ehtml') + '">登录</a>'); </SCRIPT>
</NOBR></DIV>
<DIV id=newUserTip
style="Z-INDEX: 30000; RIGHT: 0px; FLOAT: right; WIDTH: 225px; POSITION: absolute; TOP: 26px; HEIGHT: 130px; TEXT-ALIGN: right"><A
id=newUserTipShadow
style="DISPLAY: block; FONT-SIZE: 14px; Z-INDEX: 30001; RIGHT: 14px; BACKGROUND: none transparent scroll repeat 0% 0%; OVERFLOW: hidden; WIDTH: 55px; COLOR: #4242f9! important; POSITION: absolute; TOP: 108px; HEIGHT: 14px; TEXT-DECORATION: none! important"
onclick=newUserRegLog()
href="http://passport.baidu.com/?reg&tpl=sp&return_method=get&skip_ok=1&u=http://hi.baidu.com/sys/reg/"
target=_blank> </A>
<EMBED id=newUserTipSwf style="WIDTH: 225px; HEIGHT: 130px"
src=http://hi.baidu.com/ui/flash/userReg/guide.swf
type=application/x-shockwave-flash wmode="transparent"
allowScriptAcess="always"> </DIV>
<SCRIPT language=javascript> <!-- function newUserTipShow(f) { if(f=="0"){//close G("newUserTipSwf").style.width="40px"; G("newUserTip").style.width="40px"; G("newUserTipShadow").style.display="none"; }else{//show G("newUserTip").style.width="225px"; G("newUserTipSwf").style.width="225px"; G("newUserTipShadow").style.display="block"; } } function newUserRegLog(){ var now=new Date(); now.setTime(now.getTime()+5*60*1000); document.cookie="BDSP_REGFLAG=1;expires="+now.toGMTString()+";path=/"; new Image().src="http://hi.baidu.com/sys/statlog/1.gif?m=blog_newer_pro2_click&v=/liukai1987&t="+Math.random(); } //--> </SCRIPT>
<SCRIPT type=text/javascript>function set_cookie_4_bdtip(index/* start from one */, value){ var bdtip = document.cookie.match(/(^| )BDTIP=([^;]*)(;|$)/); if(!bdtip){ bdtip=new Array(index); for(var i=0,n=bdtip.length;i<n;i++) { if(bdtip[i]=="" || bdtip[i]==null) bdtip[i]=0; if(i == index - 1){ bdtip[i] = value; } } }else{ bdtip = bdtip[2].split('-'); if(index > bdtip.length) bdtip.length= index; for(var i = 0, j = bdtip.length; i < j; i ++){ if(bdtip[i]=="" || bdtip[i]==null) bdtip[i]=0; if(i == index - 1){ bdtip[i] = value; } } } bdtip = bdtip.join('-'); document.cookie = "BDTIP=" + bdtip+ ";expires=Wed, 28-Nov-37 01:45:46 GMT;path=/;domain=.baidu.com";}</SCRIPT>
<DIV id=main align=left><!--[if IE]>
<SCRIPT>
var objmain = document.getElementById("main");
function updatesize(){ var bodyw = window.document.body.offsetWidth; if(bodyw <= 790) objmain.style.width="772px"; else if(bodyw >= 1016) objmain.style.width="996px"; else objmain.style.width="100%"; }
updatesize(); window.onresize = updatesize;
</SCRIPT>
<![endif]-->
<DIV id=header>
<DIV class=lc>
<DIV class=rc></DIV></DIV>
<DIV class=tit><A class=titlink
title="dadakai的空间 http://hi.baidu.com/liukai1987"
href="http://hi.baidu.com/liukai1987">咖啡</A></DIV>
<DIV class=desc>Dadakai.cn 闲着没事就拷贝点文章过来,如果有版权问题请与我联系:dadakai@126.com</DIV>
<DIV id=tabline></DIV>
<DIV id=tab><A href="http://hi.baidu.com/liukai1987">主页</A><A class=on
href="http://hi.baidu.com/liukai1987/blog">博客</A><A
href="http://hi.baidu.com/liukai1987/album">相册</A><SPAN>|</SPAN><A
href="http://hi.baidu.com/liukai1987/profile">个人档案</A> <SPAN>|</SPAN><A
href="http://hi.baidu.com/liukai1987/friends">好友</A> </DIV></DIV>
<DIV class=stage>
<DIV class=stagepad>
<DIV style="WIDTH: 100%">
<TABLE class=modth cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=modtl width=7> </TD>
<TD class=modtc noWrap>
<DIV class=modhead><SPAN class=modtit>查看文章</SPAN></DIV></TD>
<TD class=modtc noWrap align=right></TD>
<TD class=modtr width=7> </TD></TR></TBODY></TABLE>
<DIV class=modbox id=m_blog>
<DIV class=tit>关系数据库中范式理论(转)</DIV>
<DIV class=date>2008-11-14 11:20</DIV>
<TABLE style="TABLE-LAYOUT: fixed">
<TBODY>
<TR>
<TD>
<DIV class=cnt id=blog_text>
<P><BR>关系数据库中范式理论(转) <BR>第一范式:</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>
<P> 不满足第一范式的情况:<BR> 关系R(name,address,phone)<BR> ----------------------------------------------------------------------<BR> name
address phone <BR>AA 山西太原 2204446<BR> AA 山西太原
8350524<BR> ----------------------------------------------------------------------<BR>说明:phone可以再分(可以分为phone1和phone2).</P>
<P>*************************************************************************************</P>
<P>第二范式(2NF):</P>
<P>1):局部依赖:<BR> 对于依赖关系 W->A
(A依赖于W),如果存在X归属于W,且X->A(A依赖于X),那么称W->A是局部依赖;否则称W->A是完全依赖.<BR> 比如:<BR> 关系模式R(sno,cno,grade,tname,taddr)<BR> sno:学生学号;cno:课程编号;grade:成绩;tname:老师姓名;taddr:老师住址<BR> (sno,cno)->(tname,taddr)(sno,cno决定于tname以及cno)是局部依赖,因为cno->(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>
<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)
<BR> sno cno grade</P>
<P> 101 001 100<BR> 102 001 95<BR> 103 001 98<BR> 104 002 95<BR> 105
003 90 </P>
<P> R2(cno,tname,taddr)</P>
<P> cno tname taddr</P>
<P> 001 张老师 山西太原....<BR> 002 李老师 中国北京....<BR> 003 刘老师
中国上海....<BR> ----------------------------------------------------------------------
<BR>*************************************************************************************</P>
<P>第三范式(3NF):</P>
<P>1):传递依赖:如果X->Y,Y->A,且Y不依赖X和A不是Y的子集,那么称X->A是传递依赖.(A传递依赖于X)</P>
<P>2):三范式定义:<BR> 如果关系模式R是1NF,且每个非主属性都不依赖于R的侯选键,那么称R满足第三范式.</P>
<P>不满足第三范式的情况:<BR> 关系模式R2(cno,tname,taddr)是2NF模式,如果在R2中存在cno->tname,tname->taddr,那么cno->taddr就是个传递依赖,及不满足第三范式.<BR> ----------------------------------------------------------------------<BR> cno
tname taddr</P>
<P> 001 张老师 山西太原....<BR> 002 李老师 中国北京....<BR> 003 刘老师 中国上海....<BR> 004
张老师 山西太原....<BR> 005 张老师
山西太原....<BR> ----------------------------------------------------------------------<BR> 说明:张老师开设了3门课程,上面就出现了3个元组,教师地址重复了3次.<BR> 消除方法:分解关系模式R2<BR> ----------------------------------------------------------------------<BR> R3(cno,tname)
<BR> cno tname</P>
<P> 001 张老师<BR> 002 李老师<BR> 003 刘老师<BR> 004 张老师<BR> 005 张老师
<BR> R4(tname,taddr)</P>
<P> tname taddr</P>
<P> 张老师 山西太原....<BR> 李老师 中国北京....<BR> 刘老师
中国上海....<BR> ----------------------------------------------------------------------
<BR>再补充一下:</P>
<P>第四范式(4NF)</P>
<P>第四范式禁止主键列和非主键列一对多关系不受约束</P>
<P>第五范式(5NF)</P>
<P>第五范式将表分割成尽可能小的块,为了排除在表中所有的冗余.</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> 如果R∈BCNF,那么R∈3NF。
但是若R∈3NF,则R未必属于BCNF。<BR></P></DIV></TD></TR></TBODY></TABLE><BR>
<DIV class=opt><A title=查看该分类中所有文章
href="http://hi.baidu.com/liukai1987/blog/category/Êý¾Ý¿â">类别:数据库</A> | <A
title=将此文章添加到百度搜藏 onclick="return addToFavor();"
href="http://cang.baidu.com/do/add" target=_blank>添加到搜藏</A> | 浏览(<SPAN
id=result></SPAN>) | <A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -