<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>F1Soft</title>
    <description>&lt;span id=&quot;dict_daily&quot;&gt;
&lt;a href=&quot;http://dict.cn/&quot; target=&quot;_blank&quot;&gt;Dict.CN 在线词典, 英语学习, 在线翻译&lt;/a&gt;
&lt;/span&gt; 
&lt;script language=&quot;JavaScript&quot; src=&quot;http://dict.cn/daily.php&quot; defer=&quot;defer&quot;&gt;
&lt;/script&gt; 
</description>
    <link>http://javaf1.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>oracleorahome92agent 无法启动</title>
        <author>z71711591</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://javaf1.javaeye.com">z71711591</a>&nbsp;
          链接：<a href="http://javaf1.javaeye.com/blog/147482" style="color:red;">http://javaf1.javaeye.com/blog/147482</a>&nbsp;
          发表时间: 2007年12月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          修改计算机名称引起的 <br />1.删除 D:oracleora92 etworkagent下面的.q和.ora文件<br />2.在服务里面启动oracleorahome92agent 能启动就ok了
          <br/>
          <span style="color:red;">
            <a href="http://javaf1.javaeye.com/blog/147482#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 11 Dec 2007 10:34:34 +0800</pubDate>
        <link>http://javaf1.javaeye.com/blog/147482</link>
        <guid>http://javaf1.javaeye.com/blog/147482</guid>
      </item>
      <item>
        <title>URL中的特殊字符</title>
        <author>z71711591</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://javaf1.javaeye.com">z71711591</a>&nbsp;
          链接：<a href="http://javaf1.javaeye.com/blog/135173" style="color:red;">http://javaf1.javaeye.com/blog/135173</a>&nbsp;
          发表时间: 2007年10月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="tit"></div>
<table style="TABLE-LAYOUT: fixed">
    <tbody>
        <tr>
            <td>
            <div class="cnt">有些符号在URL中是不能直接传递的，如果要在URL中传递这些特殊符号，那么就要使用他们的编码了。编码的格式为：%加字符的ASCII码，即一个百分号%，后面跟对应字符的ASCII（16进制）码值。例如 空格的编码值是&quot;%20&quot;。<br />
            下表中列出了一些URL特殊符号及编码<br />
            <table cellspacing="0" border="1" width="80%">
                <tbody>
                    <tr>
                        <td>　</td>
                        <td>　</td>
                        <td>　</td>
                        <td>十六进制值</td>
                    </tr>
                    <tr>
                        <td>1.</td>
                        <td>+ </td>
                        <td>URL 中+号表示空格</td>
                        <td>%2B</td>
                    </tr>
                    <tr>
                        <td>2.</td>
                        <td>空格</td>
                        <td>URL中的空格可以用+号或者编码</td>
                        <td>%20</td>
                    </tr>
                    <tr>
                        <td>3.</td>
                        <td>/ </td>
                        <td>分隔目录和子目录</td>
                        <td>%2F </td>
                    </tr>
                    <tr>
                        <td>4.</td>
                        <td>? </td>
                        <td>分隔实际的 URL 和参数</td>
                        <td>%3F </td>
                    </tr>
                    <tr>
                        <td>5.</td>
                        <td>%</td>
                        <td>指定特殊字符</td>
                        <td>%25 </td>
                    </tr>
                    <tr>
                        <td>6.</td>
                        <td>#</td>
                        <td>表示书签</td>
                        <td>%23 </td>
                    </tr>
                    <tr>
                        <td>7.</td>
                        <td>&amp;</td>
                        <td>URL 中指定的参数间的分隔符</td>
                        <td>%26 </td>
                    </tr>
                    <tr>
                        <td>8.</td>
                        <td>=</td>
                        <td>URL 中指定参数的值</td>
                        <td>%3D</td>
                    </tr>
                </tbody>
            </table>
            <p>例：要传递字符串&ldquo;this%is#te=st&amp;o k?+/&rdquo;作为参数t传给te.jsp，则URL可以是:<br />
            te.jsp?t=this%25is%23te%3Dst%26o%20k%3F%2B%2F 或者<br />
            te.jsp?t=this%25is%23te%3Dst%26o+k%3F%2B%2F （空格可以用%20或+代替）</p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
          <br/>
          <span style="color:red;">
            <a href="http://javaf1.javaeye.com/blog/135173#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 24 Oct 2007 13:48:54 +0800</pubDate>
        <link>http://javaf1.javaeye.com/blog/135173</link>
        <guid>http://javaf1.javaeye.com/blog/135173</guid>
      </item>
      <item>
        <title>JavaScript Closures</title>
        <author>z71711591</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://javaf1.javaeye.com">z71711591</a>&nbsp;
          链接：<a href="http://javaf1.javaeye.com/blog/133334" style="color:red;">http://javaf1.javaeye.com/blog/133334</a>&nbsp;
          发表时间: 2007年10月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          JavaScript Closures 101- they're not magic
<p><em><strong>Credits:</strong> This tutorial is written by <a href="http://blog.morrisjohns.com/">Morris Johns</a>. Morris maintains a <a href="http://www.javascriptkit.com/javatutors/closures.shtml#" class="kLink" oncontextmenu="return false;" id="KonaLink1" onmouseover="adlinkMouseOver(event,this,1);" onclick="adlinkMouseClick(event,this,1);" target="_top" onmouseout="adlinkMouseOut(event,this,1);" style="POSITION: static; TEXT-DECORATION: underline! important"><font color="#0000ff" style="FONT-WEIGHT: 400; COLOR: blue! important; FONT-FAMILY: Verdana; POSITION: static"><span class="kLink" style="FONT-WEIGHT: 400; COLOR: blue! important; BORDER-BOTTOM: blue 1px solid; FONT-FAMILY: Verdana; POSITION: relative; BACKGROUND-COLOR: transparent">personal </span><span class="kLink" style="FONT-WEIGHT: 400; COLOR: blue! important; BORDER-BOTTOM: blue 1px solid; FONT-FAMILY: Verdana; POSITION: relative; BACKGROUND-COLOR: transparent">blog</span></font></a> called <a href="http://blog.morrisjohns.com/">Developing Thought</a>s where he can be contacted via.</em></p>
<p class="FirstLetterDropdown">This tutorial explains closures so that a regular <a href="http://www.javascriptkit.com/javatutors/closures.shtml#" class="kLink" oncontextmenu="return false;" id="KonaLink2" onmouseover="adlinkMouseOver(event,this,2);" onclick="adlinkMouseClick(event,this,2);" target="_top" onmouseout="adlinkMouseOut(event,this,2);" style="POSITION: static; TEXT-DECORATION: underline! important"><font color="#0000ff" style="FONT-WEIGHT: 400; COLOR: blue! important; FONT-FAMILY: Verdana; POSITION: static"><span class="kLink" style="FONT-WEIGHT: 400; COLOR: blue! important; BORDER-BOTTOM: blue 1px solid; FONT-FAMILY: Verdana; POSITION: relative; BACKGROUND-COLOR: transparent">programmer</span></font></a> can understand them - using working JavaScript code. It is not for gurus nor functional programmers.</p>
<p>Closures are <em>not hard</em> to understand once the core concept is grokked. However, they are impossible to understand by reading any academic papers or academically oriented information about them! </p>
<p>This article is intended for programmers with some programming experience in a main-stream language, and who can read the following JavaScript function:</p>
<div class="codeDiv" id="sayhello">function&nbsp;sayHello(name)&nbsp;{<br />
&nbsp;&nbsp;var&nbsp;text&nbsp;= 'Hello&nbsp;'&nbsp;+ name;<br />
&nbsp;&nbsp;var&nbsp;sayAlert&nbsp;= function()&nbsp;{ alert(text); }<br />
&nbsp;&nbsp;sayAlert();<br />
}<br />
<input class="codeButton" type="button" value="sayHello('Bob');" onclick="sayHello('Bob');" /> <script>
    function sayHello(name) {
        var text = 'Hello ' + name;
        var sayAlert = function() { alert(text); }
        sayAlert();
    }
    </script></div>
