??xml version="1.0" encoding="utf-8" standalone="yes"?>97影视大全免费追剧大全在线观看 ,欧美日韩一区视频,欧美日韩中文精品http://www.aygfsteel.com/Sprite-bei/category/18208.html<font size="3"><br><font color="#ff6600">天行? 君子以自Z?lt;/font><br><br></font>zh-cnTue, 27 Feb 2007 12:18:57 GMTTue, 27 Feb 2007 12:18:57 GMT60数据库设计范?/title><link>http://www.aygfsteel.com/Sprite-bei/archive/2007/01/18/94631.html</link><dc:creator>zht</dc:creator><author>zht</author><pubDate>Thu, 18 Jan 2007 06:28:00 GMT</pubDate><guid>http://www.aygfsteel.com/Sprite-bei/archive/2007/01/18/94631.html</guid><wfw:comment>http://www.aygfsteel.com/Sprite-bei/comments/94631.html</wfw:comment><comments>http://www.aygfsteel.com/Sprite-bei/archive/2007/01/18/94631.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/Sprite-bei/comments/commentRss/94631.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/Sprite-bei/services/trackbacks/94631.html</trackback:ping><description><![CDATA[ <p>引言<br /><br />  数据库的设计范式是数据库设计所需要满的规范Q满些规范的数据库是z的、结构明晰的Q同Ӟ不会发生插入QinsertQ、删除(deleteQ和更新QupdateQ操作异常。反之则是ؕ七八p,不仅l数据库的编Eh员制造麻烦,而且面目可憎Q可能存储了大量不需要的冗余信息?br /><br />  设计范式是不是很难懂呢?非也Q大学教材上l我们一堆数学公式我们当然看不懂Q也C住。所以我们很多h根本不按照范式来设计数据库?br /><br />  实质上,设计范式用很形象、很z的话语p说清楚,道明白。本文将对范式进行通俗地说明,q以W者曾l设计的一个简单论坛的数据库ؓ例来讲解怎样这些范式应用于实际工程?br /><br />  范式说明<br /><br />  W一范式Q?NFQ:数据库表中的字段都是单一属性的Q不可再分。这个单一属性由基本cd构成Q包括整型、实数、字W型、逻辑型、日期型{?br /><br />  例如Q如下的数据库表是符合第一范式的:<br /><br /></p> <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 />  而这L数据库表是不W合W一范式的:<br /><br /><table cellspacing="0" cellpadding="2" width="90%" align="center" border="1"><tbody><tr><td>字段1 </td><td>字段2 </td><td colspan="2">字段3 </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 />  很显Ӟ在当前的M关系数据库管理系l(DBMSQ中Q傻瓜也不可能做ZW合W一范式的数据库Q因些DBMS不允怽把数据库表的一列再分成二列或多列。因此,你想在现有的DBMS中设计出不符合第一范式的数据库都是不可能的?br /><br />  W二范式Q?NFQ:数据库表中不存在非关键字D对M候选关键字D늚部分函数依赖Q部分函C赖指的是存在l合关键字中的某些字D决定非关键字段的情况)Q也x有非关键字段都完全依赖于L一l候选关键字?</p><table cellspacing="0" cellpadding="0" align="left" border="0"><tbody><tr><td valign="top"> </td></tr><tr><td> </td></tr></tbody></table><br /><br />  假定选课关系表ؓSelectCourse(学号, 姓名, q龄, 评名称, 成W, 学分)Q关键字为组合关键字(学号, 评名称)Q因为存在如下决定关p:<br /><br />  (学号, 评名称) ?(姓名, q龄, 成W, 学分)<br /><br />  q个数据库表不满第二范式,因ؓ存在如下军_关系Q?br /><br />  (评名称) ?(学分)<br /><br />  (学号) ?(姓名, q龄)<br /><br />  卛_在组合关键字中的字段军_非关键字的情c?br /><br />  ׃不符?NFQ这个选课关系表会存在如下问题Q?br /><br />  (1) 数据冗余Q?br /><br />  同一门课E由n个学生选修Q?学分"重复n-1ơ;同一个学生选修了m门课E,姓名和年龄就重复了m-1ơ?br /><br />  (2) 更新异常Q?br /><br />  若调整了某门评的学分,数据表中所有行?学分"值都要更斎ͼ否则会出现同一门课E学分不同的情况?br /><br />  (3) 插入异常Q?br /><br />  假设要开设一门新的课E,暂时q没有h选修。这P׃q没?学号"关键字,评名称和学分也无法记录入数据库?br /><br />  (4) 删除异常Q?br /><br />  假设一批学生已l完成课E的选修Q这些选修记录应该从数据库表中删除。但是,与此同时Q课E名U和学分信息也被删除了。很昄Q这也会D插入异常?<br /><br />  把选课关系表SelectCourse改ؓ如下三个表:<br /><br />  学生QStudent(学号, 姓名, q龄)Q?br /><br />  评QCourse(评名称, 学分)Q?br /><br />  选课关系QSelectCourse(学号, 评名称, 成W)?br /><br />  q样的数据库表是W合W二范式的,消除了数据冗余、更新异常、插入异常和删除异常?br /><br />  另外Q所有单关键字的数据库表都符合第二范式,因ؓ不可能存在组合关键字?br /><br />  W三范式Q?NFQ:在第二范式的基础上,数据表中如果不存在非关键字段对Q一候选关键字D늚传递函C赖则W合W三范式。所谓传递函C赖,指的是如果存?A ?B ?C"的决定关p,则C传递函C赖于A。因此,满W三范式的数据库表应该不存在如下依赖关系Q?br /><br />  关键字段 ?非关键字Dx ?非关键字Dy<br /><br />  假定学生关系表ؓStudent(学号, 姓名, q龄, 所?a ><font color="#000000">学院</font></a>, <a ><u><font color="#004a9c">学院</font></u></a>地点, <a ><u><font color="#004a9c">学院</font></u></a>电话)Q关键字为单一关键?学号"Q因为存在如下决定关p:<br /><br />  (学号) ?(姓名, q龄, 所?a ><u><font color="#004a9c">学院</font></u></a>, <a ><u><font color="#004a9c">学院</font></u></a>地点, <a ><u><font color="#004a9c">学院</font></u></a>电话)<br /><br />  q个数据库是W合2NF的,但是不符?NFQ因为存在如下决定关p:<br /><br />  (学号) ?(所?a ><u><font color="#004a9c">学院</font></u></a>) ?(<a ><u><font color="#004a9c">学院</font></u></a>地点, <a ><u><font color="#004a9c">学院</font></u></a>电话)<br /><br />  卛_在非关键字段"<a ><u><font color="#004a9c">学院</font></u></a>地点"?<a ><u><font color="#004a9c">学院</font></u></a>电话"对关键字D?学号"的传递函C赖?br /><br />  它也会存在数据冗余、更新异常、插入异常和删除异常的情况,读者可自行分析得知?br /><br />  把学生关p表分ؓ如下两个表:<br /><br />  学生Q?学号, 姓名, q龄, 所?a ><u><font color="#004a9c">学院</font></u></a>)Q?br /><br />  <a ><u><font color="#004a9c">学院</font></u></a>Q?<a ><u><font color="#004a9c">学院</font></u></a>, 地点, 电话)?br /><br />  q样的数据库表是W合W三范式的,消除了数据冗余、更新异常、插入异常和删除异常?br /><br />  鲍依?U得范式QBCNFQ:在第三范式的基础上,数据库表中如果不存在M字段对Q一候选关键字D늚传递函C赖则W合W三范式? <p> 假设仓库理关系表ؓStorehouseManage(仓库ID, 存储物品ID, 理员ID, 数量)Q且有一个管理员只在一个仓库工作;一个仓库可以存储多U物品。这个数据库表中存在如下军_关系Q?br /><br />  (仓库ID, 存储物品ID) ?理员ID, 数量)<br /><br />  (理员ID, 存储物品ID) ?(仓库ID, 数量)<br /><br />  所以,(仓库ID, 存储物品ID)?理员ID, 存储物品ID)都是StorehouseManage的候选关键字Q表中的唯一非关键字Dؓ数量Q它是符合第三范式的。但是,׃存在如下军_关系Q?br /><br />  (仓库ID) ?(理员ID)<br /><br />  (理员ID) ?(仓库ID)<br /><br />  卛_在关键字D决定关键字D늚情况Q所以其不符合BCNF范式。它会出现如下异常情况:<br /><br />  (1) 删除异常Q?br /><br />  当仓库被清空后,所?存储物品ID"?数量"信息被删除的同时Q?仓库ID"?理员ID"信息也被删除了?br /><br />  (2) 插入异常Q?br /><br />  当仓库没有存储Q何物品时Q无法给仓库分配理员?br /><br />  (3) 更新异常Q?br /><br />  如果仓库换了理员,则表中所有行的管理员ID都要修改?br /><br />  把仓库管理关p表分解Z个关p表Q?br /><br />  仓库理QStorehouseManage(仓库ID, 理员ID)Q?br /><br />  仓库QStorehouse(仓库ID, 存储物品ID, 数量)?br /><br />  q样的数据库表是W合BCNF范式的,消除了删除异常、插入异常和更新异常?</p><p> </p><p>范式应用<br /><br />  我们来逐步搞定一个论坛的数据库,有如下信息:<br /><br />  Q?Q?用户Q用户名QemailQ主,电话Q联pd址<br /><br />  Q?Q?帖子Q发帖标题,发帖内容Q回复标题,回复内容 <br /><br />  W一ơ我们将数据库设计ؓ仅仅存在表:<br />   </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><br />  q个数据库表W合W一范式Q但是没有Q何一l候选关键字能决定数据库表的整行Q唯一的关键字D는户名也不能完全决定整个元l。我们需要增?发帖ID"?回复ID"字段Q即表修改为:<br /><br /><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><br />  q样数据表中的关键字(用户名,发帖IDQ回复ID)能决定整行:<br /><br />  (用户?发帖ID,回复ID) ?(email,主页,电话,联系地址,发帖标题,发帖内容,回复标题,回复内容)<br /><br />  但是Q这L设计不符合第二范式,因ؓ存在如下军_关系Q?br /><br />  (用户? ?(email,主页,电话,联系地址)<br /><br />  (发帖ID) ?(发帖标题,发帖内容)<br /><br />  (回复ID) ?(回复标题,回复内容)<br /><br />  即非关键字段部分函数依赖于候选关键字D,很明显,q个设计会导致大量的数据冗余和操作异常? <table cellspacing="0" cellpadding="0" align="left" border="0"><tbody><tr><td valign="top"> </td></tr><tr><td> </td></tr></tbody></table><br /><br />  我们数据库表分解ؓQ带下划U的为关键字Q:<br /><br />  Q?Q?用户信息Q用户名QemailQ主,电话Q联pd址<br /><br />  Q?Q?帖子信息Q发帖IDQ标题,内容<br /><br />  Q?Q?回复信息Q回复IDQ标题,内容<br /><br />  Q?Q?发脓Q用户名Q发帖ID<br /><br />  Q?Q?回复Q发帖IDQ回复ID<br /><br />  q样的设计是满W???范式和BCNF范式要求的,但是q样的设计是不是最好的呢?<br /><br />  不一定?br /><br />  观察可知Q第4?发帖"中的"用户??发帖ID"之间?QN的关p,因此我们可以?发帖"合ƈ到第2的"帖子信息"中;W??回复"中的"发帖ID"?回复ID"之间也是1QN的关p,因此我们可以?回复"合ƈ到第3的"回复信息"中。这样可以一定量地减数据冗余,新的设计为:<br /><br />  Q?Q?用户信息Q用户名QemailQ主,电话Q联pd址<br /><br />  Q?Q?帖子信息Q用户名Q发帖IDQ标题,内容<br /><br />  Q?Q?回复信息Q发帖IDQ回复IDQ标题,内容<br /><br />  数据库表1昄满所有范式的要求Q?br /><br />  数据库表2中存在非关键字段"标题"?内容"对关键字D?发帖ID"的部分函C赖,即不满W二范式的要求,但是q一设计q不会导致数据冗余和操作异常Q?br /><br />  数据库表3中也存在非关键字D?标题"?内容"对关键字D?回复ID"的部分函C赖,也不满W二范式的要求,但是与数据库?怼Q这一设计也不会导致数据冗余和操作异常?br /><br />  由此可以看出Qƈ不一定要满范式的要求,对于1QN关系Q当1的一边合q到N的那边后QN的那边就不再满W二范式了,但是q种设计反而比较好Q?br /><br />  对于MQN的关p,不能M一ҎN一边合q到另一边去Q这样会D不符合范式要求,同时D操作异常和数据冗余?<br />对于1Q?的关p,我们可以左边的1或者右边的1合ƈ到另一边去Q设计导致不W合范式要求Q但是ƈ不会D操作异常和数据冗余?br /><br />  l论<br /><br />  满范式要求的数据库设计是结构清晰的Q同时可避免数据冗余和操作异常。这q意味着不符合范式要求的设计一定是错误的,在数据库表中存在1Q??QN关系q种较特D的情况下,合ƈD的不W合范式要求反而是合理的?br /><br />  在我们设计数据库的时候,一定要时刻考虑范式的要求?img src ="http://www.aygfsteel.com/Sprite-bei/aggbug/94631.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/Sprite-bei/" target="_blank">zht</a> 2007-01-18 14:28 <a href="http://www.aygfsteel.com/Sprite-bei/archive/2007/01/18/94631.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库连接大?/title><link>http://www.aygfsteel.com/Sprite-bei/archive/2006/12/08/86247.html</link><dc:creator>zht</dc:creator><author>zht</author><pubDate>Fri, 08 Dec 2006 02:09:00 GMT</pubDate><guid>http://www.aygfsteel.com/Sprite-bei/archive/2006/12/08/86247.html</guid><wfw:comment>http://www.aygfsteel.com/Sprite-bei/comments/86247.html</wfw:comment><comments>http://www.aygfsteel.com/Sprite-bei/archive/2006/12/08/86247.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/Sprite-bei/comments/commentRss/86247.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/Sprite-bei/services/trackbacks/86247.html</trackback:ping><description><![CDATA[数据库连接大? 下面|列了各U数据库使用JDBCq接的方式,可以作ؓ一个手册用? <br />1、Oracle8/8i/9i数据库(thin模式Q? Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url="jdbc:oracle:thin:@localhost:1521:orcl"; //orcl为数据库的SID String user="test"; String password="test"; Connection conn= DriverManager.getConnection(url,user,password); <br /><br />2、DB2数据? Class.forName("com.ibm.db2.jdbc.app.DB2Driver ").newInstance(); String url="jdbc:db2://localhost:5000/sample"; //sampleZ的数据库? String user="admin"; String password=""; Connection conn= DriverManager.getConnection(url,user,password);<br /><br />3、Sql Server7.0/2000数据? Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb"; //mydb为数据库 String user="sa"; String password=""; Connection conn= DriverManager.getConnection(url,user,password); <br /><br />4、Sybase数据? Class.forName("com.sybase.jdbc.SybDriver").newInstance(); String url =" jdbc:sybase:Tds:localhost:5007/myDB";//myDBZ的数据库? Properties sysProps = System.getProperties(); SysProps.put("user","userid"); SysProps.put("password","user_password"); Connection conn= DriverManager.getConnection(url, SysProps); <br /><br />5、Informix数据? Class.forName("com.informix.jdbc.IfxDriver").newInstance(); String url = "jdbc:informix-sqli://123.45.67.89:1533/myDB:INFORMIXSERVER=myserver; user=testuser;password=testpassword"; //myDB为数据库? Connection conn= DriverManager.getConnection(url); <br /><br />6、MySQL数据? Class.forName("org.gjt.mm.mysql.Driver").newInstance(); String url ="jdbc:mysql://localhost/myDB?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1" //myDB为数据库? Connection conn= DriverManager.getConnection(url); <br /><br />7、PostgreSQL数据? Class.forName("org.postgresql.Driver").newInstance(); String url ="jdbc:postgresql://localhost/myDB" //myDB为数据库? String user="myuser"; String password="mypassword"; Connection conn= DriverManager.getConnection(url,user,password); <br /><br />8、access数据库直q用ODBC? Class.forName("sun.jdbc.odbc.JdbcOdbcDriver") ; String url="jdbc:odbc:Driver={MicroSoft Access Driver (*.mdb)};DBQ="+application.getRealPath("/Data/ReportDemo.mdb"); Connection conn = DriverManager.getConnection(url,"",""); Statement stmtNew=conn.createStatement() ; <br />转脓<br /><img src ="http://www.aygfsteel.com/Sprite-bei/aggbug/86247.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/Sprite-bei/" target="_blank">zht</a> 2006-12-08 10:09 <a href="http://www.aygfsteel.com/Sprite-bei/archive/2006/12/08/86247.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">˳</a>| <a href="http://" target="_blank">¡</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ʷ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɳ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ܿ</a>| <a href="http://" target="_blank">ͭ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ӫ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ϻ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ԫ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">̩</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ˮ</a>| <a href="http://" target="_blank">̳</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɫ</a>| <a href="http://" target="_blank">Ͽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>