﻿<?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-siyn-随笔分类-database</title><link>http://www.blogjava.net/siyn/category/31223.html</link><description>&lt;a href="http://www.siyn.org"&gt;http://www.siyn.org&lt;/a&gt;</description><language>zh-cn</language><lastBuildDate>Sat, 10 May 2008 05:48:26 GMT</lastBuildDate><pubDate>Sat, 10 May 2008 05:48:26 GMT</pubDate><ttl>60</ttl><item><title>Oracle 数据类型</title><link>http://www.blogjava.net/siyn/archive/2008/05/09/199561.html</link><dc:creator>siyn</dc:creator><author>siyn</author><pubDate>Fri, 09 May 2008 09:11:00 GMT</pubDate><guid>http://www.blogjava.net/siyn/archive/2008/05/09/199561.html</guid><wfw:comment>http://www.blogjava.net/siyn/comments/199561.html</wfw:comment><comments>http://www.blogjava.net/siyn/archive/2008/05/09/199561.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/siyn/comments/commentRss/199561.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/siyn/services/trackbacks/199561.html</trackback:ping><description><![CDATA[<font size="2"><font color="#ff0033"><a href="http://www.blogjava.net/siyn/archive/2008/05/05/198330.html"><font size="2"><font color="#ff0033">返回数据库总结目录</font></font></a><br />
</font></font><br />
<table border="1" cellspacing="0" bordercolor="gray" bordercolorlight="#000000" bordercolordark="#ffffff" cellpadding="2" width="98%" bgcolor="#ffffff" align="center">
    <tbody>
        <tr align="center" bgcolor="#efffe0">
            <td width="80">数据类型</td>
            <td width="100">参数</td>
            <td width="*">描述</td>
        </tr>
        <tr>
            <td>char(n)</td>
            <td>n=1 to 2000字节</td>
            <td>定长字符串，n字节长，如果不指定长度，缺省为1个字节长（一个汉字为2字节）</td>
        </tr>
        <tr>
            <td>varchar2(n)</td>
            <td>n=1 to 4000字节</td>
            <td>可变长的字符串，具体定义时指明最大长度n，<br />
            这种数据类型可以放数字、字母以及ASCII码字符集(或者EBCDIC等数据库系统接受的字符集标准)中的所有符号。<br />
            如果数据长度没有达到最大值n，Oracle 8i会根据数据大小自动调节字段长度，<br />
            如果你的数据前后有空格，Oracle 8i会自动将其删去。VARCHAR2是最常用的数据类型。<br />
            可做索引的最大长度3209。</td>
        </tr>
        <tr>
            <td>number(m,n)</td>
            <td>m=1 to 38<br />
            n=-84 to 127</td>
            <td>可变长的数值列，允许0、正值及负值，m是所有有效数字的位数，n是小数点以后的位数。<br />
            如：number(5,2)，则这个字段的最大值是99,999，如果数值超出了位数限制就会被截取多余的位数。<br />
            如：number(5,2)，但在一行数据中的这个字段输入575.316，则真正保存到字段中的数值是575.32。<br />
            如：number(3,0)，输入575.316，真正保存的数据是575。 </td>
            <tr>
                <td>date</td>
                <td>无</td>
                <td>从公元前4712年1月1日到公元4712年12月31日的所有合法日期，<br />
                Oracle 8i其实在内部是按7个字节来保存日期数据，在定义中还包括小时、分、秒。<br />
                缺省格式为DD-MON-YY，如07-11月-00 表示2000年11月7日。 </td>
            </tr>
            <tr>
                <td>long</td>
                <td>无</td>
                <td>可变长字符列，最大长度限制是2GB，用于不需要作字符串搜索的长串数据，如果要进行字符搜索就要用varchar2类型。<br />
                long是一种较老的数据类型，将来会逐渐被BLOB、CLOB、NCLOB等大的对象数据类型所取代。 </td>
            </tr>
            <tr>
                <td>raw(n)</td>
                <td>n=1 to 2000</td>
                <td>可变长二进制数据，在具体定义字段的时候必须指明最大长度n，Oracle 8i用这种格式来保存较小的图形文件或带格式的文本文件，如Miceosoft Word文档。<br />
                raw是一种较老的数据类型，将来会逐渐被BLOB、CLOB、NCLOB等大的对象数据类型所取代。 </td>
            </tr>
            <tr>
                <td>long raw</td>
                <td>无</td>
                <td>可变长二进制数据，最大长度是2GB。Oracle 8i用这种格式来保存较大的图形文件或带格式的文本文件，如Miceosoft Word文档，以及音频、视频等非文本文件。<br />
                在同一张表中不能同时有long类型和long raw类型，long raw也是一种较老的数据类型，将来会逐渐被BLOB、CLOB、NCLOB等大的对象数据类型所取代。 </td>
            </tr>
            <tr>
                <td>blob<br />
                clob<br />
                nclob</td>
                <td>无</td>
                <td>三种大型对象(LOB)，用来保存较大的图形文件或带格式的文本文件，如Miceosoft Word文档，以及音频、视频等非文本文件，最大长度是4GB。<br />
                LOB有几种类型，取决于你使用的字节的类型，Oracle 8i实实在在地将这些数据存储在数据库内部保存。<br />
                可以执行读取、存储、写入等特殊操作。 </td>
            </tr>
            <tr>
                <td>bfile</td>
                <td>无</td>
                <td>在数据库外部保存的大型二进制对象文件，最大长度是4GB。<br />
                这种外部的LOB类型，通过数据库记录变化情况，但是数据的具体保存是在数据库外部进行的。<br />
                Oracle 8i可以读取、查询BFILE，但是不能写入。<br />
                大小由操作系统决定。 </td>
            </tr>
        </tbody>
    </table>
    <br />
    <div style="font-size: 14px; line-height: 25px"><strong>作者Blog：</strong><a id="ArticleContent1_ArticleContent1_AuthorBlogLink" href="http://blog.csdn.net/tjandy/" target="_blank">http://blog.csdn.net/tjandy/</a></div>