<h4 id="closure_example"><img src="http://www.javascriptkit.com/Red_CurlyC035.gif" border="0" height="17" alt="" width="16" /> An Example of a Closure</h4>
<p class="FirstLetterDropdown">Two one sentence summaries: </p>
<ul>
    <li>a closure is the local variables for a function - kept alive <em>after</em> the function has returned, or </li>
    <li>a closure is a stack-frame which is <em>not deallocated</em> when the <a href="http://www.javascriptkit.com/javatutors/closures.shtml#" class="kLink" oncontextmenu="return false;" id="KonaLink3" onmouseover="adlinkMouseOver(event,this,3);" onclick="adlinkMouseClick(event,this,3);" target="_top" onmouseout="adlinkMouseOut(event,this,3);" style="POSITION: static; TEXT-DECORATION: underline! important"><font color="#0000ff" style="FONT-WEIGHT: 400; COLOR: blue! important; FONT-FAMILY: Verdana; POSITION: static"><span class="kLink" style="FONT-WEIGHT: 400; COLOR: blue! important; BORDER-BOTTOM: blue 1px solid; FONT-FAMILY: Verdana; POSITION: relative; BACKGROUND-COLOR: transparent">function </span><span class="kLink" style="FONT-WEIGHT: 400; COLOR: blue! important; BORDER-BOTTOM: blue 1px solid; FONT-FAMILY: Verdana; POSITION: relative; BACKGROUND-COLOR: transparent">returns</span></font></a>. (as if a 'stack-frame' were malloc'ed instead of being on the stack!) </li>
</ul>
<p>The following code returns a reference to a function: </p>
<div class="codeDiv">function&nbsp;sayHello2(name)&nbsp;{<br />
&nbsp;&nbsp;var&nbsp;text&nbsp;= 'Hello&nbsp;'&nbsp;+ name; //&nbsp;local&nbsp;variable<br />
&nbsp;&nbsp;var&nbsp;sayAlert&nbsp;= function()&nbsp;{ alert(text); }<br />
&nbsp;&nbsp;return&nbsp;sayAlert;<br />
}<br />
<input class="codeButton" id="btn2" type="button" value="var say2 = sayHello2('Jane');say2();" onclick="var say2 = sayHello2('Jane');say2();window['say2x'] = say2;" /> <script>
    // Ignore this: it just sets the text for the button: Done this way so button has two lines of text.
    document.getElementById('btn2').value = "var say2 = sayHello2('Jane');\nsay2();" 
    </script><script>
    function sayHello2(name) {
        var text = 'Hello ' + name;
        var sayAlert = function() { alert(text); }
        return sayAlert;
    }
    </script></div>
<p>Most JavaScript programmers will understand how a reference to a function is returned to a variable in the above code. If you don't, then you need to before you can learn closures. A C programmer would think of the function as returning a pointer to a function, and that the variables sayAlert and say2 were each a pointer to a function. </p>
<p>There is a critical difference between a C pointer to a function, and a JavaScript reference to a function. In JavaScript, you can think of a function reference variable as having both a pointer to a function <em>as well as</em> a hidden pointer to a closure. </p>
<p>The above code has a closure because the anonymous function <span class="codeSpan">function()&nbsp;{&nbsp;alert(text);&nbsp;}</span> is declared <em>inside</em> another function, <span class="codeSpan">sayHello2()</span> in this example. In JavaScript, if you use the <span class="codeSpan">function</span> keyword <em>inside</em> another function, you are creating a closure. </p>
<p>In C, and most other common languages after a function returns, all the local variables are no longer accessible because the stack-frame is destroyed. </p>
<p>In JavaScript, if you declare a function within another function, then the local variables can remain accessible <em>after</em> returning from the function you called. This is demonstrated above, because we call the function <span class="codeSpan">say2();</span> after we have returned from <span class="codeSpan">sayHello2()</span>. Notice that the code that we call references the variable <span class="codeSpan">text</span>, which was a <em>local variable</em> of the function <span class="codeSpan">sayHello2()</span>. </p>
<div class="codeDiv">function()&nbsp;{&nbsp;alert(text);&nbsp;} <br />
<input class="codeButton" type="button" value="alert(say2.toString()); // show code" onclick="if(!window['say2x']) {alert('Click the above button 1st!')} else alert(say2x.toString()); // show code" /> </div>
<p>Click the button above to get JavaScript to print out the code for the anonymous function. You can see that the code refers to the variable <span class="codeSpan">text</span>. The anonymous function can reference <span class="codeSpan">text</span> which holds the value <span class="codeSpan">'Jane'</span> because the local variables of <span class="codeSpan">sayHello2()</span> are kept in a closure.<br />
<br />
The magic is that in JavaScript a function reference also has a secret reference to the closure it was created in - similar to how delegates are a method pointer plus a secret reference to an object. </p>
<ul id="toc">
    <li>JavaScript Closures 101- they're not magic </li>
    <li><a href="http://www.javascriptkit.com/javatutors/closures2.shtml">More closures examples</a> </li>
    <li><a href="http://www.javascriptkit.com/javatutors/closures3.shtml">Summary of JavaScript closures</a> </li>
</ul>
          <br/>
          <span style="color:red;">
            <a href="http://javaf1.javaeye.com/blog/133334#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 19 Oct 2007 09:49:40 +0800</pubDate>
        <link>http://javaf1.javaeye.com/blog/133334</link>
        <guid>http://javaf1.javaeye.com/blog/133334</guid>
      </item>
      <item>
        <title>浅谈数据库设计技巧</title>
        <author>z71711591</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://javaf1.javaeye.com">z71711591</a>&nbsp;
          链接：<a href="http://javaf1.javaeye.com/blog/132107" style="color:red;">http://javaf1.javaeye.com/blog/132107</a>&nbsp;
          发表时间: 2007年10月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          说到数据库，我认为不能不先谈数据结构。1996年，在我初入大学学习计算机编程时，当时的老师就告诉我们说：计算机程序＝数据结构＋算法。尽管现在的程序开发已由面向过程为主逐步过渡到面向对象为主，但我还是深深赞同8年前老师的告诉我们的公式：计算机程序＝数据结构＋算法。面向对象的程序开发，要做的第一件事就是，先分析整个程序中需处理的数据，从中提取出抽象模板，以这个抽象模板设计类，再在其中逐步添加处理其数据的函数(即算法)，最后，再给类中的数据成员和函数划分访问权限，从而实现封装。<br />
<br />
　　数据库的最初雏形据说源自美国一个奶牛场的记账薄(纸质的，由此可见，数据库并不一定是存储在电脑里的数据^_^)，里面记录的是该奶牛场的收支账目，程序员在将其整理、录入到电脑中时从中受到启发。当按照规定好的数据结构所采集到的数据量大到一定程度后，出于程序执行效率的考虑，程序员将其中的检索、更新维护等功能分离出来，做成单独调用的模块，这个模块后来就慢慢发展、演变成现在我们所接触到的数据库管理系统(DBMS)&mdash;&mdash;程序开发中的一个重要分支。<br />
<br />
　　下面进入正题，首先按我个人所接触过的程序给数据库设计人员的功底分一下类：<br />
　　１、没有系统学习过数据结构的程序员。这类程序员的作品往往只是他们的即兴玩具，他们往往习惯只设计有限的几个表，实现某类功能的数据全部塞在一个表中，各表之间几乎毫无关联。网上不少的免费管理软件都是这样的东西，当程序功能有限，数据量不多的时候，其程序运行起来没有什么问题，但是如果用其管理比较重要的数据，风险性非常大。<br />
　　２、系统学习过数据结构，但是还没有开发过对程序效率要求比较高的管理软件的程序员。这类人多半刚从学校毕业不久，他们在设计数据库表结构时，严格按照教科书上的规定，死扣E-R图和3NF(别灰心，所有的数据库设计高手都是从这一步开始的)。他们的作品，对于一般的access型轻量级的管理软件，已经够用。但是一旦该系统需要添加新功能，原有的数据库表差不多得进行大换血。<br />
　　３、第二类程序员，在经历过数次程序效率的提升，以及功能升级的折腾后，终于升级成为数据库设计的老鸟，第一类程序员眼中的高人。这类程序员可以胜任二十个表以上的中型商业数据管理系统的开发工作。他们知道该在什么样的情况下保留一定的冗余数据来提高程序效率，而且其设计的数据库可拓展性较好，当用户需要添加新功能时，原有数据库表只需做少量修改即可。<br />
　　４、在经历过上十个类似数据库管理软件的重复设计后，第三类程序员中坚持下来没有转行，而是希望从中找出&ldquo;偷懒&rdquo;窍门的有心人会慢慢觉悟，从而完成量变到质变的转换。他们所设计的数据库表结构有一定的远见，能够预测到未来功能升级所需要的数据，从而预先留下伏笔。这类程序员目前大多晋级成数据挖掘方面的高级软件开发人员。<br />
　　５、第三类程序员或第四类程序员，在对现有的各家数据库管理系统的原理和开发都有一定的钻研后，要么在其基础上进行二次开发，要么自行开发一套有自主版权的通用数据库管理系统。<br />
<br />
　　我个人正处于第三类的末期，所以下面所列出的一些设计技巧只适合第二类和部分第三类数据库设计人员。同时，由于我很少碰到有兴趣在这方面深钻下去的同行，所以文中难免出现错误和遗漏，在此先行声明，欢迎大家指正，不要藏私哦8)<br />
<br />
　　一、树型关系的数据表<br />
　　不少程序员在进行数据库设计的时候都遇到过树型关系的数据，例如常见的类别表，即一个大类，下面有若干个子类，某些子类又有子类这样的情况。当类别不确定，用户希望可以在任意类别下添加新的子类，或者删除某个类别和其下的所有子类，而且预计以后其数量会逐步增长，此时我们就会考虑用一个数据表来保存这些数据。按照教科书上的教导，第二类程序员大概会设计出类似这样的数据表结构：<br />
<br />
类别表_1(Type_table_1)<br />
名称　　　　　类型　　　　约束条件　　　说明<br />
type_id&nbsp;&nbsp;&nbsp;　&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;　&nbsp;&nbsp;&nbsp;无重复　　&nbsp;&nbsp;&nbsp;类别标识，主键<br />
type_name　　 char(50)&nbsp;&nbsp;&nbsp;&nbsp;不允许为空&nbsp;&nbsp;&nbsp;类型名称，不允许重复<br />
type_father&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不允许为空&nbsp;&nbsp;&nbsp;该类别的父类别标识，如果是顶节点的话设定为某个唯一值<br />
<br />
　　这样的设计短小精悍，完全满足3NF，而且可以满足用户的所有要求。是不是这样就行呢？答案是NO！Why？<br />
<br />
　　我们来估计一下用户希望如何罗列出这个表的数据的。对用户而言，他当然期望按他所设定的层次关系一次罗列出所有的类别，例如这样：<br />
总类别<br />
　　类别1<br />
　　　　类别1.1<br />
　　　　　　类别1.1.1<br />
　　　　类别1.2<br />
　　类别2<br />
　　　　类别2.1<br />
　　类别3<br />
　　　　类别3.1<br />
　　　　类别3.2<br />
　　&hellip;&hellip;<br />
<br />
　　看看为了实现这样的列表显示(树的先序遍历)，要对上面的表进行多少次检索？注意，尽管类别1.1.1可能是在类别3.2之后添加的记录，答案仍然是N次。这样的效率对于少量的数据没什么影响，但是日后类型扩充到数十条甚至上百条记录后，单单列一次类型就要检索数十次该表，整个程序的运行效率就不敢恭维了。或许第二类程序员会说，那我再建一个临时数组或临时表，专门保存类型表的先序遍历结果，这样只在第一次运行时检索数十次，再次罗列所有的类型关系时就直接读那个临时数组或临时表就行了。其实，用不着再去分配一块新的内存来保存这些数据，只要对数据表进行一定的扩充，再对添加类型的数量进行一下约束就行了，要完成上面的列表只需一次检索就行了。下面是扩充后的数据表结构：<br />
<br />
类别表_2(Type_table_2)<br />
名称　　　　　类型　　　　约束条件　　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;说明<br />
type_id&nbsp;&nbsp;&nbsp;　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;无重复　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;类别标识，主键<br />
type_name　　char(50)&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 不允许为空&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;类型名称，不允许重复<br />
type_father&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不允许为空&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; 该类别的父类别标识，如果是顶节点的话设定为某个唯一值<br />
type_layer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;char(6)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 限定3层,初始值为000000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;类别的先序遍历，主要为减少检索数据库的次数<br />
<br />
　　按照这样的表结构，我们来看看上面例子记录在表中的数据是怎样的：<br />
<br />
type_id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type_name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type_father&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type_layer<br />
1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;总类别&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;000000<br />
2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;类别1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;010000<br />
3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;类别1.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;010100<br />
4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;类别1.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;010200<br />
5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;类别2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;020000<br />
6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;类别2.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;020100<br />
7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;类别3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;030000<br />
8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;类别3.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;030100<br />
9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;类别3.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;030200<br />
10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;类别1.1.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;010101<br />
&hellip;&hellip;<br />
<br />
　　现在按type_layer的大小来检索一下：SELECT * FROM Type_table_2 ORDER BY type_layer<br />
<br />
列出记录集如下：<br />
<br />
type_id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type_name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type_father&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type_layer<br />
1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;总类别&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;000000<br />
2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;类别1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;010000<br />
3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;类别1.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;010100<br />
10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;类别1.1.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;010101<br />
4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;类别1.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;010200<br />
5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;类别2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;020000<br />
6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;类别2.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;020100<br />
7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;类别3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;030000<br />
8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;类别3.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;030100<br />
9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;类别3.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;030200<br />
&hellip;&hellip;<br />
<br />
　　现在列出的记录顺序正好是先序遍历的结果。在控制显示类别的层次时，只要对type_layer字段中的数值进行判断，每2位一组，如大于0则向右移2个空格。当然，我这个例子中设定的限制条件是最多3层，每层最多可设99个子类别，只要按用户的需求情况修改一下type_layer的长度和位数，即可更改限制层数和子类别数。其实，上面的设计不单单只在类别表中用到，网上某些可按树型列表显示的论坛程序大多采用类似的设计。<br />
<br />
　　或许有人认为，Type_table_2中的type_father字段是冗余数据，可以除去。如果这样，在插入、删除某个类别的时候，就得对type_layer 的内容进行比较繁琐的判定，所以我并没有消去type_father字段，这也正符合数据库设计中适当保留冗余数据的来降低程序复杂度的原则，后面我会举一个故意增加数据冗余的案例。<br />
<br />
　　<br />
　　二、商品信息表的设计<br />
　　假设你是一家百货公司电脑部的开发人员，某天老板要求你为公司开发一套网上电子商务平台，该百货公司有数千种商品出售，不过目前仅打算先在网上销售数十种方便运输的商品，当然，以后可能会陆续在该电子商务平台上增加新的商品出售。现在开始进行该平台数据库的商品信息表的设计。每种出售的商品都会有相同的属性，如商品编号，商品名称，商品所属类别，相关信息，供货厂商，内含件数，库存，进货价，销售价，优惠价。你很快就设计出4个表：商品类型表(Wares_type)，供货厂商表(Wares_provider)，商品信息表(Wares_info)：<br />
<br />
商品类型表(Wares_type)<br />
名称　　　　　类型　　　　约束条件　　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;说明<br />
type_id&nbsp;&nbsp;&nbsp;　&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;　&nbsp;&nbsp;&nbsp;无重复　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;类别标识，主键<br />
type_name　　 char(50)&nbsp;&nbsp;&nbsp;&nbsp;不允许为空&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;类型名称，不允许重复<br />
type_father&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不允许为空&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;该类别的父类别标识，如果是顶节点的话设定为某个唯一值<br />
type_layer&nbsp;&nbsp;&nbsp;&nbsp;char(6)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;限定3层,初始值为000000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;类别的先序遍历，主要为减少检索数据库的次数<br />
<br />
供货厂商表(Wares_provider)<br />
名称　　　　　类型　　　　约束条件　　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;说明<br />
provider_id&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;　&nbsp;&nbsp;&nbsp;无重复　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;供货商标识，主键<br />
provider_name char(100)&nbsp;&nbsp;&nbsp;不允许为空&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;供货商名称<br />
<br />
商品信息表(Wares_info)<br />
名称　　　　&nbsp;&nbsp;类型　　　　约束条件　　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;说明<br />
wares_id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;　&nbsp;&nbsp;无重复　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;商品标识，主键<br />
wares_name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char(100)&nbsp;&nbsp;不允许为空&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;商品名称<br />
wares_type　　 int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不允许为空　　　　　　　　　　 商品类型标识，和Wares_type.type_id关联<br />
wares_info&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char(200)&nbsp;&nbsp;允许为空&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;相关信息<br />
provider&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不允许为空&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;供货厂商标识，和Wares_provider.provider_id关联<br />
setnum&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;初始值为1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;内含件数，默认为1<br />
stock&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;初始值为0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;库存，默认为0<br />
buy_price&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;money&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不允许为空&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;进货价<br />
sell_price&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;money&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不允许为空&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;销售价<br />
discount&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;money&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不允许为空&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;优惠价<br />
<br />
　　你拿着这3个表给老板检查，老板希望能够再添加一个商品图片的字段，不过只有一部分商品有图片。OK，你在商品信息表(Wares_info)中增加了一个haspic的BOOL型字段，然后再建了一个新表&mdash;&mdash;商品图片表(Wares_pic)：<br />
<br />
商品图片表(Wares_pic)<br />
名称　　　　&nbsp;&nbsp;类型　　　　约束条件　　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;说明<br />
pic_id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;　&nbsp;&nbsp;&nbsp;无重复　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;商品图片标识，主键<br />
wares_id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不允许为空&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;所属商品标识，和Wares_info.wares_id关联<br />
pic_address　 char(200)&nbsp;&nbsp;&nbsp;不允许为空　　　　　　　　　　 图片存放路径<br />
<br />
　　程序开发完成后，完全满足老板目前的要求，于是正式启用。一段时间后，老板打算在这套平台上推出新的商品销售，其中，某类商品全部都需添加&ldquo;长度&rdquo;的属性。第一轮折腾来了&hellip;&hellip;当然，你按照添加商品图片表的老方法，在商品信息表(Wares_info)中增加了一个haslength的BOOL型字段，又建了一个新表&mdash;&mdash;商品长度表(Wares_length)：<br />
<br />
商品长度表(Wares_length)<br />
名称　　　　&nbsp;&nbsp;类型　　　　约束条件　　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;说明<br />
length_id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;　&nbsp;&nbsp;&nbsp;无重复　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;商品图片标识，主键<br />
wares_id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不允许为空&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;所属商品标识，和Wares_info.wares_id关联<br />
length　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char(20)&nbsp;&nbsp;&nbsp;&nbsp;不允许为空　　　　　　　　　　 商品长度说明<br />
<br />
　　刚刚改完没多久，老板又打算上一批新的商品，这次某类商品全部需要添加&ldquo;宽度&rdquo;的属性。你咬了咬牙，又照方抓药，添加了商品宽度表(Wares_width)。又过了一段时间，老板新上的商品中有一些需要添加&ldquo;高度&rdquo;的属性，你是不是开始觉得你所设计的数据库按照这种方式增长下去，很快就能变成一个迷宫呢？那么，有没有什么办法遏制这种不可预见性，但却类似重复的数据库膨胀呢？我在阅读《敏捷软件开发：原则、模式与实践》中发现作者举过类似的例子：7.3　&ldquo;Copy&rdquo;程序。其中，我非常赞同敏捷软件开发这个观点：在最初几乎不进行预先设计，但是一旦需求发生变化，此时作为一名追求卓越的程序员，应该从头审查整个架构设计，在此次修改中设计出能够满足日后类似修改的系统架构。下面是我在需要添加&ldquo;长度&rdquo;的属性时所提供的修改方案：<br />
<br />
　　去掉商品信息表(Wares_info)中的haspic字段，添加商品额外属性表(Wares_ex_property)和商品额外信息表(Wares_ex_info)2个表来完成添加新属性的功能。<br />
<br />
商品额外属性表(Wares_ex_property)<br />
名称　　　　&nbsp;&nbsp;类型　　　　约束条件　　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;说明<br />
ex_pid&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;　&nbsp;&nbsp;&nbsp;无重复　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;商品额外属性标识，主键<br />
p_name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char(20)&nbsp;&nbsp;&nbsp;&nbsp;不允许为空&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;额外属性名称<br />
<br />
商品额外信息表(Wares_ex_info)<br />
名称　　　　&nbsp;&nbsp;&nbsp;&nbsp;类型　　　　约束条件　　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;说明<br />
ex_iid&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;　&nbsp;&nbsp;&nbsp;无重复　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;商品额外信息标识，主键<br />
wares_id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不允许为空&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;所属商品标识，和Wares_info.wares_id关联<br />
property_id　&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不允许为空　　　　　　　　　　 商品额外属性标识，和Wares_ex_property.ex_pid关联<br />
property_value&nbsp;&nbsp;char(200)&nbsp;&nbsp;&nbsp;不允许为空&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;商品额外属性值<br />
<br />
　　在商品额外属性表(Wares_ex_property)中添加2条记录：<br />
ex_pid&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p_name<br />
1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;商品图片<br />
2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;商品长度<br />
<br />
　　再在整个电子商务平台的后台管理功能中追加一项商品额外属性管理的功能，以后添加新的商品时出现新的属性，只需利用该功能往商品额外属性表(Wares_ex_property)中添加一条记录即可。不要害怕变化，被第一颗子弹击中并不是坏事，坏的是被相同轨道飞来的第二颗、第三颗子弹击中。第一颗子弹来得越早，所受的伤越重，之后的抵抗力也越强8)(待续)
          <br/>
          <span style="color:red;">
            <a href="http://javaf1.javaeye.com/blog/132107#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 15 Oct 2007 23:07:50 +0800</pubDate>
        <link>http://javaf1.javaeye.com/blog/132107</link>
        <guid>http://javaf1.javaeye.com/blog/132107</guid>
      </item>
      <item>
        <title>TOAD中文文档</title>
        <author>z71711591</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://javaf1.javaeye.com">z71711591</a>&nbsp;
          链接：<a href="http://javaf1.javaeye.com/blog/131741" style="color:red;">http://javaf1.javaeye.com/blog/131741</a>&nbsp;
          发表时间: 2007年10月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p _extended="true"><font _extended="true" face="宋体"><font _extended="true" face="宋体"><br _extended="true" />
目录</font></font></p>
<p _extended="true"><font _extended="true" face="宋体">一．Toad功能综述<br _extended="true" />
二．系统需求<br _extended="true" />
三．安装指南<br _extended="true" />
四．快速入门<br _extended="true" />
1． Schema browser的用法简介<br _extended="true" />
2． SQL Editor的使用介绍<br _extended="true" />
3． Procedure Editor的用法介绍<br _extended="true" />
4． 如何进行PLSQL的debug<br _extended="true" />
5． 如何使用SQLab Xpert优化SQL<br _extended="true" />
6． 如何使用SQL Modeler来编写查询<br _extended="true" />
7． 如何使用Toad的DBA方面的功能</font></p>
<p _extended="true">&nbsp;</p>
<p _extended="true"><font _extended="true" face="宋体">一、 Toad功能综述</font></p>
<p _extended="true"><font _extended="true" face="宋体">在Oracle应用程序的开发过程中，访问数据库对象和编写SQL程序是一件乏味且耗费时间的工作，对数据库进行日常管理也是需要很多SQL脚本才能完成的。Quest Software为此提供了高效的Oracle应用开发工具-Toad（Tools of Oracle Application Developers）。在Toad的新版本中，还加入了DBA模块，可以帮助DBA完成许多日常管理工作。它最大的特点就是简单易用，访问速度快。使用 Toad，我们可以通过一个图形化的用户界面快速访问数据库，完成复杂的SQL和PL/SQL代码编辑和测试工作。Toad由Oracle开发专家专门为开发人员而设计，是一个功能强大、结构紧凑的专业化PL/SQL开发环境。<br _extended="true" />
</font></p>
<p _extended="true"><font _extended="true" face="宋体">Toad 主要具有如下特点：<br _extended="true" />
</font></p>
<p _extended="true"><font _extended="true" face="宋体">模式浏览：<br _extended="true" />
模式浏览功能可以让我们快速访问数据字典，浏览数据库中的表、索引、存储过程。Toad 提供对数据库的快速访问，使用极为方便，用户界面简洁，结构安排合理。当我们点击一个单独的数据库对象，Toad立即显示此对象的详细信息。例如，当我们点一个数据库的表，所有和此表相关的索引、约束、存储过程、SQL语句以及和其他表的相互引用关系都在同一界面显示出来。为了简化操作，用户可以在浏览窗口操作数据库对象。</font></p>
<p _extended="true">&nbsp;</p>
<p _extended="true"><font _extended="true" face="宋体">SQL 编辑器：<br _extended="true" />
SQL 编辑器的主要功能是编辑、运行和调整SQL语句。TOAD 的高级编辑窗口包括众多的特性来提高开发人员编写SQL语句的产品化程度。例如，简单地生成代码模板，在编写SQL前自动发现包的内容和列的名字等等。<br _extended="true" />
SQL编辑器包括一个编辑窗口和运行结果窗口，允许开发人员在编辑的过程中测试运行结果。SQL编辑器中不仅包括标准的编辑命令，也包括一些增强的功能，如快速查询表中的字段、将SQL语句的内容格式化等等。这个窗口可以处理大到4GB 的内容，对大的开发项目来说非常有用。便捷的书签可以让开发人员非常容易地找到相关位置。在运行结果窗口可提供用户定义的配置功能，支持LONG 和LONG RAW列，可以将数据卸出到磁盘、打印数据、编辑数据等等。</font></p>
<p _extended="true">&nbsp;</p>
<p _extended="true"><font _extended="true" face="宋体">存储过程编辑器：<br _extended="true" />
存储过程编辑器的主要功能是编辑、编译、测试、调试存储过程和触发器。TOAD提供语法标识、错误标识和其他很多易于使用的功能，如在弹出窗口显示表名、列名和Oracle函数。和其他的 PL/SQL 编辑工具不同，TOAD 允许在一个文件中操作多个数据库对象，可以编译一个对象、编译多个对象、编译到当前光标、从光标开始编译。在运行出现错误时，存储过程停止到有问题的语句。用户可以使用快捷方式或模板来快速编写PL/SQL,也可以根据需要生成自己的模板。使用Toad可以非常方便地进行编辑工作，可如设置书签、取消注释、格式化SQL语句等等。</font></p>
<p _extended="true">&nbsp;</p>
<p _extended="true"><font _extended="true" face="宋体">PL/SQL Debugger选项：<br _extended="true" />
Toad 提供简单易用的PL/SQL 调试功能，可以节省开发人员在大型项目中用于开发和测试的宝贵时间，提高应用开发的质量。在存储过程开发的过程中，Toad可以逐行编辑、调试和运行代码。运行时可以根据需要输入参数，观察相关参数的变化来检查存储过程的正确性。在调式过程中，Toad 可以通过窗口显示所有的断点、参数, 调用堆栈和输出参数。使用Toad，非常容易检测到存储过程的错误，开发人员可以一步一步运行PL/SQL语句来识别问题。调试会话可以和其他程序会话同时进行。</font></p>
<p _extended="true"><font _extended="true" face="宋体">SQLab Xpert Option：<br _extended="true" />
帮助开发人员优化SQL，为他们提供各种优化模式下SQL执行计划，并且能够给出优化的建议，能够比较各种模式下实际的SQL运行结果，帮助开发人员真正高速地开发高效地代码。</font></p>
<p _extended="true"><font _extended="true" face="宋体">Toad还可以外挂一些别的产品，比如PL/Formatter, RevealNet Knowledge Base , SQL Impact等，这些都能够和Toad紧密集成，共同提供了一个完美的集成开发环境。新版本还新增加了DBA模块，更加拓广了Toad这个产品的适用范围。</font></p>
<p _extended="true"><font _extended="true" face="宋体"><br _extended="true" />
二、系统要求：<br _extended="true" />
客户端：<br _extended="true" />
&uuml; Windows 95 / 98 / NT/2000中英文均可<br _extended="true" />
&uuml; 完整安装的SQL*Net 2.0或者Net8<br _extended="true" />
&uuml; 磁盘：一般安装需要20M左右的空间，根据所选择模块的不同和安装方式的不同，最少也要5M的磁盘空间（从网络服务器读取）<br _extended="true" />
&uuml; 内存：Windows 9x/Me:16M 内存；Windows NT/2000: Min 32M]<br _extended="true" />
&uuml; Tuning模块需要额外的25M空间</font></p>
<p _extended="true">服务器端：<br _extended="true" />
&uuml; Oracle 7.3 或者更高，在任何硬件平台上。<br _extended="true" />
&uuml; 需要一个DBA用户帐号</p>
<p _extended="true">&nbsp;</p>
<p _extended="true">三．安装：<br _extended="true" />
1． 三种安装方式的选择：<br _extended="true" />
a) TOAD and Personal Configuration Files to PC<br _extended="true" />
默认安装选择，完成一个完整的Client端的安装，把所有需要的文件拷贝到本地Toad目录。<br _extended="true" />
绝大多数用户应该选择使用这个安装方式。<br _extended="true" />
b) Personal Config Files to PC, read TOAD from Network Server<br _extended="true" />
从网络服务器读取Toad程序，在本地计算机安装一些自定义的文件，并且创建到服务器文件的快捷方式，一般不推荐使用这个方式，而且要求网络服务器已经配置。<br _extended="true" />
c) TOAD to Network Server<br _extended="true" />
把Toad安装到网络服务器上，以便这样别的用户能够进行Personal Config Files to PC, read TOAD from Network Server这种方式的安装。<br _extended="true" />
2．根据需要使用到的特性，需要运行一些脚本(都在Toad\temps目录下)<br _extended="true" />
&uuml; 如果需要用Toad来查看执行计划，必须运行脚本PrepToad.sql或者notoad.sql<br _extended="true" />
n 如果希望专门建立一个Toad 用户来存放Toad需要使用的对象的话，就运行preptoad.sql。<br _extended="true" />
n 如果希望在当前连接用户模式下建立toad需要使用的对象的话，就运行notoad.sql。<br _extended="true" />
n 注意，如果是选择了专门建立toad这个用户的话，需要先修改一下脚本，指定用户的默认表空间和临时表空间。<br _extended="true" />
&uuml; 需要使用Oracle8i 的Profile analyzer，必须运行ToadProfiler.sql<br _extended="true" />
&uuml; 需要加强Toad的安全性，必须运行ToadSecurity.sql</p>
<p _extended="true">&nbsp;</p>
<p _extended="true">四、Toad使用快速入门<br _extended="true" />
1． Schema Browser：<br _extended="true" />
Schema browser是Toad的极为有特色的模块。在schema browser的帮助下，可以方便的浏览数据库内部的各类数据库对象，比如表，索引，序列，存储过程等，而且可以方便的倒出DDL语句和进行各种修改，重建工作。定位到某一类对象上，这列对象允许的操作都会自动列出来。<br _extended="true" />
</p>
<p _extended="true">特色：<br _extended="true" />
l 支持Oracle数据库里面所有对象的新建、查看、修改，集成了几乎对所有数据库对象的管理所需要的功能。<br _extended="true" />
l 按照 模式-&gt;对象类别 -&gt;对象-&gt;对象可操作属性 -&gt; 对象本身的详细信息和对象相关的信息来组织，非常有条理，容易定位对象，也能够看到所有你需要的对象的相关信息。<br _extended="true" />
l 对于表：<br _extended="true" />
i. 完备的建表向导，不用输入冗长的语法，更加全面地替你考虑。<br _extended="true" />
ii. 可以修改表的各种逻辑和物理属性，修改列的属性，增加列，删除列(在Oracle8i里面)，修改表的物理存储属性，Truncate，Drop等。<br _extended="true" />
iii. 可以生成建表的完整的DDl语句，包括存储信息，权限信息，约束，索引和触发器等，而这些手工很难做到。<br _extended="true" />
iv. 可以方便的对表进行分析，查看表地所有信息，可以有条件的倒出表里面的数据，并且保存为sql语句。<br _extended="true" />
v. 可以方便的对表进行重组，可以完成exp/imp作不到的事情，而且更少地人工参与，更加安全。</p>
<p _extended="true">l 对于视图，存储过程：<br _extended="true" />
i. 可以保存建立视图、存储过程的语句为文本，<br _extended="true" />
ii. 重新编译失效的视图，存储过程，修改视图的定义语句等。方便的查看存储过程的代码，相互依赖关系，权限信息等保存为文本等。<br _extended="true" />
l 回滚段，<br _extended="true" />
i. 简洁明了的online，offline状态，方便地online/offline操作<br _extended="true" />
ii. 详细的回滚段物理信息和当前状态。<br _extended="true" />
iii. 可以方便的修改物理存储属性</p>
<p _extended="true">l 表空间：<br _extended="true" />
i. Tablespace Map；直观的显示数据物理的在表空间上的分布<br _extended="true" />
ii. 直观的查看各个表空间的利用率、剩余空间、破碎情况等信息<br _extended="true" />
iii. 可以进行各种alter操作：online, offline, 增加数据文件，改变数据文件大小，改变物理存储属性等<br _extended="true" />
l 对其他数据库对象也有完备的操作支持。</p>
<p _extended="true">2． SQL Editor:<br _extended="true" />
a) 激活SQL Editor的三种方式：<br _extended="true" />
i. 连接到数据库之后，Toad自动打开SQL Editor这个窗口。<br _extended="true" />
ii. 点击总工具栏上最左边的那个按钮<br _extended="true" />
iii. 从菜单栏：Database -&gt; SQL Editor<br _extended="true" />
b) 特点：<br _extended="true" />
l 允许同时打开多个编辑窗口，同时编辑多个SQL语句<br _extended="true" />
l 支持同时连接到多个数据库，同时对多个数据库进行操作<br _extended="true" />
l 允许编辑SQL，PLSQL，JAVA，HTML和文本<br _extended="true" />
l 使用书签功能，可以在大量SQL语句里，快速定位某个语句所在位置<br _extended="true" />
l SQL Editor本身具有强大的编辑功能，非常方便编辑SQL语句。<br _extended="true" />
l 强大的快捷键支持和工具栏快速按钮的支持，更加高效编写(很多快捷键可以自己定义，在View -&gt;options -&gt;SQL Editor里面)<br _extended="true" />
l 能够根据前面的条件，智能推测需要输入的代码，可以做到某种程度的代码智能填充<br _extended="true" />
l 把鼠标定位到表/视图/存储过程名称之上，按F4，可以打开对象描述窗口，方便的查看表和视图的定义，存储过程的源代码，<br _extended="true" />
l 非常容易对SQL语句的分析其执行计划：单击工具栏上的按钮就可以看到Explain Plan的结果<br _extended="true" />
l 支持部分SQL*Plus命令，可以方便的执行大量的为SQL*Plus编写的数据库脚本<br _extended="true" />
l 可以通过SQLab xpert来对当前SQL语句进行全面的分析，给出各种合理的调优意见，只需要单击工具栏上的Tuning按钮：<br _extended="true" />
l 可以方便的保存，打开和运行SQL脚本<br _extended="true" />
l 支持对查询结果进行修改，<br _extended="true" />
l 可以把查询结果以多种格式保存起来，可以保存为HTML，纯文本，XLS等多种格式<br _extended="true" />
l 很容易的得到SQL函数的列表和用法描述（Show SQL help Window 按钮）<br _extended="true" />
l 可以查看SQL语句的执行情况：通过下方的AutoTrace窗口，看到SQL语句的实际执行结果和执行效率。<br _extended="true" />
l 支持历史SQL(F8) ：可以方便的查询以前执行过的SQL，不用反复重新输入。<br _extended="true" />
l 可以执行匿名块，存储过程，从下方的窗口看到DBMS_OUTPUT的结果，如：</p>
<p _extended="true">3． Stored Procedure Editor<br _extended="true" />
a) 打开存储过程编写器的几个途径：<br _extended="true" />
l 单击总菜单栏上的第三个按钮：<br _extended="true" />
l 点击Database - &gt; Procedure Editor ，<br _extended="true" />
l 可以通过Schema browser来调用<br _extended="true" />
b) 一些特点和优点：<br _extended="true" />
1．强大的自定义设置：从保留字的显示方式，到自动替换，到各种快捷键的定义等等，用得越熟越顺手。<br _extended="true" />
2．<br _extended="true" />
3．自动用不同颜色显示SQL和PL/SQL关键字，语法清晰明了，可根据自己的习惯来具体定制各类关键字的具体显示方式。可以自定义存储过程得模板，在新建存储过程的时候，自动生成程序的框架可以方便的调用Schema Browser，把鼠标定位于某个对象上，F4，Schema Browser打开该对象的详细描述，帮助顺利快速开发程序。支持代码自动更正，如输入ndf，自动替换成NO_DATA_FOUND，输入the自动替换成the，类似的自动替换还可以自己修改和添加。<br _extended="true" />
7．方便的左边行号显示，单击左边行号就可以实现调试断点的增加/删除<br _extended="true" />
8．对各种快捷键的支持，不但包括常见的编辑操作，还可以有自己定义的PLSQL块的支持（自己定义快捷方式）。如可以定义CTRL+SHIFT+D:弹出所有PLSQL Block的类型，可以自己选择。<br _extended="true" />
9．可以在一个集成开发环境里面，一边编码，一边调试，不用多处切换<br _extended="true" />
10． 方便的同时打开多个存储过程，通过页面快速切换<br _extended="true" />
11．快速编译存储过程，快速定位错误所在，自己选择是否同时编译依赖的存储过程<br _extended="true" />
12．内置对PL/Formatter，可以用PL/Formatter对存储过程进行格式化，并且可以提供存储过程的概要分析和修改建议<br _extended="true" />
PL/Formatter可以对现有的存储过程进行高速的格式化，使所有的存储过程都符合同样的编写标准，这样既有利于提高程序的可读性，避免不同人写的模块的风格上的很差异。<br _extended="true" />
PL/Formatter 还有助于提高程序的模块化，增强程序的结构清晰度，增强SQL的共用性。<br _extended="true" />
PL/Formatter 还可以帮助完成PL/SQL和Oracle版本之间的管理。</p>
<p _extended="true">13． 内置RevealNet Knowledge Base，单击鼠标右键就可以打开，快速得到技术上的支持，解决技术难题<br _extended="true" />
nPL/SQL:<br _extended="true" />
n包含整个开发过程中可能遇到问题的答案<br _extended="true" />
nCode Library:大量的严谨的PL/SQL代码例子和现成过程，完全源代码提供<br _extended="true" />
n各种错误处理模块可供参考，各类字符日期函数<br _extended="true" />
n包含1400多个主题<br _extended="true" />
nAdmin：<br _extended="true" />
n解答DBA日常工作中80%的常见问题，覆盖2400多个主题<br _extended="true" />
n从网络到性能优化，从备份恢复到Error message,一应俱全<br _extended="true" />
例子：遇到失效的存储过程怎么办？<br _extended="true" />
4. 如何对存储过程进行Debug？<br _extended="true" />
u 需要Toad单独的Debug Option(Standard Version 没有这个选项)<br _extended="true" />
u 要用Toad对存储过程进行debug，必须安装Oracle的系统包：dbms_debug，而且必须安装Oracle Probe API v2.0 或者更高的版本。<br _extended="true" />
u 集成在Stored Precedure Editor里面，可以一边编写一边调试，大大提高开发效率<br _extended="true" />
u 打开Procedure Editor后，Debug菜单激活，可以开始进行Debug工作。<br _extended="true" />
u 允许对存储过程进行逐行调试、断点调试,也支持对触发器进行调试。<br _extended="true" />
u 可以有断点支持，支持Watch变量，允许运行时改变变量的值<br _extended="true" />
u 允许对多层调用的Debug支持<br _extended="true" />
调试步骤具体举例：<br _extended="true" />
1． 点击菜单栏的第三个按钮： ，打开Procedure Editor<br _extended="true" />
2． 点击Procedure Editor的菜单栏的按钮，调出需要调试的存储过程<br _extended="true" />
3． 单击工具栏上的按钮，输入需要传入的参数，如果不需要传入参数，可以直接单击工具栏上的按钮：，直接开始调试，如下图输入传入参数：</p>
<p _extended="true">4． 单击菜单栏的按钮：，可以单步跟踪，也可以定义一个断点，直接运行到断点在单步执行，在存储过程运行的过程中，当前语句会高亮度显示，并且把鼠标指针定位到变量上，Toad自动显示该变量的当前值。</p>
<p _extended="true">5． 可以随时中止程序的执行，只要点Debug -&gt;Halt Execution，或者菜单栏上的按钮 ，就可以中止程序的执行<br _extended="true" />
6． 当碰到一个存储过程调用另外一个存储过程的时候，可以选择跳过(Step Over) ，这样就直接运行那个被调用的存储过程，返回调用结果，继续这个存储过程的调试，也可以选择Trace Into ，这样就打开被调用的存储过程，进一步深入调试那个被调用的子存储过程。如果需要保持Debug信息，在编译的时候应该选择Compile Dependencies with Debug Information，就是Procedure Editor工具栏最右边的那个按钮 。<br _extended="true" />
7． 支持对变量实时追踪：使用Watch：<br _extended="true" />
可以在运行前，或者运行过程中对某个变量进行实时跟踪：Add Watch，把鼠标定位到该变量上，然后点击Debug -&gt;Add Watch At Cursor，该变量就会出现在Debug状态窗口上，而且实时反应该变量的当前值。如上图中的变量v_empname。可以运行时刻修改<br _extended="true" />
8． 断点支持：<br _extended="true" />
单击存储过程需要加断点的地方的行号，该行颜色变红，输入参数，单击执行按钮，可以直接运行到断点处，可以不必逐行追踪，更加高效率的进行调试。<br _extended="true" />
Debug Option还支持条件断点，只有当满足条件的时候才会在那个地方停止，否则就好像不存在这个断点一样继续运行。</p>
<p _extended="true">? 注意DBMS_OUTPUT.PUT_LINE的结果只有当程序执行完成以后才会出现，在程序执行过程中是没有结果的。</p>
<p _extended="true"><br _extended="true" />
4． 如何用SQLab Xpert对存储过程进行调优？<br _extended="true" />
我们知道，Oralce数据库的优化，最主要的步骤就在于SQL的优化。而在没有专门的工具（如Toad）的帮助下，进行SQL优化是一件非常困难和乏味的事情，并且需要对Oracle的深入理解和高超的Oracle调优技巧。使用Toad的SQLab Xpert Tuning模块，可以使我们普通开发人员也能够非常快速，精确的对SQL进行专家级的分析<br _extended="true" />
在SQL Editor和Procedure Editor里面，选中需要调试的SQL语句（SQLab Xpert只能调试Select,Insert, Update,Delete语句），复制到SQL Editor里面，然后点击工具栏上的调优按钮，Toad会自动打开SQLab xpert 窗口，捕获当前的SQL语句，并且把它转化为符合explain plan格式的语句。<br _extended="true" />
第一次打开Xpert的时候，Toad会提示你，需要安装一些Server端的表、视图和包等对象，可以把表存储到某个指定的表空间(如Tools)里面。可以简单的按照提示一步一步做就可以了。如果系统设定不允许Job的话（Job_queue_process=0）,Toad提示有些部件不会现在安装，可以忽略。安装完成以后，可以选择让某些非DBA用户也可以使用Toad的SQLab Xpert调优功能。<br _extended="true" />
安装完成以后，Toad会提示你一些关于优化目标方面的问题，你可以选择每次优化都可以重新设定，或者一次设定，以后一直使用这个设定。当然如果需要，还是可以更改的，在SQLab Option xpert的窗口的Administration和Preference下面重新设定。<br _extended="true" />
例子：<br _extended="true" />
下面这个SQL语句涉及到多表之间的关联，有一定的复杂性，我们可以借助Toad的SQLab Xpert Option来帮助分析：<br _extended="true" />
select a.name. b.name, c.emp_name<br _extended="true" />
from dep a, manager b,emp c<br _extended="true" />
where a.dep_no=c.DEP_NO<br _extended="true" />
and b.manag_id=c.manag_id<br _extended="true" />
and c.emp_no=3<br _extended="true" />
我们把这个SQL复制到SQL Editor里面，单击上面的调优按钮，Toad打开SQLab Xpert Option窗口。<br _extended="true" />
如下图：</p>
<p _extended="true">从上面的图中我们可以方面的看到：在各种优化模式下，该SQL语句的执行计划分别是什么样的，Toad给出了每一种执行计划的具体每一个步骤，每个步骤的成本，该表涉及的相关的数据等，如果SQL存取的表还没有经过分析，Toad会以红色警告显示，并且很方便的帮助你对该表进行分析，收集统计数据，重建索引等，以有助于优化器作出最好的选择。可以把当前的分析结果保存到它的资料库里边，以备以后再次调用之需。<br _extended="true" />
我们还可以与SQLab 的自动优化功能：点击Original SQL下面的auto tune按钮，Toad会对执行结果按照tkprof进行分析（当然，这需要你在initsid.ora里面设置好utl_file_dir，如果服务器是在Unix机器上的话，还需要通过FTP方式得到Trace文件，有一些小小的设置）。<br _extended="true" />
自动优化非常高效的对所有执行计划进行实际运行比较，并且给出实际执行的时间的对比，如下图：</p>
<p _extended="true">我们还可以让Toad给出实际的优化建议：点击Original SQL,单击下面的Advice按钮，Toad根据对SQL的分析和执行结果给出合理的建议：<br _extended="true" />
如：<br _extended="true" />
1．把表和索引分别放到两个不同的表空间，因为我们在创建表，加上约束的时候没有指定USING INDEX子句，所以表和索引都建立在了用户的默认表空间上了。<br _extended="true" />
2．对表EMP，DEP和MANAGER进行分析，收集最新的统计数据，有利于CBO得到最优的执行计划<br _extended="true" />
3．在合适的列上创建索引：EMP的manag_id和dep_no。当表中存在大量的数据的时候，这样可以大大减少由于全表扫描带来的成本。</p>
<p _extended="true"><br _extended="true" />
5． SQL Modeler：<br _extended="true" />
SQL Modeler可以帮助开发人员很容易的写出各种复杂的SQL语句，只需通过简单的拖动鼠标，就能够写出复杂的SQL语句来。<br _extended="true" />
打开SQL Modeler的几个途径：<br _extended="true" />
i. 菜单栏 Database -&gt; SQL Modeler ，打开窗口<br _extended="true" />
ii. 单击工具栏第四个按钮 ，打开SQL Modeler窗口<br _extended="true" />
窗口由三个主要部分组成：<br _extended="true" />
n 表选择区域：最右边的那个部分，用来选择From子句中用到的表。拖动到左边的区域或者双击就选择了该表。<br _extended="true" />
n 表模型区域：用来图形化的显示选择的表和表之间的关联关系。<br _extended="true" />
n 生成SQL区域：这里显示用图形化方式创建的查询对应的SQL语句，</p>
<p _extended="true">在SQL Modeler里面，还支持对生成的SQL进行Explain Plan，调试SQL的性能，运行SQL，看是否得到了希望的结果，保存生成的语句，或者把语句粘贴到SQL Editor里面。</p>
<p _extended="true">有了SQL Modeler的帮助，即使是初级的程序员也能编写出复杂而又高效的SQL查询来。<br _extended="true" />
比如下面的例子；</p>
<p _extended="true">生成步骤：<br _extended="true" />
1． 选出表emp, dep, manager<br _extended="true" />
2． 用鼠标拖住emp的emp_name和emp_no, dep的name,manager的name<br _extended="true" />
3． 双击criteria窗口的emp_no condition列，弹出窗口，输入查询条件，比如emp_no=3<br _extended="true" />
4．由于结果里面不希望emp_no出现，双击emp_no列的visible，设置为false<br _extended="true" />
5．这样就出来了需要的查询，现在可以运行查询得到结果，对查询SQL进行分析，或者在SQL Editor里面打开这个SQL，或者保存为SQL Model文件，或者再进一步处理，比如加排序， 汇总等。</p>
<p _extended="true">DBA方面的功能：<br _extended="true" />
Toad在DBA日常管理方面的能力是非常强大的，可以帮助DBA安全快速地完成许多日常工作，还有Toad特有的一些小工具能完成一些普通方法很难做到的功能。下面大概讲述了各个常用模块的主要功能：<br _extended="true" />
a) Database Monitor<br _extended="true" />
提供直观的Oracle数据库运行状况，包括下面这些详细信息：<br _extended="true" />
可以看到逻辑IO，物理IO，各个状态的session数目，SGA的利用率，共享池的使用状况，各类事件的等待状况，以及各类事件随着时间的变化情况<br _extended="true" />
b) Instance Monitor<br _extended="true" />
i. 可以用来检查本地tnsnames.ora文件里面定义的所有节点、Listener和数据库的运行状态和版本等相关信息。<br _extended="true" />
ii. 可以远程启动、关闭数据库（如果设置了password验证方式）<br _extended="true" />
c) Unix Monitor：<br _extended="true" />
i. 可以监控Unix机器的运行状况比如详细的机器启动时间，CPU利用率，主要的进程以及这些进程占用的资源，主要的磁盘IO等。<br _extended="true" />
d) Trace/Kill session<br _extended="true" />
i. 方便的查看所有的连接用户相关信息：比如终端，程序，连接时间等<br _extended="true" />
ii. 对某个用户进行跟踪，查看用户执行的SQL语句，查看语句的执行计划，<br _extended="true" />
iii. 方便的查阅系统的Lock对象，有没有什么等待别的事务释放锁的情况，并能够轻易查出等待什么用户的什么事件结束，那个用户执行的是什么SQL。<br _extended="true" />
iv. 查看回滚段的使用状态，什么用户，什么语句，使用的什么回滚段，多少读写量等<br _extended="true" />
e) Oracle Parameter<br _extended="true" />
i. 可以方便的查看Oracle系统的参数：是否默认值，参数作用的简要描述，是否可以用alter session/alter system来动态改变，对于那些可以动态改变的参数，可以双击鼠标来进行修改</p>
<p _extended="true">f) NLS_PARAMETER:<br _extended="true" />
i. 方便的查看session，instance，database一级的NLS参数值，<br _extended="true" />
ii. 可以动态修改session的NLS参数值</p>
<p _extended="true">g) Extents<br _extended="true" />
i. 可以查看某个用户下的表和索引的详细的存储情况，<br _extended="true" />
ii. 发现那些占用大量空间的表和索引，可以考虑使用相应的对策，比如分区<br _extended="true" />
iii. 发现那些即将达到max_extents的表和索引并可以及时纠正<br _extended="true" />
iv. 发现那些索引和表处于同一个表空间的情况，并可以及时纠正。</p>
<p _extended="true">h) Tablespace<br _extended="true" />
i. 直观的查看每个表空间的利用率，总空间，已使用空间，剩余可是用空间以及默认存储参数，和表空间是否需要整理等信息<br _extended="true" />
ii. 查看每个表空间的状态，组成的数据文件，以及每个数据文件的详细信息<br _extended="true" />
iii. 查看每个表空间里面存在的对象和这些对象的详细存储特性<br _extended="true" />
i) Tablespace Map：<br _extended="true" />
i. 图形化的显示表空间里面各个表/索引所占用的空间，各个segment的大小，segment是否连续等信息，非常直观<br _extended="true" />
ii.<br _extended="true" />
j) Server Statistics:<br _extended="true" />
i. 可以非常直观的看到系统总体运行情况，迅速定位系统瓶颈所在<br _extended="true" />
ii. 可以查看系统范围内各类等待事件的状况，查看每个连接会话的状况，<br _extended="true" />
k) Pinned Code：<br _extended="true" />
i. 我们知道，频繁执行的大的存储过程最好Pin起来，这样可以避免被Oracle在内存不足的情况下换出内存，避免动态加载，也避免flush shared pool的时候被清出内存。<br _extended="true" />
ii. 根据每个模块的大小，执行次数，决定是否要把某个存储过程PIN起来。一个按钮就搞定了。<br _extended="true" />
l) Control Files:<br _extended="true" />
可以查看当前系统有哪几个控制文件，以及控制文件内部记录的详细信息。<br _extended="true" />
（实际上就是V$CONTROLFILE, V$CONTROLFILE_RECORD_SECTION）<br _extended="true" />
m) Redo Log Manager:<br _extended="true" />
i. 可以方便的查看LOG的组，当前日志，每个组里面的成员名字，大小，方便的增加、删除log组，切换当前日志，对日志归档进行具体的控制。<br _extended="true" />
ii. 可以在这个界面里完成几乎所有的对redo log的操作。<br _extended="true" />
n) Repair chained rows:<br _extended="true" />
i. Chained rows影响系统性能，处于系统性能的考虑，需要把chained rows修复成普通的表的行。使用repaie chained rows,就可以比较容易的做到这一点。选择需要分析的表，然后分析一下，看有没有chained rows，如果有，点击repair，Toad就帮你把那些chained rows给修复了。<br _extended="true" />
o) Identify Space Deficits<br _extended="true" />
如果系统出现1659,1653错误，就是一个不合格的DBA。但是要即时预见这些错误，还是有一定的难度的。有了Toad的这个小工具之后，一点某个表空间，就知道这个表空间里面的剩余自由空间是否允许任何表能够扩展到下一个extent。并能够在发现问题之后，直接改正问题。</p>
<p _extended="true">p) Estimate Table/Index Size<br _extended="true" />
i. 数据库的物理规划中，表/索引的存储子句的定义是非常重要的，影响系统。但是没有什么工具的话，要为表定义合理的存储子句也不容易。<br _extended="true" />
ii. 在Toad里面，专门有工具帮助你合理定义表/索引的存储情况：<br _extended="true" />
1. 自己可以定义将来表中需要存储的数据的数目<br _extended="true" />
2. 多种估计方式：<br _extended="true" />
a) 根据对已有的数据的分析来定义表的大小（最精确，但是比较慢）<br _extended="true" />
b) 根据表定义数据类型来定义表的大小<br _extended="true" />
c) 根据数据字典中以前分析过的数据来估计大小（需要近期分析过该表）</p>
<p _extended="true">q) Analyze All Tables<br _extended="true" />
i. 基于CBO的SQL需要CBO提供最优化的执行路径来提高程序的执行效率，但是假如对表进行大量的DML操作之后，不及时更新表的统计数据，这时候CBO就不能选择最为有效的执行路径，导致程序执行效率低。<br _extended="true" />
ii. 手工分析表比较麻烦，一个一个做。<br _extended="true" />
iii. 用Toad的Analyze Alltables这个工具，可以一次分析整个模式下面的所有表，有丰富的控制选项，包括是采用估计还是完全，是否同时分析索引，估计的话，采用多大的百分比等。<br _extended="true" />
r) Rebuild Table<br _extended="true" />
i. 当表中的数据被反复大量的DML之后，而且PCTFREE和PCTUSED定义的不合理的情况下，表可能会变得非常破碎，占用大量的extent，索引也会相当破碎，导致效率相当低下。<br _extended="true" />
ii. 传统的方式是通过exp/imp来解决这个问题，但是步骤实在比较麻烦，手工操作也有一定的危险性。<br _extended="true" />
iii. 使用Rebuild Table工具，轻松搞定，而且可以手工修改一些通过EXP/IMP无法修改的参数，比如freelists ,freelists group, tablespace，initial等，还能够更改列的名字。<br _extended="true" />
s) Relocate Index<br _extended="true" />
i. 我们知道，表和索引一般都需要分开存放到不同的表空间，这样比较便于管理，性能上也会有一定的提高，因为可以对表和索引同时存取。<br _extended="true" />
ii. 但是实际上很多时候，由于这样那样的原因，常常忽略了索引单独存放这个基本概念，比如建立主键约束的时候没有加USING INDEX子句，后来disable/enable了主键约束/唯一性约束等，都会导致把索引直接存放到和表同一个表空间里面。<br _extended="true" />
iii. 手工发现这些索引，再逐个移动非常麻烦，容易出错，在Toad里面，就很容易根据用户/表空间来发现那些不恰当存放的索引，可以批量移动这些索引，并且允许重新定义索引的存储子句。<br _extended="true" />
t) Generate Schema Scripts：<br _extended="true" />
i. 可以用来生成整个用户下所有/部分对象的DDL语句。可以把结果保存为sql语句或者保存为TOAD的自定义格式。<br _extended="true" />
ii. 可以用来复制表结构，（EXP/IMP有非常严重的缺陷，就是从一个大的数据库倒出的表结构，无法导入到一个小的数据库里面，因为里面包含了原来表的存储信息，即使选择rows=N，也要在导入数据库里面占用相当大的空间）<br _extended="true" />
u) Compare Schema：<br _extended="true" />
i. 在开发的时候，有时候同时在几个开发库上开发，但是最后两个库的结构不完全一样，很难比较<br _extended="true" />
ii. 用TOAD的这个功能，可以对两个数据库的模式（用户）下面的所有对象（包括存储过程）进行比较，可以选择具体的比较内容。<br _extended="true" />
iii. 可以通过直接打开两个到各自数据库的连接，或者根据Toad generate schame scripts生成的文件进行对比。<br _extended="true" />
iv. 可以直接生成同步两个数据库的sql脚本，给出汇总的区别简要和详细报告等。&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://javaf1.javaeye.com/blog/131741#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 14 Oct 2007 09:19:12 +0800</pubDate>
        <link>http://javaf1.javaeye.com/blog/131741</link>
        <guid>http://javaf1.javaeye.com/blog/131741</guid>
      </item>
      <item>
        <title>软件构架之设计模式</title>
        <author>z71711591</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://javaf1.javaeye.com">z71711591</a>&nbsp;
          链接：<a href="http://javaf1.javaeye.com/blog/53748" style="color:red;">http://javaf1.javaeye.com/blog/53748</a>&nbsp;
          发表时间: 2007年02月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><strong>设计模式的定义</strong>:设计模式设计范畴的术语,是指相似的软件分析背景条件下,处理同一类软件分析结果的典型设计结构.大部分的设计模式是基于面向对象的,属于OOD部分.按照中国人的通俗说法,设计模式就是OOD过程中可使用的招数.</p>