<img src ="http://www.blogjava.net/siyn/aggbug/199561.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/siyn/" target="_blank">siyn</a> 2008-05-09 17:11 <a href="http://www.blogjava.net/siyn/archive/2008/05/09/199561.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL 数据类型</title><link>http://www.blogjava.net/siyn/archive/2008/05/09/199555.html</link><dc:creator>siyn</dc:creator><author>siyn</author><pubDate>Fri, 09 May 2008 09:04:00 GMT</pubDate><guid>http://www.blogjava.net/siyn/archive/2008/05/09/199555.html</guid><wfw:comment>http://www.blogjava.net/siyn/comments/199555.html</wfw:comment><comments>http://www.blogjava.net/siyn/archive/2008/05/09/199555.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/siyn/comments/commentRss/199555.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/siyn/services/trackbacks/199555.html</trackback:ping><description><![CDATA[<p align="left"><font size="2"><font color="#ff0033"><a href="http://www.blogjava.net/siyn/archive/2008/05/05/198330.html"><font size="2"><font color="#ff0033">返回数据库总结目录</font></font></a></font></font><br />
<strong>表A&nbsp;&nbsp;&nbsp; MySQL 数据类型</strong></p>
<table border="0" cellspacing="1" cellpadding="1" bgcolor="#666666">
    <tbody>
        <tr bgcolor="#ffffff">
            <td valign="top" width="18%">
            <p class="style2" align="center">数据类型</p>
            </td>
            <td valign="top" width="25%">
            <p class="style2" align="center">描述</p>
            </td>
            <td valign="top" width="13%">
            <p class="style2" align="center">字节</p>
            </td>
            <td valign="top" width="42%">
            <p class="style2" align="center">推荐使用</p>
            </td>
        </tr>
        <tr bgcolor="#ffffff">
            <td valign="top" width="18%">
            <p class="style3" align="left">SMALLINT</p>
            </td>
            <td valign="top" width="25%">
            <p class="style3" align="left">整数，从-32000到 +32000范围</p>
            </td>
            <td valign="top" width="13%">
            <p class="style3" align="left">2</p>
            </td>
            <td valign="top" width="42%">
            <p class="style3" align="left">存储相对比较小的整数。</p>
            <p class="style3" align="left">比如: 年纪，数量</p>
            </td>
        </tr>
        <tr bgcolor="#ffffff">
            <td valign="top" width="18%">
            <p class="style3" align="left">INT</p>
            </td>
            <td valign="top" width="25%">
            <p class="style3" align="left">整数，从-2000000000 到 +2000000000 范围</p>
            </td>
            <td valign="top" width="13%">
            <p class="style3" align="left">4</p>
            </td>
            <td valign="top" width="42%">
            <p class="style3" align="left">存储中等整数</p>
            <p class="style3" align="left">例如: 距离</p>
            </td>
        </tr>
        <tr bgcolor="#ffffff">
            <td valign="top" width="18%">
            <p class="style3" align="left">BIGINT</p>
            </td>
            <td valign="top" width="25%">
            <p class="style3" align="left">不能用SMALLINT 或 INT描述的超大整数。</p>
            </td>
            <td valign="top" width="13%">
            <p class="style3" align="left">8</p>
            </td>
            <td valign="top" width="42%">
            <p class="style3" align="left">存储超大的整数</p>
            <p class="style3" align="left">例如: 科学/数学数据</p>
            </td>
        </tr>
        <tr bgcolor="#ffffff">
            <td valign="top" width="18%">
            <p class="style3" align="left">FLOAT</p>
            </td>
            <td valign="top" width="25%">
            <p class="style3" align="left">单精度浮点型数据</p>
            </td>
            <td valign="top" width="13%">
            <p class="style3" align="left">4</p>
            </td>
            <td valign="top" width="42%">
            <p class="style3" align="left">存储小数数据</p>
            <p class="style3" align="left">例如:测量，温度</p>
            </td>
        </tr>
        <tr bgcolor="#ffffff">
            <td valign="top" width="18%">
            <p class="style3" align="left">DOUBLE</p>
            </td>
            <td valign="top" width="25%">
            <p class="style3" align="left">双精度浮点型数据</p>
            </td>
            <td valign="top" width="13%">
            <p class="style3" align="left">8</p>
            </td>
            <td valign="top" width="42%">
            <p class="style3" align="left">需要双精度存储的小数数据</p>
            <p class="style3" align="left">例如:科学数据</p>
            </td>
        </tr>
        <tr bgcolor="#ffffff">
            <td valign="top" width="18%">
            <p class="style3" align="left">DECIMAL</p>
            </td>
            <td valign="top" width="25%">
            <p class="style3" align="left">用户自定义精度的浮点型数据</p>
            </td>
            <td valign="top" width="13%">
            <p class="style3" align="left">变量;取决于精度与长度</p>
            </td>
            <td valign="top" width="42%">
            <p class="style3" align="left">以特别高的精度存储小数数据。</p>
            <p class="style3" align="left">例如:货币数额，科学数据</p>
            </td>
        </tr>
        <tr bgcolor="#ffffff">
            <td valign="top" width="18%">
            <p class="style3" align="left">CHAR</p>
            </td>
            <td valign="top" width="25%">
            <p class="style3" align="left">固定长度的字符串</p>
            </td>
            <td valign="top" width="13%">
            <p class="style3" align="left">特定字符串长度(高达255字符)</p>
            </td>
            <td valign="top" width="42%">
            <p class="style3" align="left">存储通常包含预定义字符串的变量</p>
            <p class="style3" align="left">例如: 定期航线，国家或邮编</p>
            </td>
        </tr>
        <tr bgcolor="#ffffff">
            <td valign="top" width="18%">
            <p class="style3" align="left">VARCHAR</p>
            </td>
            <td valign="top" width="25%">
            <p class="style3" align="left">具有最大限制的可变长度的字符串</p>
            </td>
            <td valign="top" width="13%">
            <p class="style3" align="left">变量; 1 + 实际字符串长度 (高达 255 字符)</p>
            </td>
            <td valign="top" width="42%">
            <p class="style3" align="left">存储不同长度的字符串值(高达一个特定的最大限度).</p>
            <p class="style3" align="left">例如:名字，密码，短文标签</p>
            </td>
        </tr>
        <tr bgcolor="#ffffff">
            <td valign="top" width="18%">
            <p class="style3" align="left">TEXT</p>
            </td>
            <td valign="top" width="25%">
            <p class="style3" align="left">没有最大长度限制的可变长度的字符串</p>
            </td>
            <td valign="top" width="13%">
            <p class="style3" align="left">Variable; 2 +聽 actual string length</p>
            </td>
            <td valign="top" width="42%">
            <p class="style3" align="left">存储大型文本数据</p>
            <p class="style3" align="left">例如: 新闻故事，产品描述</p>
            </td>
        </tr>
        <tr bgcolor="#ffffff">
            <td valign="top" width="18%">
            <p class="style3" align="left">BLOB</p>
            </td>
            <td valign="top" width="25%">
            <p class="style3" align="left">二进制字符串</p>
            </td>
            <td valign="top" width="13%">
            <p class="style3" align="left">变量；2 + 实际字符串长度</p>
            </td>
            <td valign="top" width="42%">
            <p class="style3" align="left">存储二进制数据</p>
            <p class="style3" align="left">例如:图片，附件，二进制文档</p>
            </td>
        </tr>
        <tr bgcolor="#ffffff">
            <td valign="top" width="18%">
            <p class="style3" align="left">DATE</p>
            </td>
            <td valign="top" width="25%">
            <p class="style3" align="left">以 yyyy-mm-dd格式的日期</p>
            </td>
            <td valign="top" width="13%">
            <p class="style3" align="left">3</p>
            </td>
            <td valign="top" width="42%">
            <p class="style3" align="left">存储日期</p>
            <p class="style3" align="left">例如:生日，产品满期</p>
            </td>
        </tr>
        <tr bgcolor="#ffffff">
            <td valign="top" width="18%">
            <p class="style3" align="left">TIME</p>
            </td>
            <td valign="top" width="25%">
            <p class="style3" align="left">以 hh:mm:ss格式的时间</p>
            </td>
            <td valign="top" width="13%">
            <p class="style3" align="left">3</p>
            </td>
            <td valign="top" width="42%">
            <p class="style3" align="left">存储时间或时间间隔</p>
            <p class="style3" align="left">例如:报警声，两时间之间的间隔，任务开始/结束时间</p>
            </td>
        </tr>
        <tr bgcolor="#ffffff">
            <td valign="top" width="18%">
            <p class="style3" align="left">DATETIME</p>
            </td>
            <td valign="top" width="25%">
            <p class="style3" align="left">以yyyy-mm-ddhh:mm:ss格式结合日期和时间</p>
            </td>
            <td valign="top" width="13%">
            <p class="style3" align="left">8</p>
            </td>
            <td valign="top" width="42%">
            <p class="style3" align="left">存储包含日期和时间的数据</p>
            <p class="style3" align="left">例如:提醒的人，事件</p>
            </td>
        </tr>
        <tr bgcolor="#ffffff">
            <td valign="top" width="18%">
            <p class="style3" align="left">TIMESTAMP</p>
            </td>
            <td valign="top" width="25%">
            <p class="style3" align="left">以yyyy-mm-ddhh:mm:ss格式结合日期和时间</p>
            </td>
            <td valign="top" width="13%">
            <p class="style3" align="left">4</p>
            </td>
            <td valign="top" width="42%">
            <p class="style3" align="left">记录即时时间</p>
            <p class="style3" align="left">例如：事件提醒器，&#8220;最后进入&#8221;的时间标记</p>
            </td>
        </tr>
        <tr bgcolor="#ffffff">
            <td valign="top" width="18%">
            <p class="style3" align="left">YEAR</p>
            </td>
            <td valign="top" width="25%">
            <p class="style3" align="left">以 yyyy格式的年份</p>
            </td>
            <td valign="top" width="13%">
            <p class="style3" align="left">1</p>
            </td>
            <td valign="top" width="42%">
            <p class="style3" align="left">存储年份</p>
            <p class="style3" align="left">例如:毕业年，出生年</p>
            </td>
        </tr>
        <tr bgcolor="#ffffff">
            <td valign="top" width="18%">
            <p class="style3" align="left">ENUM</p>
            </td>
            <td valign="top" width="25%">
            <p class="style3" align="left">一组数据，用户可从中选择其中一个</p>
            </td>
            <td valign="top" width="13%">
            <p class="style3" align="left">1或 2个字节</p>
            </td>
            <td valign="top" width="42%">
            <p class="style3" align="left">存储字符属性，只能从中选择之一</p>
            <p class="style3" align="left">例如:布尔量选择，如性别</p>
            </td>
        </tr>
        <tr bgcolor="#ffffff">
            <td valign="top" width="18%">
            <p class="style3" align="left">SET</p>
            </td>
            <td valign="top" width="25%">
            <p class="style3" align="left">一组数据，用户可从中选择其中0，1或更多。</p>
            </td>
            <td valign="top" width="13%">
            <p class="style3" align="left">从1到8字节;取决于设置的大小</p>
            </td>
            <td valign="top" width="42%">
            <p class="style3" align="left">存储字符属性，可从中选择多个字符的联合。</p>
            <p class="style3" align="left">例如:多选项选择，比如业余爱好和兴趣。</p>
            </td>
        </tr>
    </tbody>
</table>
<p align="left">对于一个完整的列表和详细描述，可以查看<a href="http://dev.mysql.com/doc/">MySQL manual</a>。你也可以阅读文章<em><a href="http://dev.mysql.com/doc/mysql/en/choosing-types.html">Choosing the Right Type for a Column</a>。</em></p>
<img src ="http://www.blogjava.net/siyn/aggbug/199555.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/siyn/" target="_blank">siyn</a> 2008-05-09 17:04 <a href="http://www.blogjava.net/siyn/archive/2008/05/09/199555.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关系型数据库(范式)</title><link>http://www.blogjava.net/siyn/archive/2008/05/05/198437.html</link><dc:creator>siyn</dc:creator><author>siyn</author><pubDate>Mon, 05 May 2008 06:22:00 GMT</pubDate><guid>http://www.blogjava.net/siyn/archive/2008/05/05/198437.html</guid><wfw:comment>http://www.blogjava.net/siyn/comments/198437.html</wfw:comment><comments>http://www.blogjava.net/siyn/archive/2008/05/05/198437.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/siyn/comments/commentRss/198437.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/siyn/services/trackbacks/198437.html</trackback:ping><description><![CDATA[<font size="2"><font color="#ff0033"><a href="http://www.blogjava.net/siyn/archive/2008/05/05/198330.html"><font size="2"><font color="#ff0033">返回数据库总结目录</font></font></a><br />
<br />
关系数据库设计之时是要遵守一定的规则的。尤其是数据库范式 现简单介绍1NF（第一范式），2NF（第二范式），3NF（第三范式）和BCNF，另有第四范式和第五范式留到以后再介绍。 在你设计数据库之时，若能符合这几个范式，你就是数据库设计的高手。</font> </font>
<p>&nbsp;</p>
<p><strong>第一范式（1NF）：</strong>在关系模式R中的每一个具体关系r中，如果每个属性值 都是不可再分的最小数据单位，则称R是第一范式的关系。例：如职工号，姓名，电话号码组成一个表（一个人可能有一个办公室电话 和一个家里电话号码） 规范成为1NF有三种方法： <br />
一是重复存储职工号和姓名。这样，关键字只能是电话号码。 <br />
二是职工号为关键字，电话号码分为单位电话和住宅电话两个属性 <br />
三是职工号为关键字，但强制每条记录只能有一个电话号码。 <br />
以上三个方法，第一种方法最不可取，按实际情况选取后两种情况。 </p>
<p><strong>第二范式（2NF）：</strong>如果关系模式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相联系，需要时再进行自然联接，恢复了原来的关系 </p>
<p><strong>第三范式（3NF）：</strong>如果关系模式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。否则两个关系之间失去联系。</p>
<p>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 丢失了, 因而对原来的语义有所破坏。没有体现出每个仓库里一种部件由专人负责。有可能出现 一部件由两个人或两个以上的人来同时管理。因此，分解之后的关系模式降低了部分完整性约束。 </p>
<p>一个关系分解成多个关系，要使得分解有意义，起码的要求是分解后不丢失原来的信息。这些信息不仅包括数据本身，而且包括由函数依赖所表示的数据之间的相互制约。进行分解的目标是达到更高一级的规范化程度，但是分解的同时必须考虑两个问题：无损联接性和保持函数依赖。有时往往不可能做到既有无损联接性，又完全保持函数依赖。需要根据需要进行权衡。 </p>
<p>1NF直到BCNF的四种范式之间有如下关系： <br />
BCNF包含了3NF包含2NF包含1NF </p>
<p><strong>小结：</strong> <br />
目地：规范化目的是使结构更合理，消除存储异常，使数据冗余尽量小，便于插入、删除和更新 <br />
原则：遵从概念单一化 "一事一地"原则，即一个关系模式描述一个实体或实体间的一种联系。规范的实质就是概念的单一化。 <br />
方法：将关系模式投影分解成两个或两个以上的关系模式。 <br />
要求：分解后的关系模式集合应当与原关系模式"等价"，即经过自然联接可以恢复原关系而不丢失信息，并保持属性间合理的联系。 </p>
<p>注意：一个关系模式结这分解可以得到不同关系模式集合，也就是说分解方法不是唯一的。最小冗余的要求必须以分解后的数据库能够表达原来数据库所有信息为前提来实现。其根本目标是节省存储空间，避免数据不一致性，提高对关系的操作效率，同时满足应用需求。实际上，并不一定要求全部模式都达到BCNF不可。有时故意保留部分冗余可能更方便数据查询。尤其对于那些更新频度不高，查询频度极高的数据库系统更是如此。 </p>
<p>在关系数据库中，除了函数依赖之外还有多值依赖，联接依赖的问题，从而提出了第四范式，第五范式等更高一级的规范化要求。在此，以后再谈。 </p>
<p>各位朋友，你看过后有何感想，其实，任何一本数据库基础理论的书都会讲这些东西，考虑到很多网友是半途出家，来做数据库。特找一本书大抄特抄一把，各位有什么问题，也别问我了，自已去找一本关系数据库理论的书去看吧，说不定，对各位大有帮助。说是说以上是基础理论的东西，请大家想想，你在做数据库设计的时候有没有考虑过遵过以上几个范式呢，有没有在数据库设计做得不好之时，想一想，对比以上所讲，到底是违反了第几个范式呢？ <br />
我见过的数据库设计，很少有人做到很符合以上几个范式的，一般说来，第一范式大家都可以遵守，完全遵守第二第三范式的人很少了，遵守的人一定就是设计数据库的高手了，BCNF的范式出现机会较少，而且会破坏完整性，你可以在做设计之时不考虑它，当然在ORACLE中可通过触发器解决其缺点。以后我们共同做设计之时，也希望大家遵守以上几个范式。</p>
<img src ="http://www.blogjava.net/siyn/aggbug/198437.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/siyn/" target="_blank">siyn</a> 2008-05-05 14:22 <a href="http://www.blogjava.net/siyn/archive/2008/05/05/198437.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>什么是数据库?什么是数据库管理系统?</title><link>http://www.blogjava.net/siyn/archive/2008/05/05/198432.html</link><dc:creator>siyn</dc:creator><author>siyn</author><pubDate>Mon, 05 May 2008 06:01:00 GMT</pubDate><guid>http://www.blogjava.net/siyn/archive/2008/05/05/198432.html</guid><wfw:comment>http://www.blogjava.net/siyn/comments/198432.html</wfw:comment><comments>http://www.blogjava.net/siyn/archive/2008/05/05/198432.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/siyn/comments/commentRss/198432.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/siyn/services/trackbacks/198432.html</trackback:ping><description><![CDATA[<font size="2"><font color="#ff0033"><a href="http://www.blogjava.net/siyn/archive/2008/05/05/198330.html"><font size="2"><font color="#ff0033">返回数据库总结目录</font></font></a></font></font><br />
<br />
什么是数据库?<br />
数据库是存储在一起的相关数据的集合，这些数据是结构化的，无有害的或不必要的冗余，并为多种应用服务；数据的存储独立于使用它的程序；对数据库插入新数据，修改和检索原有数据均能按一种公用的和可控制的方式进行。当某个系统中存在结构上完全分开的若干个数据库时，则该系统包含一个&#8220;数据库集合&#8221;。<br />
&nbsp;<br />
什么是数据库管理系统?<br />
<p>数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件，是用于建立、使用和维护数据库，简称DBMS。它对数据库进行统一的管理和控制，以保证数据库的安全性和完整性。用户通过DBMS访问数据库中的数据，数据库管理员也通过DBMS进行数据库的维护工作。它提供多种功能，可使多个应用程序和用户用不同的方法在同时或不同时刻去建立，修改和询问数据库。</p>
<p>按功能划分，数据库管理系统大致可分为6个部分：</p>
<p>(1)模式翻译：提供数据定义语言(DDL)。用它书写的数据库模式被翻译为内部表示。数据库的逻辑结构、完整性约束和物理储存结构保存在内部的数据字典中。数据库的各种数据操作(如查找、修改、插入和删除等)和数据库的维护管理都是以数据库模式为依据的。</p>
<p>(2)应用程序的编译：把包含着访问数据库语句的应用程序，编译成在DBMS支持下可运行的目标程序。</p>
<p>(3)交互式查询：提供易使用的交互式查询语言，如SQL。DBMS负责执行查询命令，并将查询结果显示在屏幕上。</p>
<p>(4)数据的组织与存取：提供数据在外围储存设备上的物理组织与存取方法。</p>
<p>⑸事务运行管理：提供事务运行管理及运行日志，事务运行的安全性监控和数据完整性检查，事务的并发控制及系统恢复等功能。</p>
<p>(6)数据库的维护：为数据库管理员提供软件支持，包括数据安全控制、完整性保障、数据库备份、数据库重组以及性能监控等维护工具。</p>
<p>基于关系模型的数据库管理系统已日臻完善，并已作为商品化软件广泛应用于各行各业。它在各户服务器结构的分布式多用户环境中的应用，使数据库系统的应用进一步扩展。随着新型数据模型及数据管理的实现技术的推进，可以预期DBMS软件的性能还将更新和完善，应用领域也将进一步地拓宽。</p>
<img src ="http://www.blogjava.net/siyn/aggbug/198432.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/siyn/" target="_blank">siyn</a> 2008-05-05 14:01 <a href="http://www.blogjava.net/siyn/archive/2008/05/05/198432.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库总结</title><link>http://www.blogjava.net/siyn/archive/2008/05/05/198330.html</link><dc:creator>siyn</dc:creator><author>siyn</author><pubDate>Mon, 05 May 2008 02:16:00 GMT</pubDate><guid>http://www.blogjava.net/siyn/archive/2008/05/05/198330.html</guid><wfw:comment>http://www.blogjava.net/siyn/comments/198330.html</wfw:comment><comments>http://www.blogjava.net/siyn/archive/2008/05/05/198330.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/siyn/comments/commentRss/198330.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/siyn/services/trackbacks/198330.html</trackback:ping><description><![CDATA[<p>数据库总结<br />
<br />
一.数据库和数据库管理系统<br />
1.什么是数据库?什么是数据库管理系统?<br />
2.关系型数据库(范式)?<br />
3.关系型数据库管理系统<br />
3.1.Oracle<br />
3.2.MySQL<br />
3.3.MS SQL Server<br />
二.结构化查询语言(SQL)<br />
1.数据定义语言(DDL) 用于创建、修改、删除数据库的数据结构。<br />
1.1数据库<br />
①创建数据库<br />
②连接数据库<br />
③删除数据库<br />
1.2表<br />
①创建表(临时表,复制表)<br />
②删除表<br />
③修改表结构,默认值,自增长<br />
④约束与数据完整性(主键,外键,非空,唯一,检查)[添,删,改]<br />
1.3视图<br />
......<br />
1.4<br />
①索引<br />
②序列<br />
③触发器<br />
......<br />
附A 数据类型<br />
2.数据操作语言(DML) 于DDL不同的是，DML更关心的是存储在数据库中的数据，而不是数据库结构本身。<br />
2.1 添加数据<br />
①简单的单行插入<br />
②多行插入<br />
2.2更新数据<br />
①简单的更新数据<br />
②Oracle中添加关键字returning&nbsp;&nbsp;<br />
③Oracle中使用where current of 处理游标<br />
④MySQL中添加关键字limit<br />
2.3删除数据<br />
①一般的Delete删除数据<br />
②使用truncate删除数据<br />
2.4获取数据<br />
2.4.1 简单查询 select &lt;列A,列B&gt; form &lt;表名&gt;;<br />
2.4.2 表和列名注释及别名<br />
2.4.3 返回计算列(数学计算,字符串连接)<br />
2.4.4 排序 order by<br />
2.4.5 过滤<br />
① where ( 连接运算符[and,or],比较运算符[= ,&lt;&gt;......],模式匹配[like,...],集合[in,botween])<br />
② distinct使用<br />
③限定行数 (mysql[limit],oracle[rownum])<br />
④ 处理null值<br />
2.4.6 数据汇总(count , sum,avg,max,min...)<br />
2.4.7 数据分组 group by<br />
2.4.8 having使用(where先于聚合函数执行,不能where中使用聚合函数做判断,只能用having)<br />
2.4.9 使用解析函数(mysql不支持,oracle支持)<br />
2.4.10 组合查询<br />
......<br />
2.4.11 多表查询<br />
......<br />
<br />
2.5函数<br />
2.6存储过程<br />
2.7事务<br />
<br />
<br />
3数据控制语言(DCL) 代表SQL语句支持的另一种功能，控制对数据库的访问。<br />
</p>
<img src ="http://www.blogjava.net/siyn/aggbug/198330.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/siyn/" target="_blank">siyn</a> 2008-05-05 10:16 <a href="http://www.blogjava.net/siyn/archive/2008/05/05/198330.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>