<p><strong>设计模式的种类</strong>:GOF23从两方面分类.</p>
<p>范围分类:类范畴菏对象范畴两类;功能分类:创建型,结构型,行为型;具体分类如下:</p>
<p>&nbsp;
<table cellspacing="1" border="1" height="70" summary="GOF23的标准分类" width="100%" cellpadding="1">
    <caption><strong>设计模式的分类</strong></caption>
    <tbody>
        <tr>
            <td><strong></strong></td>
            <td><strong>创建型</strong></td>
            <td><strong>结构型</strong></td>
            <td><strong>行为型</strong></td>
        </tr>
        <tr>
            <td><strong>类范畴</strong></td>
            <td>Factory Method</td>
            <td>Adapter</td>
            <td>InterPreter,Template Method</td>
        </tr>
        <tr>
            <td><strong>对象范畴</strong></td>
            <td>
            <p>Abstract Factory,</p>
            <p>Builder,Prototype,Singleton</p>
            </td>
            <td>
            <p>Adapter,Bridge,Composite,Decorator,</p>
            <p>Facade,Flyweight,Proxy</p>
            </td>
            <td>
            <p>chain of Responsibility,</p>
            <p>Command,Iterator,Mediator</p>
            <p>Memento,Observer,State,Strategy,Visitor</p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>今天就得到这吧,接下来我会给大家详细讲解一些开发中常用的设计模式,如Factory Method,Abstract Factory,Adapter,Observer等设计模式的原理和java实现,敬请关注.谢谢.</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://javaf1.javaeye.com/blog/53748#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 10 Feb 2007 23:59:00 +0800</pubDate>
        <link>http://javaf1.javaeye.com/blog/53748</link>
        <guid>http://javaf1.javaeye.com/blog/53748</guid>
      </item>
  </channel>
</rss>