﻿<?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>IT博客-sunnywang-随笔分类-accumulation of knowledge</title><link>http://www.cnitblog.com/sunnywang/category/6594.html</link><description>      smile forever.
        
 </description><language>zh-cn</language><lastBuildDate>Sat, 23 Jun 2012 18:46:28 GMT</lastBuildDate><pubDate>Sat, 23 Jun 2012 18:46:28 GMT</pubDate><ttl>60</ttl><item><title>三大统计软件：SAS、Stata与SPSS比较（转载）</title><link>http://www.cnitblog.com/sunnywang/archive/2012/06/21/81604.html</link><dc:creator>sunnywang   </dc:creator><author>sunnywang   </author><pubDate>Thu, 21 Jun 2012 03:22:00 GMT</pubDate><guid>http://www.cnitblog.com/sunnywang/archive/2012/06/21/81604.html</guid><wfw:comment>http://www.cnitblog.com/sunnywang/comments/81604.html</wfw:comment><comments>http://www.cnitblog.com/sunnywang/archive/2012/06/21/81604.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/sunnywang/comments/commentRss/81604.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/sunnywang/services/trackbacks/81604.html</trackback:ping><description><![CDATA[<div class="tit">三大统计软件：SAS、Stata与SPSS比较（转载）</div>
<div class="date">2006-08-07 11:22</div>
<table style="width: 100%; table-layout: fixed">
<tbody>
<tr>
<td>
<div id="blog_text" class="cnt"><br />Strategically using General Purpose Statistics Packages:<br />A Look at Stata, SAS and SPSS<br /><br />中文版（自英文版本翻译）：<br /><span style="font-size: 9pt">很多人曾问及SAS，Stata 和SPSS之间的不同，它们之中哪个是最好的。可以想到，每个软件都有自己独特的风格，有自己的优缺点。本文对此做了概述，但并不是一个综合的比较。人们时常会对自己所使用的统计软件有特别的偏好，希望大多数人都能认同这是对这些软件真实而公允的一个对比分析。<br /><br />　　SAS<br />　　一般用法。SAS由于其功能强大而且可以编程，很受高级用户的欢迎。也正是基于此，它是最难掌握的软件之一。使用SAS时，你需要编写SAS程序来处理数据，进行分析。如果在一个程序中出现一个错误，找到并改正这个错误将是困难的。<br />　　数据管理。在数据管理方面，SAS是非常强大的，能让你用任何可能的方式来处理你的数据。它包含SQL（结构化查询语言）过程，可以在SAS数据集中使用SQL查询。但是要学习并掌握SAS软件的数据管理需要很长的时间，在Stata或SPSS中，完成许多复杂数据管理工作所使用的命令要简单的多。然而，SAS可以同时处理多个数据文件，使这项工作变得容易。它可以处理的变量能够达到32,768个，以及你的硬盘空间所允许的最大数量的记录条数。<br />　　统计分析。SAS能够进行大多数统计分析（回归分析，logistic回归，生存分析，方差分析，因子分析，多变量分析）。SAS的最优之处可能在于它的方差分析，混合模型分析和多变量分析，而它的劣势主要是有序和多元logistic回归（因为这些命令很难），以及稳健方法（它难以完成稳健回归和其他稳健方法）。尽管支持调查数据的分析，但与Stata比较仍然是相当有限的。<br />　　绘图功能。在所有的统计软件中，SAS有最强大的绘图工具，由SAS/Graph模块提供。然而，SAS/Graph模块的学习也是非常专业而复杂，图形的制作主要使用程序语言。SAS 8虽然可以通过点击鼠标来交互式的绘图，但不象SPSS那样简单。<br />　　总结。SAS适合高级用户使用。它的学习过程是艰苦的，最初的阶段会使人灰心丧气。然而它还是以强大的数据管理和同时处理大批数据文件的功能，得到高级用户的青睐。<br /><br />　　Stata<br />　　一般用法。Stata以其简单易懂和功能强大受到初学者和高级用户的普遍欢迎。使用时可以每次只输入一个命令（适合初学者），也可以通过一个Stata程序一次输入多个命令（适合高级用户）。这样的话，即使发生错误，也较容易找出并加以修改。<br />　　数据管理。尽管Stata的数据管理能力没有SAS那么强大，它仍然有很多功能较强且简单的数据管理命令，能够让复杂的操作变得容易。Stata主要用于每次对一个数据文件进行操作，难以同时处理多个文件。随着Stata/SE的推出，现在一个Stata数据文件中的变量可以达到32,768，但是当一个数据文件超越计算机内存所允许的范围时，你可能无法分析它。<br />　　统计分析。Stata也能够进行大多数统计分析（回归分析，logistic回归，生存分析，方差分析，因子分析，以及一些多变量分析）。Stata最大的优势可能在于回归分析（它包含易于使用的回归分析特征工具），logistic回归（附加有解释logistic回归结果的程序，易用于有序和多元logistic回归）。Stata也有一系列很好的稳健方法，包括稳健回归，稳健标准误的回归，以及其他包含稳健标准误估计的命令。此外，在调查数据分析领域，Stata有着明显优势，能提供回归分析，logistic回归，泊松回归，概率回归等的调查数据分析。它的不足之处在于方差分析和传统的多变量方法（多变量方差分析，判别分析等）。<br />　　绘图功能。正如SPSS，Stata能提供一些命令或鼠标点击的交互界面来绘图。与SPSS不同的是它没有图形编辑器。在三种软件中，它的绘图命令的句法是最简单的，功能却最强大。图形质量也很好，可以达到出版的要求。另外，这些图形很好的发挥了补充统计分析的功能，例如，许多命令可以简化回归判别过程中散点图的制作。<br />　　总结。Stata较好地实现了使用简便和功能强大两者的结合。尽管其简单易学，它在数据管理和许多前沿统计方法中的功能还是非常强大的。用户可以很容易的下载到别人已有的程序，也可以自己去编写，并使之与Stata紧密结合。<br /><br />　　SPSS<br />　　一般用法。SPSS非常容易使用，故最为初学者所接受。它有一个可以点击的交互界面，能够使用下拉菜单来选择所需要执行的命令。它也有一个通过拷贝和粘贴的方法来学习其&#8220;句法&#8221;语言，但是这些句法通常非常复杂而且不是很直观。<br />　　数据管理。SPSS有一个类似于Excel的界面友好的数据编辑器，可以用来输入和定义数据（缺失值，数值标签等等）。它不是功能很强的数据管理工具（尽管SPS 11版增加了一些增大数据文件的命令，其效果有限）。SPSS也主要用于对一个文件进行操作，难以胜任同时处理多个文件。它的数据文件有4096个变量，记录的数量则是由你的磁盘空间来限定。<br />　　统计分析。SPSS也能够进行大多数统计分析（回归分析，logistic回归，生存分析，方差分析，因子分析，多变量分析）。它的优势在于方差分析（SPSS能完成多种特殊效应的检验）和多变量分析（多元方差分析，因子分析，判别分析等），SPSS11.5版还新增了混合模型分析的功能。其缺点是没有稳健方法（无法完成稳健回归或得到稳健标准误），缺乏调查数据分析（SPSS12版增加了完成部分过程的模块）。<br />　　绘图功能。SPSS绘图的交互界面非常简单，一旦你绘出图形，你可以根据需要通过点击来修改。这种图形质量极佳，还能粘贴到其他文件中（Word 文档或Powerpoint等）。SPSS也有用于绘图的编程语句，但是无法产生交互界面作图的一些效果。这种语句比Stata语句难，但比SAS语句简单（功能稍逊）。<br />　　总结。SPSS致力于简便易行（其口号是&#8220;真正统计，确实简单&#8221;），并且取得了成功。但是如果你是高级用户，随着时间推移你会对它丧失兴趣。SPSS是制图方面的强手，由于缺少稳健和调查的方法，处理前沿的统计过程是其弱项。<br /><br />　　总体评价<br />　　每个软件都有其独到之处，也难免有其软肋所在。总的来说，SAS，Stata和SPSS是能够用于多种统计分析的一组工具。通过Stat/Transfer可以在数秒或数分钟内实现不同数据文件的转换。因此，可以根据你所处理问题的性质来选择不同的软件。举例来说，如果你想通过混合模型来进行分析，你可以选择SAS；进行logistic回归则选择Stata；若是要进行方差分析，最佳的选择当然是SPSS。假如你经常从事统计分析，强烈建议您把上述软件收集到你的工具包以便于数据处理。</span> <br /><br />English Version：<br />
<table style="table-layout: fixed" border="0" cellspacing="0" cellpadding="0" width="100%" height="100%">
<tbody>
<tr>
<td valign="top"><a href="http://hi.baidu.com/aimeekong/blog/item/misc.php?action=viewratings&amp;tid=92&amp;pid=309" name="pid309" alt="查看评分记录"><span class="smalltxt"><span class="bold"></span><span style="font-size: 9pt"><u><font color="#0066cc">SAS<br /><br />General use. SAS is a package that many "power users" like because of its power and programmability. Because SAS is such a powerful package, it is also one of the most difficult to learn. To use SAS, you write SAS programs that manipulate your data and perform your data analyses. If you make a mistake in a SAS program, it can be hard to see where the error occurred or how to correct it.<br />Data Management. SAS is very powerful in the area of data management, allowing you to manipulate your data in just about any way possible. SAS includes proc sql that allows you to perform sql queries on your SAS data files. However, it can take a long time to learn and understand data management in SAS and many complex data management tasks can be done using simpler commands in Stata or SPSS. However, SAS can work with many data files at once easing tasks that involve working with multiple files at once. SAS can handle enormous data files up to 32,768 variables and the number of records is generally limited to the size of your hard disk.<br />Statistical Analysis. SAS performs most general statistical analyses (regression, logistic regression, survival analysis, analysis of variance, factor analysis, multivariate analysis). The greatest strengths of SAS are probably in its ANOVA, mixed model analysis and multivariate analysis, while it is probably weakest in ordinal and multinomial logistic regression (because these commands are especially difficult), robust methods (it is difficult to perform robust regression, or other kinds of robust methods). While there is some support for the analysis of survey data, it is quite limited as compared to Stata.<br />Graphics. SAS may have the most powerful graphic tools among all of the packages via SAS/Graph. However, SAS/Graph is also very technical and tricky to learn. The graphs are created largely using syntax language; however, SAS 8 does have a point and click interface for creating graphs but it is not as easy to use as SPSS.<br />Summary. SAS is a package geared towards power users. It has a steep learning curve and can be frustrating at first. However, power users enjoy the its powerful data management and ability to work with numerous data files at once.<br /><br /><br />Stata<br /><br />General Use. Stata is a package that many beginners and power users like because it is both easy to learn and yet very powerful. Stata uses one line commands which can be entered one command at a time (a mode favored by beginners) or can be entered many at a time in a Stata program (a mode favored by power users). Even if you make a mistake in a Stata command, it is often easy to diagnose and correct the error.<br />Data Management. While the data management capabilities of Stata may not be quite as extensive as those of SAS, Stata has numerous powerful yet very simple data management commands that allows you to perform complex manipulations of your data with ease. However, Stata primarily works with one data file at a time so tasks that involve working with multiple files at once can be cumbersome. With the release of Stata/SE, you can now have up to 32,768 variables in a Stata data file but probably would not want to analyze a data file that exceeds the size of your computers memory.<br />Statistical Analysis . Stata performs most general statistical analyses (regression, logistic regression, survival analysis, analysis of variance, factor analysis, and some multivariate analysis). The greatest strengths of Stata are probably in regression (it has very easy to use regression diagnostic tools), logistic regression, (add on programs are available that greatly simplify the interpretation of logistic regression results, and ordinal logistic and multinomial logistic regressions are very easy to perform). Stata also has a very nice array of robust methods that are very easy to use, including robust regression, regression with robust standard errors, and many other estimation commands include robust standard errors as well. Stata also excels in the area of survey data analysis offering the ability to analyze survey data for regression, logistic regression, poisson regression, probit regression, etc...). The greatest weaknesses in this area would probably be in the area of analysis of variance and traditional mutivariate methods (e.g. manova, discriminant analysis, etc.).<br />Graphics. Like SPSS, Stata graphics can be created using Stata commands or using a point and click interface. Unlike SPSS, the graphs cannot be edited using a graph editor. The syntax of the graph commands is the easiest of the three packages and is also the most powerful. Stata graphs are high quality, publication quality graphs. In addition, Stata graphics are very functional for supplementing statistical analysis, for example there are numerous commands that simplify the creation of plots for regression diagnostics.<br />Summary. Stata offers a good combination of ease of use and power. While Stata is easy to learn, it also has very powerful tools for data management, many cutting edge statistical procedures, the ability to easily download programs developed by other users and the ability to create your own Stata programs that seamlessly become part of Stata.<br /><br />SPSS<br /><br />General use. SPSS is a package that many beginners enjoy because it is very easy to use. SPSS has a "point and click" interface that allows you to use pulldown menus to select commands that you wish to perform. SPSS does have a "syntax" language which you can learn by "pasting" the syntax from the point and click menus, but the syntax that is pasted is generally overly complicated and often unintuitive.<br />Data Management. SPSS has a friendly data editor that resembles Excel that allows you to enter your data and attributes of your data (missing values, value labels, etc.) However, SPSS does not have very strong data management tools (although SPSS version 11 added commands for reshaping data files from "wide" format to "long" format, and vice versa). SPSS primarily edits one data file at a time and is not very strong for tasks that involve working with multiple data files at once. SPSS data files can have 4096 variables and the number of records is limited only by your disk space.<br />Statistical Analysis. SPSS performs most general statistical analyses (regression, logistic regression, survival analysis, analysis of variance, factor analysis, and multivariate analysis). The greatest strengths of SPSS are in the area of analysis of variance (SPSS allows you to perform many kinds of tests of specific effects) and multivariate analysis (e.g. manova, factor analysis, discriminant analysis) and SPSS 11 has added some capabilities for analyzing mixed models. The greatest weakness of SPSS are probably in the absence of robust methods (we know of no abilities to perform robust regression or to obtain robust standard errors), the absence of survey data analysis (we know of no tools in this area).<br />Graphics. SPSS has a very simple point and click interface for creating graphs and once you create graphs they can be extensively customized via its point and click interface. The graphs are very high quality and can be pasted into other documents (e.g. word documents or powerpoint). SPSS does have a syntax language for creating graphs but many of the features in the point and click interface are not available via the syntax language. The syntax language is more complicated than the language provided by Stata, but probably simpler (but less powerful) than the SAS language.<br />Summary. SPSS focuses on ease of use (their motto is "real stats, real easy", and it succeeds in this area. But if you intend to use SPSS as a power user, you may outgrow it over time. SPSS is strong in the area of graphics, but weak in more cutting edge statistical procedures lacking in robust methods and survey methods.<br /><br />Overall Summary<br /><br />Each package offers its own unique strengths and weaknesses. As a whole, SAS, Stata and SPSS form a set of tools that can be used for a wide variety of statistical analyses. With Stat/Transfer it is very easy to convert data files from one package to another in just a matter of seconds or minutes. Therefore, there can be quite an advantage to switching from one analysis package to another depending on the nature of your problem. For example, if you were performing analyses using mixed models you might choose SAS, but if you were doing logistic regression you might choose Stata, and if you were doing analysis of variance you might choose SPSS. If you are frequently performing statistical analyses, we would strongly urge you to consider making each one of these packages part of your toolkit for data analysis.<br /><br />http://www.biostat.cn/forum/viewthread.php?tid=92&amp;extra=page%3D1</font></u></span></span></a></td></tr></tbody></table></div></td></tr></tbody></table><img src ="http://www.cnitblog.com/sunnywang/aggbug/81604.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sunnywang/" target="_blank">sunnywang   </a> 2012-06-21 11:22 <a href="http://www.cnitblog.com/sunnywang/archive/2012/06/21/81604.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>exp\imp 导入导出命令使用</title><link>http://www.cnitblog.com/sunnywang/archive/2009/10/12/61771.html</link><dc:creator>sunnywang   </dc:creator><author>sunnywang   </author><pubDate>Mon, 12 Oct 2009 02:15:00 GMT</pubDate><guid>http://www.cnitblog.com/sunnywang/archive/2009/10/12/61771.html</guid><wfw:comment>http://www.cnitblog.com/sunnywang/comments/61771.html</wfw:comment><comments>http://www.cnitblog.com/sunnywang/archive/2009/10/12/61771.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/sunnywang/comments/commentRss/61771.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/sunnywang/services/trackbacks/61771.html</trackback:ping><description><![CDATA[<div class=storytext>使用方法<br>
<p>用exp命令导出表结构，不导出表数据。只需在命令行里加一个参数rows=n即可。表示不导出表数据。</p>
<p>exp <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#117;&#115;&#101;&#114;&#110;&#97;&#109;&#101;&#47;&#112;&#119;&#100;&#64;&#115;&#105;&#100;"><font color=#007799>username/pwd@sid</font></a> file=d:databak.dmp owner=(user)rows=n </p>
<p>
<p>********************************************************************************************************************</p>
<p><br>oracle exp/imp命令详解 <br>时间：2006-06-20 14:30:55 来源：Linux联盟收集 作者：上上智 <br>E:&gt;exp help=y</p>
<p>通过输入 EXP 命令和用户名/口令，您可以<br>在用户 / 口令之后的命令:</p>
<p>实例: EXP SCOTT/TIGER</p>
<p>或者，您也可以通过输入跟有各种参数的 EXP 命令来控制&#8220;导出&#8221;的运行方式。<br>要指定参数，您可以使用关键字:</p>
<p>格式: EXP KEYWORD=value 或 KEYWORD=(value1,value2,...,valueN)<br>实例: EXP SCOTT/TIGER GRANTS=Y TABLES=(EMP,DEPT,MGR)<br>或 TABLES=(T1: P1,T1: P2)，如果 T1 是分区表</p>
<p>USERID 必须是命令行中的第一个参数。</p>
<p>关键字 说明（默认）<br>---------------------------------------------------<br>USERID 用户名/口令<br>FULL 导出整个文件 (N)<br>BUFFER 数据缓冲区的大小<br>OWNER 所有者用户名列表<br>FILE 输出文件 (EXPDAT.DMP)<br>TABLES 表名列表<br>COMPRESS 导入一个范围 (Y)<br>RECORDLENGTH IO 记录的长度<br>GRANTS 导出权限 (Y)<br>INCTYPE 增量导出类型<br>INDEXES 导出索引 (Y)<br>RECORD 跟踪增量导出 (Y)<br>ROWS 导出数据行 (Y)<br>PARFILE 参数文件名<br>CONSTRAINTS 导出限制 (Y)<br>CONSISTENT 交叉表一致性<br>LOG 屏幕输出的日志文件<br>STATISTICS 分析对象 (ESTIMATE)<br>DIRECT 直接路径 (N)<br>TRIGGERS 导出触发器 (Y)<br>FEEDBACK 显示每 x 行 (0) 的进度<br>FILESIZE 各转储文件的最大尺寸<br>QUERY 选定导出表子集的子句</p>
<p>下列关键字仅用于可传输的表空间<br>TRANSPORT_TABLESPACE 导出可传输的表空间元数据 (N)<br>TABLESPACES 将传输的表空间列表</p>
<p><br>E:&gt;imp help=y</p>
<p>可以通过输入 IMP 命令和您的用户名/口令<br>跟有您的用户名 / 口令的命令:</p>
<p>实例: IMP SCOTT/TIGER</p>
<p>或者, 可以通过输入 IMP 命令和各种自变量来控制&#8220;导入&#8221;按照不同参数。<br>要指定参数，您可以使用关键字:</p>
<p>格式: IMP KEYWORD=value 或 KEYWORD=(value1,value2,...,vlaueN)<br>实例: IMP SCOTT/TIGER IGNORE=Y TABLES=(EMP,DEPT) FULL=N<br>或 TABLES=(T1: P1,T1: P2)，如果 T1 是分区表</p>
<p>USERID 必须是命令行中的第一个参数。</p>
<p>关键字 说明（默认） <br>----------------------------------------------<br>USERID 用户名/口令<br>FULL 导入整个文件 (N)<br>BUFFER 数据缓冲区大小<br>FROMUSER 所有人用户名列表<br>FILE 输入文件 (EXPDAT.DMP)<br>TOUSER 用户名列表<br>SHOW 只列出文件内容 (N)<br>TABLES 表名列表<br>IGNORE 忽略创建错误 (N)<br>RECORDLENGTH IO 记录的长度<br>GRANTS 导入权限 (Y)<br>INCTYPE 增量导入类型<br>INDEXES 导入索引 (Y)<br>COMMIT 提交数组插入 (N)<br>ROWS 导入数据行 (Y)<br>PARFILE 参数文件名<br>LOG 屏幕输出的日志文件<br>CONSTRAINTS 导入限制 (Y)<br>DESTROY 覆盖表空间数据文件 (N)<br>INDEXFILE 将表/索引信息写入指定的文件<br>SKIP_UNUSABLE_INDEXES 跳过不可用索引的维护 (N)<br>ANALYZE 执行转储文件中的 ANALYZE 语句 (Y)<br>FEEDBACK 显示每 x 行 (0) 的进度<br>TOID_NOVALIDATE 跳过指定类型 id 的校验<br>FILESIZE 各转储文件的最大尺寸<br>RECALCULATE_STATISTICS 重新计算统计值 (N)</p>
<p>下列关键字仅用于可传输的表空间<br>TRANSPORT_TABLESPACE 导入可传输的表空间元数据 (N)<br>TABLESPACES 将要传输到数据库的表空间<br>DATAFILES 将要传输到数据库的数据文件<br>TTS_OWNERS 拥有可传输表空间集中数据的用户</p>
<p>
<p>***************************************************************<br>Oracle exp/imp导出导入工具的使用 </p>
<p>一. 导出工具 exp</p>
<p>1. 它是操作系统下一个可执行的文件 存放目录/ORACLE_HOME/bin</p>
<p>exp导出工具将数据库中数据备份压缩成一个二进制系统文件.可以在不同OS间迁移<br><br>它有三种模式：<br>a. 用户模式： 导出用户所有对象以及对象中的数据；<br>b. 表模式： 导出用户所有表或者指定的表；<br>c. 整个数据库： 导出数据库中所有对象。</p>
<p>2. 导出工具exp交互式命令行方式的使用的例子<br>$exp <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#111;&#97;&#49;&#47;&#49;&#50;&#51;&#64;&#111;&#114;&#97;&#99;&#108;&#101;"><font color=#007799>oa1/123@oracle</font></a><br>连接到: Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Production<br>With the Partitioning, OLAP and Data Mining options<br>输入数组提取缓冲区大小: 4096 &gt;</p>
<p>导出文件: EXPDAT.DMP &gt; D:/a.dmp</p>
<p>(2)U(用户), 或 (3)T(表): (2)U &gt; 3</p>
<p>导出表数据 (yes/no): yes &gt; yes</p>
<p>压缩区 (yes/no): yes &gt;</p>
<p>已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集</p>
<p>即将导出指定的表通过常规路径...<br>要导出的表 (T) 或分区 (T: P): (按 RETURN 退出) &gt; pfdept</p>
<p>. . 正在导出表 PFDEPT导出了 83 行<br>要导出的表 (T) 或分区 (T: P): (按 RETURN 退出) &gt;return<br>导出成功终止, 但出现警告。</p>
<p>3. 导出工具exp非交互式命令行方式的例子<br>$exp <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#111;&#97;&#49;&#47;&#49;&#50;&#51;&#64;&#111;&#114;&#97;&#99;&#108;&#101;"><font color=#007799>oa1/123@oracle</font></a> file=D:/all.dmp grants=y</p>
<p>说明:把oa1用户的所有表导出到文件D:/all.dmp</p>
<p>$exp <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#111;&#97;&#49;&#47;&#49;&#50;&#51;&#64;&#111;&#114;&#97;&#99;&#108;&#101;"><font color=#007799>oa1/123@oracle</font></a> tables=(pfdept,pfuser) file=D:/all.dmp grants=y</p>
<p>说明:把oa1用户里两个表emp,dept导出到文件D:/all.dmp </p>
<p>$exp <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#111;&#97;&#49;&#47;&#49;&#50;&#51;&#64;&#111;&#114;&#97;&#99;&#108;&#101;"><font color=#007799>oa1/123@oracle</font></a> tables=pfdept query="where predeptid=0745" file=D:/all.dmp</p>
<p>说明:在exp里面加上导出pfdept 的查询条件predeptid=0745</p>
<p>$exp parfile=username.par file=/directory1/username_1.dmp,/directory1/username_2.dmp filesize=2000M log=/directory2/username_exp.log</p>
<p>参数文件username.par内容<br>userid=username/userpassword<br>buffer=8192000<br>compress=n<br>grants=y</p>
<p>说明:username.par为导出工具exp用的参数文件,里面具体参数可以根据需要去修改</p>
<p>filesize指定生成的二进制备份文件的最大字节数<br>二.导入工具 imp</p>
<p>1. 它是操作系统下一个可执行的文件 存放目录/ORACLE_HOME/bin</p>
<p>imp导入工具将EXP形成的二进制系统文件导入到数据库中.</p>
<p>它有三种模式：<br>a. 用户模式： 导出用户所有对象以及对象中的数据；<br>b. 表模式： 导出用户所有表或者指定的表；<br>c. 整个数据库： 导出数据库中所有对象。<br><br>只有拥有IMP_FULL_DATABASE和DBA权限的用户才能做整个数据库导入<br><br>imp步骤：<br>(1) create table (2) insert data (3) create index (4) create triggers,constraints</p>
<p>2.导入工具imp交互式命令行方式的例子<br>$ imp<br>Import: Release 10.1.0.2.0 - Production on 星期一 9月 3 08:21:32 2007<br>Copyright (c) 1982, 2004, Oracle. All rights reserved.<br>用户名: system<br>口令:****<br>连接到: Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Production<br>With the Partitioning, OLAP and Data Mining options<br>导入文件: expdat.dmp&gt; D:/all.dmp<br>输入插入缓冲区大小（最小为 8192 ) 30720&gt;<br>经由常规路径导出由EXPORT:V08.01.06创建的文件<br>警告: 此对象由 TEST 导出, 而不是当前用户<br>已经完成ZHS16GBK字符集和ZHS16GBK NCHAR 字符集中的导入<br>只列出导入文件的内容(yes/no)：no&gt;<br>由于对象已存在, 忽略创建错误(yes/no)：no&gt; yes<br>导入权限(yes/no)：yes&gt;<br>导入表数据(yes/no)：yes&gt;<br>导入整个导出文件(yes/no)：no&gt; yes<br>. 正在将TEST的对象导入到 SCOTT<br>. . 正在导入表 "CMAMENU" 4336行被导入<br>成功终止导入，但出现警告。 <br>3.导入工具imp非交互式命令行方式的例子</p>
<p>$ imp system/oracle fromuser=oa1 tables=(pfdept) <br>$ imp system/oracle fromuser=oa1 tables=(pfdept,pfuser) <br>$ imp system/oracle fromuser=oa1 touser=system<br>$ imp oa1/123 file = all.dmp full=y <br>$ imp oa1/123 file = all.dmp show=n buffer=2048000 ignore=n commit=y grants=y full=y log=D:/.log<br>$ imp oa1/123 parfile=params.dat <br>params.dat 内容 <br>file=dba.dmp show=n ignore=n grants=y fromuser=oa1 tables=(pfdept,pfuser) </p>
<p>4.导入工具imp可能出现的问题</p>
<p>(1) 数据库对象已经存在<br>一般情况, 导入数据前应该彻底删除目标数据下的表, 序列, 函数/过程,触发器等; <br>数据库对象已经存在, 按缺省的imp参数, 则会导入失败<br>如果用了参数ignore=y, 会把exp文件内的数据内容导入<br>如果表有唯一关键字的约束条件, 不合条件将不被导入<br>如果表没有唯一关键字的约束条件, 将引起记录重复</p>
<p>(2) 数据库对象有主外键约束<br>不符合主外键约束时, 数据会导入失败 <br>解决办法: 先导入主表, 再导入依存表<br>disable目标导入对象的主外键约束, 导入数据后, 再enable它们<br>(3) 权限不够<br>如果要把A用户的数据导入B用户下, A用户需要有imp_full_database权限</p>
<p>(4) 导入大表( 大于80M ) 时, 存储分配失败<br>默认的EXP时, compress = Y, 也就是把所有的数据压缩在一个数据块上.<br>导入时, 如果不存在连续一个大数据块, 则会导入失败.<br>导出80M以上的大表时, 记得compress= N, 则不会引起这种错误.</p>
<p>(5) imp和exp使用的字符集不同<br>如果字符集不同, 导入会失败, 可以改变unix环境变量或者NT注册表里NLS_LANG相关信息.<br>导入完成后再改回来.</p>
<p>(6) imp和exp版本不能往上兼容<br>imp可以成功导入低版本exp生成的文件, 不能导入高版本exp生成的文件<br>根据情况我们可以用</p>
<p>&#160;</p>
</div>
<img src ="http://www.cnitblog.com/sunnywang/aggbug/61771.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sunnywang/" target="_blank">sunnywang   </a> 2009-10-12 10:15 <a href="http://www.cnitblog.com/sunnywang/archive/2009/10/12/61771.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>exp 导出实例</title><link>http://www.cnitblog.com/sunnywang/archive/2009/10/12/61770.html</link><dc:creator>sunnywang   </dc:creator><author>sunnywang   </author><pubDate>Mon, 12 Oct 2009 02:12:00 GMT</pubDate><guid>http://www.cnitblog.com/sunnywang/archive/2009/10/12/61770.html</guid><wfw:comment>http://www.cnitblog.com/sunnywang/comments/61770.html</wfw:comment><comments>http://www.cnitblog.com/sunnywang/archive/2009/10/12/61770.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/sunnywang/comments/commentRss/61770.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/sunnywang/services/trackbacks/61770.html</trackback:ping><description><![CDATA[<div class=storytext>
<p>导入的时候总是出现警告</p>
<p>
<p>C:Documents and SettingsAaron&gt;exp <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#115;&#121;&#115;&#116;&#101;&#109;&#47;&#109;&#97;&#110;&#97;&#103;&#101;&#114;&#64;&#112;&#114;&#111;&#100;"><u><font color=#0000ff>system/manager@prod</font></u></a> tables=GL.GL_balanceS<br>query=" where period_name='2009-07'" file=D:/EXP/GL_balanceS.dmp grants=y</p>
<p>
<p>Export: Release 10.2.0.1.0 - Production on Mon Aug 10 17:12:16 2009</p>
<p>Copyright (c) 1982, 2005, Oracle. All rights reserved.</p>
<p><br>Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit<br>Production<br>With the Partitioning, OLAP and Data Mining options<br>Export done in ZHS16GBK character set and AL16UTF16 NCHAR character set</p>
<p>About to export specified tables via Conventional Path ...<br>Current user changed to GL<br>. . exporting table GL_BALANCES 3710 rows exported<br>EXP-00091: Exporting questionable statistics.<br>EXP-00091: Exporting questionable statistics.<br>EXP-00091: Exporting questionable statistics.<br>EXP-00091: Exporting questionable statistics.<br>EXP-00091: Exporting questionable statistics.<br>Export terminated successfully with warnings.</p>
<br>
<p>exp <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#97;&#112;&#112;&#115;&#47;&#97;&#112;&#112;&#115;&#64;&#112;&#114;&#111;&#100;"><u><font color=#0000ff>apps/apps@prod</font></u></a> tables=GL.GL_JE_BATCHES query="where actual_flag='A' and creation_date&gt;=sysdate-5" file=D:/EXP/GL_JE_BATCHES.dmp grants=y</p>
<p>exp <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#115;&#121;&#115;&#116;&#101;&#109;&#47;&#109;&#97;&#110;&#97;&#103;&#101;&#114;&#64;&#112;&#114;&#111;&#100;"><u><font color=#0000ff>system/manager@prod</font></u></a> tables=GL.GL_JE_BATCHES query="where actual_flag='A' and creation_date&gt;=sysdate-5" file=D:/EXP/GL_JE_BATCHES.dmp grants=y</p>
<p>exp <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#115;&#121;&#115;&#116;&#101;&#109;&#47;&#109;&#97;&#110;&#97;&#103;&#101;&#114;&#64;&#112;&#114;&#111;&#100;"><u><font color=#0000ff>system/manager@prod</font></u></a> tables=GL.GL_JE_headerS query="where actual_flag='A' and creation_date&gt;=sysdate-5" file=D:/EXP/GL_JE_headerS.dmp grants=y</p>
<p>exp <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#115;&#121;&#115;&#116;&#101;&#109;&#47;&#109;&#97;&#110;&#97;&#103;&#101;&#114;&#64;&#112;&#114;&#111;&#100;"><u><font color=#0000ff>system/manager@prod</font></u></a> tables=GL.GL_JE_LINES query=" where creation_date&gt;=sysdate-5" file=D:/EXP/GL_JE_LINES.dmp grants=y<br>exp <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#115;&#121;&#115;&#116;&#101;&#109;&#47;&#109;&#97;&#110;&#97;&#103;&#101;&#114;&#64;&#112;&#114;&#111;&#100;"><u><font color=#0000ff>system/manager@prod</font></u></a> tables=GL.GL_SETS_OF_BOOKS file=D:/EXP/GL_SETS_OF_BOOKS.dmp grants=y</p>
<p>exp <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#115;&#121;&#115;&#116;&#101;&#109;&#47;&#109;&#97;&#110;&#97;&#103;&#101;&#114;&#64;&#112;&#114;&#111;&#100;"><u><font color=#0000ff>system/manager@prod</font></u></a> tables=GL.GL_PERIODS query="where period_name = '2009-07'" file=D:/EXP/GL_PERIODS.dmp grants=y</p>
<p>exp <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#115;&#121;&#115;&#116;&#101;&#109;&#47;&#109;&#97;&#110;&#97;&#103;&#101;&#114;&#64;&#112;&#114;&#111;&#100;"><u><font color=#0000ff>system/manager@prod</font></u></a> tables=GL.GL_CODE_COMBINATIONS query=" where summary_flag='N'" file=D:/EXP/GL_CODE_COMBINATIONS.dmp grants=y</p>
<p>exp <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#115;&#121;&#115;&#116;&#101;&#109;&#47;&#109;&#97;&#110;&#97;&#103;&#101;&#114;&#64;&#112;&#114;&#111;&#100;"><u><font color=#0000ff>system/manager@prod</font></u></a> tables=GL.GL_balanceS query=" where period_name='2009-07'" file=D:/EXP/GL_balanceS.dmp grants=y</p>
<br>-------------------------------------------------<br>
<div class=storytext>
<p>解決EXP-00091的方法<br>對一個DBA或需使用exp,imp的普通用戶來說，在我們做exp的過程中可能經常會遇到EXP－00091 Exporting questionable statistics.這樣的EXP信息，其實它就是exp的error message，它產生的原因是因為我們exp工具所在的環境變量中的NLS_LANG與DB中的NLS_CHARACTERSET不一致。但需說明的是，exp-91這個error message對所生成的dump檔沒有影響，生成的dump檔還可以正常的imp（個人體會，不知道有沒有<br>錯），雖然它對我們的dump檔沒有影響，我個人還是不想它出現，大家也有同感吧， 。。下面我們就讓它消失吧</p>
<p>step 01 查看DB中的NLS_CHARACTERSET的值（提供兩種方法）：<br>select * from nls_database_parameters t where<br>t.parameter='NLS_CHARACTERSET'<br>or<br>select * from v$nls_parameters where<br>parameter='NLS_CHARACTERSET';<br>SQL&gt; select * from v$nls_parameters where<br>parameter='NLS_CHARACTERSET';<br>PARAMETER VALUE<br>----------------------- -------------------------<br>---------------------<br>NLS_CHARACTERSET ZHT16BIG5 </p>
<p>step 02 根據step 01查出的NLS_CHARACTERSET（ZHT16BIG5）來設定<br>exp的環境變量： </p>
<p>WINNT&gt; set NLS_LANG=AMERICAN_AMERICA.ZHT16BIG5<br>LINUX&gt; export NLS_LANG=AMERICAN_AMERICA.ZHT16BIG5</p>
</div>
<br></div>
<img src ="http://www.cnitblog.com/sunnywang/aggbug/61770.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sunnywang/" target="_blank">sunnywang   </a> 2009-10-12 10:12 <a href="http://www.cnitblog.com/sunnywang/archive/2009/10/12/61770.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据仓库工作总结（转）</title><link>http://www.cnitblog.com/sunnywang/archive/2009/10/10/61749.html</link><dc:creator>sunnywang   </dc:creator><author>sunnywang   </author><pubDate>Sat, 10 Oct 2009 03:44:00 GMT</pubDate><guid>http://www.cnitblog.com/sunnywang/archive/2009/10/10/61749.html</guid><wfw:comment>http://www.cnitblog.com/sunnywang/comments/61749.html</wfw:comment><comments>http://www.cnitblog.com/sunnywang/archive/2009/10/10/61749.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnitblog.com/sunnywang/comments/commentRss/61749.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/sunnywang/services/trackbacks/61749.html</trackback:ping><description><![CDATA[&nbsp;
<h2>数据仓库工作总结(转)</h2>
<div class=t_msgfont id=postmessage_5379>1.&nbsp; &nbsp;概述 <br><br>本文作为我这些年实施<span class=t_tag onclick=tagshow(event) href="tag.php?name=%CA%FD%BE%DD%B2%D6%BF%E2">数据仓库</span>的总结，如有错误，请各位同仁指正。<br>文档条理不是很清楚，而且也有很多口水话，我不想搞成一个真正的官方文档，所以很随意，符合我的性格。很多问题我只是提出来了，解决<span class=t_tag onclick=tagshow(event) href="tag.php?name=%B7%BD%B0%B8">方案</span>没有想好，也不知道怎么落到文字，就先提出来备注吧。<br>文档原本想讨论的<span class=t_tag onclick=tagshow(event) href="tag.php?name=%D4%AA%CA%FD%BE%DD">元数据</span>管理、<span class=t_tag onclick=tagshow(event) href="tag.php?name=%CA%FD%BE%DD%D6%CA%C1%BF">数据质量</span>和监控工具的内容，由于时间关系，没有添加，以后有空补上吧。<br>1.1.阅读方法<br><br>本文阅读方式:<br>1、 如果你认为本节没有意义，请将第二节作为第一节。<br>2、 如果你觉得第二节没有意义，请将第三节作为第一节。<br>3、 归纳：如果你觉得第X节没有意义，请将X+1节作为第一节。<br>4、 如果你觉得整个文档都没有意义，恭喜你，你打开了一个无用的文档。<br><br>1.2.感谢<br>(这段应该好好写)<br>谢谢党和国家给我这么一个大环境，让我可以安居，让我可以娶妻生子，更重要的是让我可以在**的光辉下茁壮成长。<br>感谢那些给我无穷压力也被我无数次暗骂的客户们：贵州联通、广西联通、云南联通、重庆移动、江西移动、浙江移动、吉林移动、天津<span class=t_tag onclick=tagshow(event) href="tag.php?name=%B5%E7%D0%C5">电信</span>、河北移动、山东移动。没有他们的刻薄，我也无法作出这个东西。<br>感谢我的妻子，忍受我长期的出差，更重要的是对我职业选择的包容和理解。<br><br>2.&nbsp; &nbsp;定义<br>2.1.定义的混淆<br>和客户交流的时候开始的第一个麻烦可能就是数据仓库的概念问题，怎么看怎么觉得&#8220;数据仓库&#8221;应该是一个实体概念，但是实际数据仓库只是一个过程，而不是一个产品。过程就是计划如何工作的单元，而不是实际工作的单元。<br>数据仓库是这么定义的：数据仓库是在企业管理和决策中面向主题的、集成的、与时间相关的、不可修改的数据集合。<br>这个定义中有一个定义比较容易含混，那就是&#8220;面向主题&#8221;。面向主题是指数据仓库围绕一些主题,排除对于决策无用的数据,提供特定主体的简明视图。近年提出的&#8220;面向专题&#8221;的分析和这个概念混淆的厉害，只能用用户熟悉的业务才能作出解释。<br>以下列出几个概念，备查：<br>BI：<span class=t_tag onclick=tagshow(event) href="tag.php?name=%C9%CC%D2%B5%D6%C7%C4%DC">商业智能</span>（Business Intelligence）,指数据仓库相关技术与应用的通称。指利用各种智能技术，来提升企业的商业竞争力。<br>BPR:业务流程重整（Business Process Reengineering）,指利用数据仓库技术，发现并纠正企业业务流程中的弊端的一项工作。数据仓库的重要作用之一。<br>OLAP<br>定义1 ：OLAP(联机分析处理)是针对特定问题的联机数据访问和分析。通过对信息(维数据)的多种可能的观察形式进行快速、稳定一致和交互性的存取，允许管理决策人员对数据进行深入观察。<br><br>定义2 ：OLAP(联机分析处理) 是使分析人员、管理人员或执行人员能够从多种角度对从原始数据中转化出来的、能够真正为用户所理解的、并真实反映企业维特性的信息进行快速、一致、交互地存取，从而获得对数据的更深入了解的一类软件技术。(OLAP委员会的定义)<br><br>OLAP的目标是满足<span class=t_tag onclick=tagshow(event) href="tag.php?name=%BE%F6%B2%DF%D6%A7%B3%D6">决策支持</span>或**环境特定的查询和<span class=t_tag onclick=tagshow(event) href="tag.php?name=%B1%A8%B1%ED">报表</span>需求，它的技术核心是&#8220;维&#8221;这个概念，因此OLAP也可以说是**数据分析工具的集合。<br>ROLAP:基于关系型<span class=t_tag onclick=tagshow(event) href="tag.php?name=%CA%FD%BE%DD%BF%E2">数据库</span>的OLAP称为Relational OLAP，简称ROLAP。代表产品有Informix Metacube、<span class=t_tag onclick=tagshow(event) href="tag.php?name=Microsoft">Microsoft</span> SQL Server<br>MOLAP(MuiltDimension OLAP):严格遵照Codd的定义，自行建立**数据库，来存放联机分析系统数据,简称MOLAP，代表产品有Hyperion Essbase等。 <br>HOLAP:混合OLAP。<br>Server OLAP:数据在服务器端处理<br>Client OLAP:部分数据下载到本地，为用户提供本地的**分析。代表产品有Brio Designer, Business Object.<br><br>2.2.数据仓库能给客户带来什么？<br><br>客户的第二个问题就是，数据仓库能够给客户带来什么？或者说为什么使用数据仓库。还是一个比较难以回答的问题。<br>一般数据仓库的入门指导的开篇都会有这么一个论调，这个论调基本集中在数据存储的周期、数据存储容量、数据响应性能以及对在线事务系统(OLTP)的压力的问题。<br>但是单纯这一点就足以说服客户么？(插一句，我不管商务怎么去谈的单子，我只说怎么面对客户的刁难。)以上提出的论调肯定客户也了解的。原因很简单，有一点用心的客户都会事先进行相关资料的查阅。<br><span style="COLOR: red">我对于&#8220;实用&#8221;这个词比较敏感，</span>我想在介绍数据仓库的时候更多的关切到用户的实际需求去谈可能效果会更好。<br>有一家公司的仁兄去讲他的<span class=t_tag onclick=tagshow(event) href="tag.php?name=PPT">PPT</span>的时候，前面有好十好几张都是数据仓库的理论知识，这个家伙上台打开<span class=t_tag onclick=tagshow(event) href="tag.php?name=PPT">PPT</span>就说&#8220;我们主要讲业务，前面的都是理论，我一张张念完就行了，大家如果有兴趣自己回去翻阅&#8221;。有点门道吧？客户面对的厂商不见得比我们面对的客户少，老听这些，客户自己都能讲出个123来——虽然还不知道怎么去玩转这个东西。<br>换个角度来看，客户被灌输的这方面理论已经不少，数据仓库难讲就在于没有一个直观的东西（整个快速原型？如果公司有那么多资源或者以前实施过倒也问题不大。），很多东西都隐藏在实施中，留给客户的就是一堆文字描述，客户被搞得头昏，自己也说得嘴巴乏味。<br>一个假设，如果客户有一台超级强悍的主机，已经有一个非常稳定的在线系统，而且更要命的是客户已经在这台主机上实现了一个快速响应的报表系统。你如何说服客户使用数据仓库？使用这种技术意味着客户会为移动数据、数据准确性甚至为多了的主机操心。我只是想提醒一下，不是任何时候都需要建立一个数据仓库的。如果在这个环境中，更多的工作可能是集中在数据仓库的实用价值之上。<br>所幸的是，托硬件厂商的福。我们现在还没有拥有这样的主机。所以现实情况中的种种不如意还是值得说道说道。<br>2.3.就是一个复杂的报表系统<br>回到刚才的问题，数据仓库是什么？<br>有次我们做经营分析系统的操作<span class=t_tag onclick=tagshow(event) href="tag.php?name=%C5%E0%D1%B5">培训</span>完后，酒席上一位地市分公司的负责人说了一句&#8220;你们经营分析系统搞了这么久，不就是一个复杂的报表系统么?&#8221;。<br>的确，他说的是实话，一个复杂的报表系统的确是数据仓库应用的表征。<br>如果要试着向客户解释那么一套什么持久啊时间啊存储时限啊企业级啊之类的概念，那么这个问题你还是会输掉。一个复杂的报表系统（大型客户所使用的报表系统基本都是）底层基本也是按照数据仓库的这几个流程走的，只是规模较小、流程不规范而已。<br>如果这时客户再问，&#8220;我现在的报表系统为什么不能称为数据仓库应用？&#8221;，这下应该苦笑了。<br>数据仓库对于非技术人员，本身就是一个复杂的报表系统，所有后台的操作最终目的都是为了呈现结果给客户，所以这么说一点也没错。认同这一点有点不容易，甚至有些令人泄气。但是事实就是如此，数据仓库除了报表还能给用户什么？<br>不要说决策支持之类虚无的东西，一个例子，上月商店销售的鞋子是去年同期的130％，而且Nike的鞋子销量上升最快，你觉得数据仓库应该提出什么样的建议？<br>用现在的技术和实施过程去忽悠&#8220;决策支持&#8221;的概念显然不是很合适，还是多说点&#8220;你能看到&#8221;、&#8220;也许你可以&#8221;这样不咸不淡的口水话比较安全。毕竟，我们当前几乎所有的数据仓库还停留在数据积累层面（说&#8220;信息&#8221;可能比较好听），离&#8220;知识&#8221;的范畴还是太远。<br>问题在于，如何适当的向客户描述数据仓库报表和普通报表系统的不同。如果能够解决这个问题，应该来说客户关系也可以弄的不错。<br>最后顺便说一点不中听的，前期的销售策略引导下的忽悠最终会忽悠到自己的技术实现层面。<br><br>2.4.客户关心的ROI<br><br>首先我不想争论到底是投资回报率（Return of Investment）好还是内部收益率（IRR：Internal rate of return）或者投资回报周期(PP<img alt="" src="http://bbs.bihuman.com/bbs/images/smilies/default/tongue.gif" border=0 smilieid="7">ayback Period) 对于项目的收益分析更加合理，毕竟我对这些概念也是一知半解。<br>IDC2002年发布的消息说，经过他们的调查，全球数据仓库的ROI高达401％。这个数字有零有整，还冲着IDC的名头，可信度很高。难怪这么些年数据仓库这么火，大家都在简历上似是而非的整上一个星星。<br>但是到现在为止，我还没有看过一份完整的数据仓库的收益分析报告，所以我不明白那些东西怎么出来的。技术人员和这些术语打交道的时间很少，但是不是绝对没有。就拿电信行业来说，总部批准建设数据仓库项目，所有费用拨下来了，怎么花这些费用不是总部的政策能够完全左右的，所以在技术交流的时候肯定会问道一些相关的问题。<br>分析就需要一个度量标准，这个东西学数学或者数学学的比我好的人都能捣腾一个出来，我不能。我只能从表象看问题。<br>开支是比较容易评估的，一个数据仓库系统的搭建所需要的物力是物化的，报价单上左右也就那个Discount。然后是人力成本，我一直认为软件技术人员是比较感性的，最近看了部分这方面的资料，大致能够理解如何去把这些感性转换为理性的数据。那么，开支基本物化了，软件费用加硬件费用就是开支。<br>收益如何去评估？我们怎么量化下面几个项目？<br>l 更快的访问到数据<br>l 更加可靠的报表<br>l 更灵活的数据展示<br>&nbsp; &nbsp;&nbsp; &nbsp; 如果不能收集相关的客户方的数据，也只能忽悠了。<br><br>3.&nbsp; &nbsp;项目组成和实施<br>老大们这个方面都比我厉害，我就随便扯几句。<br>其实很多企业还没有成熟到一下子就可以上到数据仓库的层面，如果企业还是单纯把数据仓库作为数据呈现的工具，也就是所谓的报表系统，基本可以确定当前建设一套完善的报表系统就可以满足需求。<br>数据仓库的建设应该是从建设短平快的数据集市开始，各个企业内部的业务部门使用这些数据集市完成自己的需求磨合，然后才把数据集市提升到企业级别的数据仓库。<br>遗憾的是，很多数据仓库项目都是很仓促拍板，仓促施工，完成之后用户发现自己所需要的数据不能取得或者取得的操作比较麻烦，长期积累的用户怨气可能导致整个项目的崩溃，还可能直接导致重建，有点应验<span class=t_tag onclick=tagshow(event) href="tag.php?name=IBM">IBM</span>的那句让人很不痛快的话&#8220;系统建设的第一个模型是拿来扔掉的&#8221;。<br><br><span style="COLOR: red">3.1.风险</span><br>数据仓库建设主要有几个风险，技术风险、业务风险和项目管理风险。<br>3.1.1.&nbsp; &nbsp; 技术风险<br>不懂的技术，不知道怎么搭建系统；懂得了技术，却束手束脚，不知道如何伸展，这些都是技术风险的一个方面。<br>技术风险虽然比较严重，补足的手段和方法也比较容易：<br>3.1.1.1.&nbsp; &nbsp;&nbsp; &nbsp; 老人带新人<br>经验部分是可以传输和传授的，有经验的技术人员可以带新的技术人员。<br>3.1.1.2.&nbsp; &nbsp;&nbsp; &nbsp; 使用熟悉的工具<br>尽量使用大家都比较熟悉的开发工具。这点多说一点，2001年我参加的一个项目，就是因为公司在大部分人知道或者熟悉Visual C++的前提下决定使用C++ Builder开发，导致工期拖延，项目中的成员也苦不堪言。<br>3.1.1.3.&nbsp; &nbsp;&nbsp; &nbsp; 避免使用未经证明的技术<br>说起来有点骄傲，我2000年参加的项目是世界上第一个使用JAVA开发的电信级的应用，那个项目施工中得到了Sun和Bea很多的资源，他们建了一个专门的实验室来支撑这个项目，但是结果不是很令人满意（幸好计费没有用JAVA），这就发生了上面工具的那一幕。<br>3.1.1.4.&nbsp; &nbsp;&nbsp; &nbsp; 多做概念<span class=t_tag onclick=tagshow(event) href="tag.php?name=%B2%E2%CA%D4">测试</span><br>对关键技术进行预先测试以满足需求。现在贵州有家公司使用SQLServer2000作为数据库支撑整个贵州联通的业务，但是由于前期技术测试不过关，现在全省话单压下来，系统每天需要全负荷运转7个小时才能出最底层的汇总数据，前车之鉴啊。<br>3.1.1.5.&nbsp; &nbsp;&nbsp; &nbsp; 设计复查，增加项目理解<br>做前端开发的人员了解多少后台的东西？Cube数据从什么地方到什么地方？这些问题在整个数据仓库系统中多少人能够掌握？这点有个公司做的不错，每周整个项目的人作个设计的review，在这个<span class=t_tag onclick=tagshow(event) href="tag.php?name=%BB%E1%D2%E9">会议</span>上各个小组描述自己的工作，其他小组的可以提出自己的意见和建议，各个小组对项目的理解加深了，对自己的接口更加有信心了。<br>3.1.2.&nbsp; &nbsp; 业务风险<br>业务风险最基本的就是系统开发出来和预期不一致，甚至系统根本没有人使用。<br>避免业务风险可以使用下面的方法。<br>3.1.2.1.&nbsp; &nbsp;&nbsp; &nbsp; 用户参与开发设计<br>说实话，做到这点真的比较难，只能部分做到。如果让客户参与到开发和设计中对系统业务理解和业务把握是非常有益的。<br>如果参与的是客户方的技术人员，需要注意的是技术人员的优点是理解系统比较容易，对于系统施工中的难度也能很快掌握，但是缺点是协调能力比较差，很少有技术人员能够顶住上头的压力，这点需要在开发过程中注意<br>3.1.2.2.&nbsp; &nbsp;&nbsp; &nbsp; 注重推广和应用<br>培训是推广的一个重要手段，不断的收集用户反馈也是一个很重要的渠道。<br>3.1.3.&nbsp; &nbsp; 项目管理风险<br>即使开发团队采取了正确的技术，并正常地使用了它，但还是存在不能按时或按预算完成工程的开发和实施。可以通过如下的手段来克服这种风险：<br>3.1.3.1.&nbsp; &nbsp;&nbsp; &nbsp; 明晰的计划<br>项目初期的计划制定非常重要，整个计划指导项目的施工，这点老大们比我有心得，我就不班门弄斧了。<br>PS：我在这里提出这个来，但是自己做的很弱，很惭愧。<br>3.1.3.2.&nbsp; &nbsp;&nbsp; &nbsp; 管理方法<br>一个强大的方[已经隐藏]起到工程管理和工程团队路标的作用，指导开发人员如何前进。（这不是我说的，我说话的风格不是这样）。<br>3.1.3.3.&nbsp; &nbsp;&nbsp; &nbsp; 需求变更控制<br>这点不用多说了。<br><br><span style="COLOR: red">3.2.开发团队构建<br></span>以下是数据仓库团队建设的几个部分。<br><br>3.2.1.&nbsp; &nbsp; 项目经理<br>项目经理作为整个项目中的灵魂人物，项目成败的关键，简单说手中掌控项目的生死成败。项目经理不一定是技术的专家，但必须理解和检查项目的每个细节，并知道关键路径在那里，以及如何引导项目前进。<br>应该应具备的能力：<br>l 有效计划和分配资源。<br>l 团结并激励整个团队并使其保持和谐。<br>l 善于与客户沟通。这点比较重要，我和我的前任都被客户说过&#8220;沟通不畅&#8221;，主要是公司政策和项目实施之间的权衡。<br>l 善于控制项目规模<br>l 进行风险管理<br>l 定期评定项目开发成果并评估每个人员<br>l 敢于承认失败并把项目带回正轨<br><br>3.2.2.&nbsp; &nbsp; 业务系统顾问<br>与比最终用户相比他能从更全面的角度来衡量业务，并能从某些技术的角度提供些建议。<br>应具备能力：<br>l 相关业务经验比最终用户还要丰富<br>l 了解行业的标准及发展趋势<br>l 了解数据仓库的一些技术实现<br>l 善于将业务转化为技术人员所能接受的语言<br><br>3.2.3.&nbsp; &nbsp; 模型<span class=t_tag onclick=tagshow(event) href="tag.php?name=%B9%A4%B3%CC%CA%A6">工程师</span><br>应具备的能力：<br>l 分析并引导用户的需求<br>l 对数据库的范式和星型结构熟练运用<br>l 设计系统的ER图和数据字典如属性、约束等<br>l 善于沟通，能把项目的设计<span class=t_tag onclick=tagshow(event) href="tag.php?name=%BC%DC%B9%B9">架构</span>清晰的告诉别人<br>l 熟悉RDBMS并有良好商业分析能力<br><br>3.2.4.&nbsp; &nbsp; 最终用户<br>最终用户作为需求的提出者参与项目是因为最终用户对相关业务比项目中任何成员都了解。与这些人搞好关系，因为他们往往也是项目的验收者。<br>参与项目的最终用户应具备的能力:<br>l 必须对原有系统和业务有深入了解。<br>l 必须明确项目的成败和他个人关系紧密。<br>l 让他明确知道和理解你的项目会为他的日常工作带来便利，并且有责任和义务传达这个讯息给他的同事和领导。<br>l 有权限协调其他相关系统的资源配备。<br>l 必须明确参与项目的最终用户中的某一位是需求的最终出口。<br><br>3.2.5.&nbsp; &nbsp; DBA<br>DBA负责数据的最终存储、数据库的<span class=t_tag onclick=tagshow(event) href="tag.php?name=%D3%C5%BB%AF">优化</span>以及数据库授权。<br>应具备能力：<br>l 强的数据库技能。<br>l 能够实现逻辑模型向物理模型的转换。<br>l 监视对数据的访问和数据库的性能并及时调整。<br>l 协助<span class=t_tag onclick=tagshow(event) href="tag.php?name=ETL">ETL</span>工程师保证其数据加载成功。<br>l 制定整体的数据更新和维护策略或方案。<br><br>3.2.6.&nbsp; &nbsp; ETL工程师<br>作为数据仓库中的搬运工，这个职位最是辛苦。其工作决定了数据仓库项目的可用性和后期维护量。<br>应具备的能力:<br>l 深入了解现有系统，并理解系统内数据存储。<br>l 熟悉业务知识，了解业务逻辑。<br>l 熟悉接口和规范。<br>l 有很强的编码和开发能力。<br>l 应该是一个认真仔细并很有耐心的人，脏数据对系统的影响往往能超出一的想象。<br>3.2.7.&nbsp; &nbsp; 前端工程师<br>提供数据的最终展现，应该具备的能力：<br>n 审美能力，知道如何设计好的展现<br>n 用户沟通能力，系统搭建后期数据问题完成之后就是界面的问题了。<br>n 了解用户操作习惯。<br>n 还是需要有耐心，很多中国特色是折磨人。<br><br>3.2.8.&nbsp; &nbsp; 培训工程师<br>其工作的重要性每个人都知道，如果不把用户教会你完成的项目有什么意义呢?<br>应具备能力：<br>l 有优秀的交流技巧和无限的耐力。<br>l 具备数据仓库各技术环节和用户业务的相关知识。<br>l 编写出色的培训教材和演示文文档。<br>l 积极乐观的态度，笑容是具有传染力的。<br><br><strong>4.&nbsp; &nbsp;数据抽取层</strong><br>数据抽取层包含ETL过程和聚合表的生成过程。做好ETL的前提条件是：<br>l 好的模型表述，这需要对业务系统的理解。<br>l 对数据模型的理解<br>l 对数据源理解（包括平台信息，表结构，字典等等信息）。<br>l 对目标系统平台的理解（包括数据库信息，平台操作系统相关信息）<br><br>4.1.ETL？ELT？<br><br>一般的数据仓库资料里面说这个的时候都比较理论化，一个ETL过程怎么着也是那么几张图。ETL过程本身不是很复杂，复杂的是ETL中的数据和逻辑（业务关系）。ETL过程中的数据组织是由上层<span class=t_tag onclick=tagshow(event) href="tag.php?name=%BD%A8%C4%A3">建模</span>所决定的，上层<span class=t_tag onclick=tagshow(event) href="tag.php?name=%BD%A8%C4%A3">建模</span>涉及到的东西比较业务化，我没法多说。<br>电信级的数据一般都比较大，一般采用数据文件方式传输，以前我们施工的时候采用的DB Link方式也是先对数据进行dump out到文件操作，然后再对文件进行load操作。原因是数据的块操作比流操作快很多。一个比较极端的例子是当前我施工的项目使用的SybaseIQ数据库，直接使用Insert语句插入数据库的所需要的时间比同等的load操作慢百倍以上。<br>以下只针对文件加载进行讨论。<br>文件加载的流程是：取得文件&gt;生成数据库脚本&gt;执行load语句或者命令。<br>在上面的流程中我刻意的漏掉了ETL中的那个T(清洗，转换过程)。这个过程到底是放在Load之前还是Load之后？不用说，分析流式文件比数据库整表Update性能弱，而且很容易产生错误。所以我说文件方式加载的流程应该是ELT而不是ETL。<br>一个比较特殊的例子是我参与的网管分析系统中话单的采集。因为原始文件是使用Visual C++直接生成的，在结构体中为字节对齐填充了一些无效的Byte，一般的加载脚本或者语句很难正确执行，所以就采用了比较尴尬的ETL流程：取得文件之后&gt;分析文件&gt;转换清洗&gt;执行Load操作。<br>PS：也有把ETL整成四个步骤的 抽取，转换，加载和清洗。<br><br>4.2.数据分层（Stage）<br><br>理论告诉我们应该是在DW层之下有一个<span class=t_tag onclick=tagshow(event) href="tag.php?name=ODS">ODS</span>层。这个<span class=t_tag onclick=tagshow(event) href="tag.php?name=ODS">ODS</span>层存储的数据应该和业务系统数据基本保持一致，我所说基本保持一致是因为<span class=t_tag onclick=tagshow(event) href="tag.php?name=ODS">ODS</span>层的数据是经过清洗和转换的。<br>按照上面一节的说法，ODS除了存储和查询操作数据之外，还应当承担数据清洗和转换工作，这样对于这层的数据要求比较严格，例如用户如果在数据库进行清洗转换的时候执行了一个明细数据的查询，将会导致不可预料的结果返回，甚至可能引起表锁。<br>我们的建议是在ODS层下面增加一层Buffer层，这层的数据存储只是为了转换和清洗。<br>数据从文件中直接Load进入Buffer层，然后执行Buffer层的转换和清洗完成之后再将数据转出到ODS层中。为了节约存储和提高性能，建议Buffer层数据不作历史沉淀。<br>增加一个Buffer层还有一个好处是减小数据库的压力。按照数据仓库的建设目标，数据仓库的中各个层面主要的最终应用是提供查询，所以DBA对数据库进行性能调整的时候可以专注在调整Buffer层的更新和插入，其他层面可以弱化调整。<br><br>4.3.存储策略<br><br>数据仓库产生的历史沉淀是比较惊人的，拿用户计费话单为例，一个400万在网用户数的省分，每月产生的话单在3～4亿条之间，按照一般的设计，ODS层数据存储的时长为6个月，这么大的数据存储在数据库中，必然引起数据的查询性能降低，到底是使用分表存储还是使用分表<span class=t_tag onclick=tagshow(event) href="tag.php?name=%BF%D5%BC%E4">空间</span>存储，各自有定论，以下试着列出两种存储策略的特点：<br>接口方面，分表空间存储占有天然的优势，客户端程序不需要做其他特殊操作就可以了做到对非当前月的数据的查询，如果使用分表存储则需要客户端程序根据参数修改表名称。这对于大部分应用，尤其是使用存储过程的应用来说简直就是一场噩梦。<br>存储的额外开销方面，两种方式相差不大，毕竟对于数据量来说段位所占用的空间及其微小。<br>执行性能方面则分表的比较占优势，无论DBMS如何强大，对于分表空间存储的查询还是有个定位过程，而分表可以免除这点。全表更新的时候分表的优势体现的比较明显。<br><br>4.4.工具的选择<br><br>工具的选择应该还是以实用为本。我参与的项目中，有两个项目使用的DataStage，一个项目使用Powermart，试着问问，这些工具中我们使用的功能集占全部软件提供的功能集的百分之多少，拿着软件的Features list应该可以得到一个大致的结论。<br>工具选择需要考虑的两个因素是价值和成本。<br>价值也就是说这个工具到底提供了什么样的功能，或者我的期望到底是什么。基础价值非常明确：数据映射，转换规则映射和支持当前使用的数据仓库产品。<br>有几点不得不考虑<br>l 工具的伸缩性如何，能否支持自定义任务或者转换<br>l 是否支持工作流方式的加载<br>l 错误支持的级别如何,错误细化到什么程度(如果ETL工具只告诉你话单加载失败，你要花多少时间才能解决问题？如果ETL工具明确的告诉你是某字段转换错误呢？)<br>l 是否支持信息通知/通告<br>l 是否支持任务重新调度<br>l 是否支持文件加载的文件名动态定义<br>l 是否支持实时加载<br>可惜的是，现在市面上的产品对于以上功能总是有那么一些不符合。最后一个功能点，我提到一个实时加载的概念，这个主要用于电信经营分析中的话单加载，由于话单数量非常大，处理时间比较长，对数据源提供方和接受方都是一个不小的挑战，所以我们采用实时话单采集的方式，只要话单文件存在就直接采集到经营分析系统中。这个实时加载我所接触的工具都不能满足。<br>我所参与的一个项目中，在项目初期施工中发现数据的瓶颈就在于Datastage的数据加载，后来ETL组修改了加载的过程，使用TCL这个脚本语言＋Crontab实现了ETL调度和加载解决了这个问题。<br>是不是我们就真的需要自己编写一个ETL工具？答案比较暧昧，这个涉及到第二个选择ETL工具需要考虑的因素，成本。<br>其实一个ETL工具不见得需要多么复杂，简单的来说，软件是以实用为本。<br>ETL工具主要有以下几个部分组成：<br>l 时间触发器<br>l 业务单元，处理原生的加载和转换等等任务<br>l 事件，通知用户<br>l 由业务和事件组成的工作流<br>l 工作流驱动，调用工作流，保证工作流中业务和事件的正确执行。<br>好像还比较简单？施工的时候考虑更多的是ETL的性能，现代的很多代码都使用线程控制而非进程控制，线程之间的同步和通信将是一个很大的难题，所以作个简单的ETL工具，可能一个星期就够了，一个完整的，需要不少的时间。<br>我自己搞的那个ETL工具从2005年9月开始写代码，10月测试完成正式上线，直到2006年2月还在完善。到现在，还是面临数据库依赖太强的问题。<br><br>4.5.聚合：使用存储过程还是外部工具?<br><br>聚合，作为数据仓库数据呈现最重要的数据准备，到底使用存储过程还是外部工具进行操作，以下简单说说。<br>存储过程的优点是维护非常方便，可以直接从数据库中修改之后执行就可以了。但是存储过程依赖于数据库厂商，如果你不是很明白数据库的SQL方言，就算你打开了一个存储过程，可能也只能看个似是而非，因为数据仓库里面的逻辑处理不亚于业务系统中的逻辑处理。这也决定了存储过程的弱点，对于复杂的逻辑处理，对技术人员的考验非常大。<br>存储过程还有一个缺点就是无法直接进入代码版本控制系统，必须手工处理。我曾经尝试写了一个程序，其主要目的不是为了代码控制，而是数据流程图（下面会谈到），抽取出存储过程到自己的知识库中，但是还是不能避免数据库中存储过程被无意篡改。2005年9月我们出了一个这样的事情，导致现场四个工程师熬了一个通宵才复查完成，噩梦啊。<br>存储过程就是一个轻量的解决方案，不能说不好，也不能说好。<br>专用的程序或者外部工具例如某些ETL工具对数据进行汇总也是一个办法。和存储过程不同的是，这些工具很容易上手，只要知道模型，基本靠insert、select，甚至鼠标点点就可以完成一个聚合过程。大部分类似的工具把压力放在了工具运行的主机上面，而不像存储过程是放在数据库服务器上。<br>这些工具大部分都由脚本控制，所以外部工具的配置可以进行版本控制。<br>外部工具的缺点在于对工具的熟悉需要一段时间，而且对性能的操控由工具决定而非个人决定，在某些关键的场合，这点可能造成致命伤害。<br>具体采用什么方式进行聚合还是需要根据实际情况决定。<br>两种方式同时用算的上是一个中庸之道，但是仔细考究一下也不无道理。<br><br>4.6.脏数据处理<br><br>脏数据分成两类：<br>l 可以抛弃的数据：这些数据对于当前系统来说根本没有意义，例如错误的用户资料数据，测试数据等等。<br>l 可能恢复的数据：这些数据由于特定的原因（如维度数据同步问题） 造成不能加载的数据。<br>脏数据的处理与其说是一个技术问题，更像一个哲学问题，它和技术关联不密切，倒是和你如何看待这些数据比较密切。<br>&nbsp; &nbsp;&nbsp; &nbsp; 我的建议是沉淀脏数据，目的只有一个，核对数据的时候用。<br>遇到大量数据吞吐的时候（数据仓库总是这样），没有一个厂商能跳出来说自己的数据绝对没有问题，所以核对数据应该是一个经常性的工作。（顺便提及，这也应该是现场维护人员的一个习惯才行）。如果在发现脏数据之后删除了这部分数据，你怎么去核对你的数据。例如话单数据，9～10亿条话单，你如果抛弃了脏数据，连相差的总体情况（Count）都无[已经隐藏]确取得。<br>脏数据的研究有很多资料上介绍了不少数学模型的方法，不好意思，看不懂，我只知道当前我该如何满足需求。<br><br>4.7.数据流向图<br><br>你见过像下面这样的图么？<br>这张图表明了所有话务报表中数据的来源和途径，通过这张图我们可以得到<br>&nbsp; &nbsp;&nbsp; &nbsp; 话务数据的来源<br>&nbsp; &nbsp;&nbsp; &nbsp; 话务数据的关联信息<br>&nbsp; &nbsp;&nbsp; &nbsp; 话务数据中节点相关信息，前置节点和后置节点<br>&nbsp; &nbsp;&nbsp; &nbsp; 话务数据数据恢复相关哪些表<br>这样的图我称为数据流向图，暂时还没有找到好的描述，这个是我在我的项目中随手截出来的，不全。我刚进这个项目的时候，有一些基础，但是不是很明白数据的来源就着手开始核查数据是个不明智的，所以我自己整理了一个这么样的图形。<br>这样的图形实用价值的确很高，但是为什么绝大多数项目（包含我当前的项目）中却没有人做这份工作，原因终归还是因为项目施工的压力和成本。如果允许，我倒是非常希望有这么一个系统能够直接生成这样的图形。<br><br><strong>5.&nbsp; &nbsp;OLAP层</strong><br><br>这点本来我不想写的（原因是我没有真正使用过MOLAP的产品），呵呵，老大说要写出来，就胡诌几句吧。<br><br>5.1.ROLAP和MOLAP之间的选择<br><br>对于ROLAP和MOLAP，建模方式有细微的差别，这点差别主要是由于建模工具本身造成的，和实际的模型并没有关系。<br>从技术角度来说，ROLAP和MOLAP各有千秋。 ROLAP基于关系型数据库，它的OLAP引擎就是将用户的OLAP操作，如上钻下钻过滤等，转换成SQL语句提交到数据库中执行，并且提供聚集导航功能，根据用户操作的维度和度量将SQL查询定位到最粗粒度的事实表上去。相比较而言，MOLAP事先将汇总数据计算好，存放在自己特定的**数据库中，用户的OLAP操作可以直接映射到**数据库的访问，无需通过SQL访问。可以说ROLAP提供了更大的灵活度，但可能正是这种灵活度，造成对用户使用的不友好印象，确实相比Metacube和Cognos，前者的操作复杂多了，不过这应该不成问题，是可以改善的。<br>我个人觉得当前很多系统在选择ROLAP和MOLAP的时候都没有经过仔细考虑。有次我们在进行一个系统的需求分析的最后才发现选用的Essbase还需要占用额外的空间，爆寒一个。选择ROLAP或者MOLAP应该是和需求相关，而不是和技术相关。<br>MOLAP从构架和查询性能方面来看都优于ROLAP，但是这并不意味着ROLAP缺乏生存空间，对于快速灵活搭建系统来说，ROLAP的优势比较明显。而且ROLAP通过技术和硬件手段是可以提高其查询性能的。<br><br>5.1.1.&nbsp; &nbsp; 数据存储<br><br>ROLAP将数据建立的是虚拟Cube，数据存储依赖于现有的数据存储（数据库）。而MOLAP自己建立了存储，从开销上来讲，MOLAP将会把空间Double一下。因为MOLAP使用自身的存储，那么需要将Cube数据生成并导入MOLAP的空间中，而ROLAP在这部分的工作很少，大部分工作集中在DW层的生成。在这点上MOLAP增加了ETL的难度。<br>MOLAP的存储被文件系统所**，现在很多厂商基本都解决这个问题，所以这个问题也在逐步解决。<br><br>5.1.2.&nbsp; &nbsp; 性能<br><br>按照道理上来说MOLAP的查询速度应该优于ROLAP，但是这个也是等同条件下的，现在的硬件发展已经可以逐渐弥补这个差距。<br>MOLAP是事先生成**立方体，供以后查询分析用,而ROLAP是通过动态的生成Sql,去做查询关系型数据库，如果没有做性能优化，数据量很大的时候，性能问题就会显得比较突出了。<br>性能的问题不是容易解决的，关键还不在是聚集表快还是**数据库快。从体系架构上说，采用MOLAP使得OLAP应用和数据仓库分离开，降低了耦合度，这种架构是比较理想的，可以让不同部件专门干自己的事，付出的代价主要是ETL的复杂度。而ROLAP技术直接依赖数据仓库，与之紧密结合，OLAP的性能很大程度上依赖数据仓库模式设计，这一点不是总是被保证的。<br><br>5.1.3.&nbsp; &nbsp; 维护性<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOLAP由于使用自己的存储，需要额外的维护工作，而ROLAP只需要DBA就可以了。ROLAP的性能监视可以直接从DBMS得到，而MOLAP需要管理人员熟悉一套新的工具。ROLAP可以直接使用标准的SQL访问数据，而MOLAP只能使用晦涩的MDX查询。<br>修改模型（Cube变化，维度变化）之后MOLAP需要重新生成数据<br><br>5.2.维度变化策略<br>对于ROLAP来说，有个好事就是维度变化不需要变更很多东西，除非你把维度层次都存储到了事实表中，因为ROLAP是直接使用SQL语句进行查询，维度变化只影响到维度表，不会影响到事实表，所以，维度变化与否基本和ROLAP没有关系。<br>但是对于MOLAP来说，维度变化，尤其是层次结构变化是比较麻烦的。MOLAP如何存储数据的我们只能猜测，但是有一点可以肯定，你不可能使用Update语句去直接更新事实表，这样表明我们需要重建整个cube,浩大的工程。<br>还有一种情况就是用户需要看到历史数据，例如某个代理商AT原先归属于A营业点，2006年8月变更成归属于B营业点，客户要求在8月以前的报表中A营业点统计AT的数据，而在8月以后在B营业点中统计AT的数据。<br>这样的问题可能所有的报表系统都会面临到，幸运的话你可以强烈要求客户收回这个需求，因为大家都知道即使从二维表中去查询，这个SQL有多难看，你必须写死某些东西进去（如果这个AT在10月再产生一次变化，同时它的上级也产生了一次归属变化，那就要疯了）。如果不幸也只能想办法解决。数据仓库中的查询不能用SQL语句搞定，只能从模型数据搞定（产生的维度膨胀不容忽视），暂时没有想到特别好的方案。<br><br><strong>6.&nbsp; &nbsp;展现层</strong><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 或许你鄙视windows系统推崇那冠有多个头衔的Linux或者unix，但是你不能忽视windows在界面上所作出的工作。我开篇就强调了，数据仓库对于最终用户就是一个复杂的报表系统。但是非常遗憾的是，现在很多我所见到的、参与的甚至包括我自己当前从事的项目都没有把这个放到重点。<span class=t_tag onclick=tagshow(event) href="tag.php?name=%CE%A2%C8%ED">微软</span>提出了一个概念叫做&#8220;用户体验(User Experience)&#8221;,这个指导<span class=t_tag onclick=tagshow(event) href="tag.php?name=%CE%A2%C8%ED">微软</span>发展的基本原则造就了<span class=t_tag onclick=tagshow(event) href="tag.php?name=%CE%A2%C8%ED">微软</span>在桌面领域的霸主地位。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我所参与的项目中客户的的老领导（也是我出道之后的第一个项目的客户方领导）有天说了一句话<strong>，&#8220;你们经营分析就应该向网站学习</strong>&#8221;，没错，我很赞同。<br>长久以来，数据仓库项目集中的大量的人力和物力解决业务和数据的问题，对前端过分依赖于类似Brio/<span class=t_tag onclick=tagshow(event) href="tag.php?name=MSTR">MSTR</span>/Cognos之类的工具。我们能听到很多和客户交流的时候提出的类似&#8220;钻取&#8221;，&#8220;上卷&#8221;之类的术语。数据问题解决了，客户的关注点就会逐步向易用性转移。<br>难道一个你想怎么查询就怎么查询的系统就一定能满足客户的挑剔？不见得。<br><br>6.1.客户定位<br><br>数据仓库项目搭建的一个问题是，你所面对的客户到底是谁？<br>这个问题分成两个方面，我们经常关注的是第一个方面，数据源的选取范围和模型面向的客户部门。而第二个方面，面对的客户的层面却很少关注。<br>埃森哲公司为中国联通做了一个比较有意思的评估，对用户进行了纵向分层，分成领导层、业务分析层和应用层。对各个纵向分层提出不同的的界面建议。<br>还是比较有道理的，**分析的钻取和切片等等操作对于最终操作人员的技术要求比较高，而且比较耗时间和精力，但是优点就是，可以全面的看到数据。这个层面比较适合业务分析层的用户，例如市场分析人员和部分中层。<br>领导就不一样了，这个层面的人对于数据敏感，业务不见得非常熟悉，技术也不见得如何高明，更多的说法是，这个层面的人的时间不多，处理的工作比较繁杂，最好是一眼就能看到自己所需要的数据。为这部分用户提供的更多的应该是直观的看板，例如图形或者仪表盘。<br>最后的一层应用层就非常难说，这个层面的人为数不少，像我当前所在的项目里面客户把经营分析系统的数据作为审核标准的时候查询就更加频繁。这个层面的人对技术基本就是一片空白（我所接触的一个市场部的小组长居然连自己的IP地址如何设置都不知道），他们需要的直观的、和自己相关的报表，而且是能够快速的访问。为这部分用户提供的应该是固定格式的二维报表，可以适当提供一些**报表。<br><br>6.2.中国特色<br><br>根据客户定位，经营分析系统应该提供看板展示、二维报表展示和**报表展示。所以我们提出辅助的报表展现方式。<br>但是单纯的二维展现并不能满足客户的需求，这些二维报表可能涉及到简单的分组、小计、排名、旋转和汇总。由于数据仓库维度的特点，还需要提供级连选择功能。这不能不说是一份很重的工作。<br>&nbsp;&nbsp;&nbsp;&nbsp; 原本想展现一些客户要求的更加BT的报表，想想还是算了，别惹客户不痛快了。</div>
<img src ="http://www.cnitblog.com/sunnywang/aggbug/61749.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sunnywang/" target="_blank">sunnywang   </a> 2009-10-10 11:44 <a href="http://www.cnitblog.com/sunnywang/archive/2009/10/10/61749.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>UML学习笔记</title><link>http://www.cnitblog.com/sunnywang/archive/2009/05/13/57191.html</link><dc:creator>sunnywang   </dc:creator><author>sunnywang   </author><pubDate>Wed, 13 May 2009 06:00:00 GMT</pubDate><guid>http://www.cnitblog.com/sunnywang/archive/2009/05/13/57191.html</guid><wfw:comment>http://www.cnitblog.com/sunnywang/comments/57191.html</wfw:comment><comments>http://www.cnitblog.com/sunnywang/archive/2009/05/13/57191.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/sunnywang/comments/commentRss/57191.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/sunnywang/services/trackbacks/57191.html</trackback:ping><description><![CDATA[<div class=postcontent>
<h1 class=block_title><a id=AjaxHolder_ctl01_TitleUrl href="http://www.cnblogs.com/shuangliang/archive/2006/05/24/408440.html"><font size=2></font></a>&nbsp;</h1>
<div class=post>&nbsp;</div>
<p><br><br><br><br></p>
<p>发展史：吃水不忘挖井人，先记记创立者吧。</p>
<p>&nbsp;&nbsp;&nbsp; 统一建模语言UML（Unified Modeling Language）是由Grady Booch、Jim Rumbaugh和Ivar Jacobson三人共同努力，于1996年6月和10月发布。1997年11月17日，OMG采纳UML 1.1作为基于面向对象技术的标准建模语言，成为可视化建模语言事实上的工业标准。　　</p>
<p>&nbsp;&nbsp;&nbsp; 1、James Rumbaugh<br>&nbsp;&nbsp;&nbsp; 参与创立了称为对象建模技术（Object Modeling Technique，简写OMT）的早期建模语言。<br>&nbsp;&nbsp;&nbsp; OMT包括对象模型、动态模型、功能模型用于分析、系统设计、对象设计和实现等步骤。<br>&nbsp;&nbsp;&nbsp; 2、Grady Booch<br>&nbsp;&nbsp;&nbsp; 开发了Booch方法，是一个面向对象的软件解决方案开发方法，用来分析、模型化和记录系统要求。<br>&nbsp;&nbsp;&nbsp; 使用对象图、状态转换图、交互图来进行逻辑建模和物理建模。<br>&nbsp;&nbsp;&nbsp; 3、Ivar Jacobson<br>&nbsp;&nbsp;&nbsp; 创立了面向对象的软件工程（Object-Oriented Software Engineering，简称OOSE）方法。OOSE是一种真正的面向对象的软件方法，突出的特点是Ivar Jacobson加入的用例驱动和方法。</p>
<p>（可惜，这三个人的名字不会读，有人标出音标来吗？英语水平太差。）</p>
<p>　　UML是一种定义良好、易于表达、功能强大且普遍适用的建模语言。它溶入了软件工程领域的新思想、新方法和新技术。它的作用域不限于支持面向对象的分析与设计，还支持从需求分析开始的软件开发的全过程。</p>
<p>&nbsp;&nbsp;&nbsp; UML可用于下列领域：<br>&nbsp;&nbsp;&nbsp; 1、机构的工作流程<br>&nbsp;&nbsp;&nbsp; 2、业务分析<br>&nbsp;&nbsp;&nbsp; 3、用户描述<br>&nbsp;&nbsp;&nbsp; 4、数据库设计<br>&nbsp;&nbsp;&nbsp; 5、对象设计<br>&nbsp;&nbsp;&nbsp; 6、组件<br>&nbsp;&nbsp;&nbsp; 7、部署（域和服务器）<br>&nbsp;&nbsp;&nbsp; 8、GUI设计</p>
<p>&nbsp;&nbsp;&nbsp; UML是模型，不是实现，所以可用于任何类型的环境。在设计的方法，UML都独立于编程语言。当然，在某些位置，需要在UML模型做出一些决策，来反映物理和技术选择，这是UML的另一个强大特性。也就是说，不仅所有开发人员可使用UML，而且业务分析师和技术架构师能在了解所有要求、当前状态、未来状态、交互和约束前，不需要选择技术平台，即开始分析和设计解决方案。</p>
<p>&nbsp;&nbsp;&nbsp; UML由图形符号组成，开发人员、分析师、客户、用户和其他股东都能理解。</p>
<p>&nbsp;&nbsp;&nbsp; UML模型分为三类：功能、行为和实现。功能类别模型用来收集要求和描述功能。行为类别模型用于描述解决方案的对象和用户的行为。实现类别模型用于解决方案功能和行为的物理实现。<br>&nbsp;&nbsp;&nbsp; 1、功能模型：用例图、类图<br>&nbsp;&nbsp;&nbsp; 2、行为模型：交互图（顺序图和协作图）、状态图、活动图<br>&nbsp;&nbsp;&nbsp; 3、实现模型：组年图、部署图</p>
<p>功能类模型：包括用例图和类图，它们将准确了解解决方案的作用及开发方式。<br>用例图：用来收集用户要求。由行动者（actor）、用例（use case）及它们之间的关系组成。<br>1、行动者（actor）指与系统交互的某人或某事。行动者要么从解决方案接收信息，要么将信息传给系统。通常包括人（如用户）或另一个系统。行动者一般指一个角色，而非操作者。例如：如果两个操作者以完全相同的方式使用解决方案，则行动者是一个，而不是两个。<br>2、用例（Use Case）指一个过程。<br>类图：用于收集要求阶段。它提出总是，并验证系统确能完成要求。</p>
<p>行为类模型：描述解决方案的行为或交互。<br>1、交互图：包括顺序图和协作图。这两种图之间的区别在于：顺序图基于时间，按时间顺序显示出现的任务；而协作图显示任务和信息（对象）的交互方式。<br>2、状态图：显示对象的生命期。<br>3、活动图：描述工作流以及谁完成工作。</p>
<p>实现类模型：描述如何打包和实现解决方案。<br>1、组件图：指在解决方案中构建实际物理组件模型的方式。组件图可显示源代码组件、COM+组件及其它二进制和可执行文件。组件图还显示组件接口。<br>2、部署图：显示解决方案的部署方式，由处理器、设备和连接器构成。用来描述组件运行在哪些物理计算机上，以及解决方案如何与硬件交互。<br><br><br><br><br><br><br><br><strong><span style="COLOR: #0000ff">用例图（use case diagram）</span></strong></p>
<p>基本元素：<br>行动者（Actor）：有翻译为参与者、角色，感觉&#8220;角色&#8221;似乎更适合，更易于理解。微软中文VISIO中使用参与者。<br>关系（Relationship）<br>过程（Process）<br>包（Package)<br>系统边界（System Boundary）</p>
<p>关系用来指示行动者与哪些元素有关。行动者可能与其他行动者相关，也可与用例相关。行动者与用例相关，以表明它们从用例接收信息，或将输入或信息输给用例。<br>用例图包括三类关系：<br>communicates（通信关系）<br>uses（使用关系）<br>extends（扩展关系）</p>
<p>communicates关系表明行动者从用例接收信息，或向用例提供输入或信息。更可能的情况是，它表明行动者与用例交互，即行动者执行用例中包含的任务。communicates关系常被称为associations（关联关系）。</p>
<p>uses关系表示用例使用另一个用例提供的功能。</p>
<p>extends关系表明一个用例可使用另一个用例的功能。</p>
<p><span style="COLOR: #008000">uses和extends的区别：<br></span>extends表明的是一种可选决策<br>uses表明的是一种必选决策</p>
<p><span style="COLOR: #0000ff"><strong>顺序图（sequence diagram）<br></strong></span>顺序图是以图形方式记录情景（scenarios）的方式。每当要记录一系列动作时，就可以构建顺序图。<br>顺序图包含元素：<br>对象（Objects）<br>激活（Activations）<br>消息（Messages）<br>注解（Notes）</p>
<p>对象是解决方案中的持久元素。它们可能是表、物理窗体或类。<br>激活是过程的执行，包括它等待嵌套过程执行的时间。<br>消息是对象之间执行的动作，消息标志着两个对象之间的通信，从而表示一个动作。<br>&nbsp;&nbsp;&nbsp; 消息：连接到两个不同对象生命线的连接点。此类消息表示一个动作，与接收对象的方法或操作相关，接收消息的对象执行这个请求上的动作。消息可含传给要执行方法的参数。<br>&nbsp;&nbsp;&nbsp; 消息（调用）：似乎与消息是一样的。<br>&nbsp;&nbsp;&nbsp; 消息（返回）：将信息返给对象的消息。<br>&nbsp;&nbsp;&nbsp; 消息（异步）：发送对象将消息发送给接收对象，并不等待接收对象的响应。<br><span style="COLOR: red">（这一段好难理解，还不如这一段：<br>简单消息(Simple Message) 表示简单的控制流。用于描述控制如何在对象间进行传 递,而不考虑通信的细节。<br>同步消息(Synchronous Message) 表示嵌套的控制流。<br>操作的调用是一种典型的同 步消息。<br>调用者发出消息后必须等待消息返回,只有当处理消息的操作执行完毕后,调用 者才可继续执行自己的操作。<br>异步消息(Asynchronous Message) 表示异步控制流。<br>当调用者发出消息后不用等待 消息的返回即可继续执行自己的操作。<br>异步消息主要用于描述实时系统中的并发行为。<br>简单消息和同步消息感觉总是理解不清楚。<br>）<br><br><br></p>
<p style="COLOR: #000000"><span style="COLOR: #0000ff"><strong>协作图</strong></span>：显示对象及相应关联<br>协作图包含三个基本元素：对象、链接（对象之间）、消息</p>
<p style="COLOR: #000000">对象包含名称、状态和行为。</p>
<p style="COLOR: #000000"><span style="COLOR: #008000">协作图与顺序图的区别是</span>：顺序图基于时间，但协作图不强调时间。在记录过程涉及的任务时，将构建协作图。与顺序图相比，协作图更面向对象，因为它强调的是消息和对象，而在顺序图，因为按基于时间的方式记录过程，所以强调的是过程路径。</p>
<p style="COLOR: #000000"><span style="COLOR: #0000ff"><strong>活动图</strong></span>：用来构建业务过程工作流的模型。业务过程是一个过程，描述业务如何执行特定任务。业务过程涉及到所有行动者和过程。<br>活动图由以下元素构成：<br>1、泳道（Swimlanes）<br>2、活动（Activities）<br>3、转换（Transitions）<br>4、状态（States）<br>5、决策（Decisions）</p>
<p style="COLOR: #000000">每个泳道表示一个对象，对象负责泳道中发生的一切。<br>泳道中包含活动。活动表示对象所实现的功能。<br>每个活动必须正好有一个传出转换。转换有两种类型：对象流（指示活动与该活动相关的对象之间的关系），控制流（显示一个活动触发另一个活动或转换到一个新对象状态）<br>对象可能处于多种不同状态。对象可能有状态，也可能无状态。当对象有状态时，若执行一个或多个操作 ，或设置一个或多个属性时，则对象从一种状态转换成另一种状态。<br>决策基于不同条件向不同方向发展。</p>
<p style="COLOR: #000000">行为类型UML模型中的部分元素与.net语言有映射关系，具体包括：<br>包——命名空间（或系统）<br>顺序图：对象——通常是.net类的一个实例<br>顺序图：消息——通常是.net类的一个方法（或事件、属性）</p>
<p style="COLOR: #000000"><span style="COLOR: #000000"><strong>类图（Class diagram）</strong></span>：用来确定解决方案的（静态）结构。通过类图，可看到将实现哪些类、COM+组年和ASP页面等。也可看到这些元素的交互方式。<br>当开发人员开发解决方案时，类图将是主要的信息来源，从中可详细了解要开发的操作代码，以及数据类型、参数和命名空间等信息。如果开发人员需要一些有关解决方案行为的支持信息，则可查看行为图，如顺序图和活动图等。</p>
<p style="COLOR: #000000">类图的主要元素包括：包、类、关系。</p>
<p style="COLOR: #000000">对类图而言，包有两个功能：<br>1、可构建组合相关元素的包，以构建模型的普通视图。<br>2、可表示命名空间。</p>
<p style="COLOR: #000000">类包含名称（Name）、特性（Attributes）、操作（Operations）</p>
<p>关系包含三种基本关系：Binary association（二元关联）、Dependency（依赖）、Generalization（泛化）。<br><span style="COLOR: #000000">二元关联：指定两个类是相关的，即它们以某些方式交互。<br>依赖关系：指一个类对另一个类的构建依赖，但不维护到该类对象的永久链接。如果更改一个类，则将影响所有依赖于这个特定类的所有类。一般地，依赖关系表明：依赖类至少调用其所依赖类的一个操作。依赖关系对代码生成没有任何影响，但在项目引用中有所表现。<br>泛化关系：指示一个类是另一个类的子类，并继承基类的公共操作和特性。</span><br><br></span></p>
</div>
<img src ="http://www.cnitblog.com/sunnywang/aggbug/57191.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sunnywang/" target="_blank">sunnywang   </a> 2009-05-13 14:00 <a href="http://www.cnitblog.com/sunnywang/archive/2009/05/13/57191.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解压 *.tar.gz文件</title><link>http://www.cnitblog.com/sunnywang/archive/2009/03/24/55719.html</link><dc:creator>sunnywang   </dc:creator><author>sunnywang   </author><pubDate>Tue, 24 Mar 2009 12:45:00 GMT</pubDate><guid>http://www.cnitblog.com/sunnywang/archive/2009/03/24/55719.html</guid><wfw:comment>http://www.cnitblog.com/sunnywang/comments/55719.html</wfw:comment><comments>http://www.cnitblog.com/sunnywang/archive/2009/03/24/55719.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnitblog.com/sunnywang/comments/commentRss/55719.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/sunnywang/services/trackbacks/55719.html</trackback:ping><description><![CDATA[<div class=postTitle><a class=postTitle2 id=viewpost1_TitleUrl href="http://chenlb.blogjava.net/archive/2008/07/08/213274.html"><font color=#1a8bc8>解压 *.tar.gz 文件</font></a> <br><br><br>注意1：使用tar zvxf&nbsp; *.tar.gz&nbsp;&nbsp; 有的时间有版本的问题， 所以不能执行<br><br><span style="COLOR: red">gzip -d&nbsp;&nbsp; filename.tar.gz<br>tar -xf filename.tar<br></span><br>也可以实现之上的功能<br><br><br>注意2： 有的时间现网是不支持unzip 命令的， 使用unzip命令就不行了， 那该怎么办？<br></div>
<p>linux下的很软件都是 tar.gz后缀的，解压久了不用就忘了，写备忘。现我知的直接解压方法有两种<br><br>1.gunzip与tar</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">gunzip&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">.tar.gz&nbsp;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;tar&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">xvf&nbsp;</span><span style="COLOR: #000000">-</span></div>
<br>2.只用tar<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">tar&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">zxvf&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">.tar.gz</span></div>
<br>说明：<br>z表示：通过gzip指令处理备份文件<br>x表示：解压<br>v表示：输出解压过程信息<br>f表示：指定备份文件 <br>
<img src ="http://www.cnitblog.com/sunnywang/aggbug/55719.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sunnywang/" target="_blank">sunnywang   </a> 2009-03-24 20:45 <a href="http://www.cnitblog.com/sunnywang/archive/2009/03/24/55719.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于路径的问题</title><link>http://www.cnitblog.com/sunnywang/archive/2009/03/24/55690.html</link><dc:creator>sunnywang   </dc:creator><author>sunnywang   </author><pubDate>Tue, 24 Mar 2009 01:29:00 GMT</pubDate><guid>http://www.cnitblog.com/sunnywang/archive/2009/03/24/55690.html</guid><wfw:comment>http://www.cnitblog.com/sunnywang/comments/55690.html</wfw:comment><comments>http://www.cnitblog.com/sunnywang/archive/2009/03/24/55690.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/sunnywang/comments/commentRss/55690.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/sunnywang/services/trackbacks/55690.html</trackback:ping><description><![CDATA[<table style="TABLE-LAYOUT: fixed">
    <tbody>
        <tr>
            <td>
            <div class=cnt id=blog_text><font color=#008080 size=4><strong>什么是绝对路径：<br><br>　　大家都知道，在我们平时使用计算机时要找到需要的文件就必须知道文件的位置，而表示文件的位置的方式就是路径，例如只要看到这个路径：c:/website/img/photo.jpg我们就知道photo.jpg文件是在c盘的website目录下的img子目录中。类似于这样完整的描述文件位置的路径就是绝对路径。我们不需要知道其他任何信息就可以根据绝对路径判断出文件的位置。而在网站中类似以http://www.pckings.net/img/photo.jpg来确定文件位置的方式也是绝对路径。<br><br>　　另外，在网站的应用中，通常我们使用"/"来表示根目录，/img/photo.jpg就表示photo.jpg文件在这个网站的根目录上的img目录里。但是这样使用对于初学者来说是具有风险性的，因为要知道这里所指的根目录并不是你的网站的根目录，而是你的网站所在的服务器的根目录，因此当网站的根目录与服务器根目录不同时，就会发生错误。 </strong></font>
            <p><font face="Arial Narrow" color=#008080 size=4><strong>　　什么是相对路径：<br><br>　　让我们先来分析一下为什么会发生图片不能正常显示的情况。举一个例子，现在有一个页面index.htm,在这个页面中联接有一张图片photo.jpg。他们的绝对路径如下：<br>　　c:/website/index.htm<br>　　c:/website/img/photo.jpg<br><br>　　如果你使用绝对路径c:/website/img/photo.jpg，那么在自己的计算机上将一切正常，因为确实可以在指定的位置即c:/website/img/photo.jpg上找到photo.jpg文件，但是当你将页面上传到网站的时候就很可能会出错了，因为你的网站可能在服务器的c盘，可能在d盘，也可能在aa目录下，更可能在bb目录下，总之没有理由会有c:/website/img/photo.jpg这样一个路径。那么，在index.htm文件中要使用什么样的路径来定位photo.jpg文件呢？对，应该是用相对路径，所谓相对路径，顾名思义就是自己相对与目标位置。在上例中index.htm中联接的photo.jpg可以使用img/photo.jpg来定位文件，那么不论将这些文件放到哪里，只要他们的相对关系没有变，就不会出错。<br><br>　　另外我们使用&#8220;../&#8221;来表示上一级目录，&#8220;../../&#8221;表示上上级的目录，以此类推。（学习过dos的朋友可能更容易理解）</strong></font></p>
            <p><font face="Arial Narrow" color=#008080 size=4><strong>　　再看几个例子，注意所有例子中都是index.htm文件中联接有一张图片photo.jpg。<br><br><font color=#ff0000>　　例：<br>　　c:/website/web/index.htm<br>　　c:/website/img/photo.jpg<br>　　在此例中index.htm中联接的photo.jpg应该怎样表示呢？<br>　　错误写法：img/photo.jpg<br>　　这种写法是不正确的，在此例中，对于index.htm文件来说img/photo.jpg所代表的绝对路径是：c:/website/web/img/photo.jpg，显然不符合要求。<br>　　正确写法：使用../img/photo.jpg的相对路径来定位文件</font></strong></font></p>
            <p><br><font face="Arial Narrow" color=#ff0000 size=4><strong>　　例：<br>　　c:/website/web/xz/index.htm<br>　　c:/website/img/images/photo.jpg<br>　　在此例中index.htm中联接的photo.jpg应该怎样表示呢？<br>　　错误写法：../img/images/photo.jpg<br>　　这种写法是不正确的，在此例中对于index.htm文件来说../img/images/photo.jpg所代表的绝对路径是：c:/website/web/img/images/photo.jpg。 <br>　　正确写法：可以使用../../img/images/photo.jpg的相对路径来定位文件<br></strong></font></p>
            <p><font face="Arial Narrow" color=#008080 size=4><strong>　　例：<br>　　c:/website/web/xz/index.htm<br>　　c:/website/web/img/photo.jpg<br>　　在此例中index.htm中联接的photo.jpg应该怎样表示呢？<br>　　错误写法：../../img/photo.jpg<br>　　这种写法是不正确的，在此例中对于index.htm文件来说../../img/photo.jpg所代表的绝对路径是：c:/website/img/photo.jpg。<br>　　正确写法：可以使用../img/photo.jpg的相对路径来定位文件<br></strong></font></p>
            <p><font face="Arial Narrow" color=#008080 size=4><strong>　　总结：通过以上的例子可以发现，在把绝对路径转化为相对路径的时候，两个文件绝对路径中相同的部分都可以忽略，不做考虑。只要考虑他们不同之处就可以了。</strong></font></p>
            <p><font face="Arial Narrow" color=#008080 size=4><strong>　　如何修改样式表的路径：<br><br>　　使用文本编辑器打开htm文件，查看源代码，在源代码的开头部分&lt;head&gt;......&lt;/head&gt;标记中间找到&lt;link rel="stylesheet" href="test.css" type="text/css"&gt;。&#8220;Href=&#8221;后面的内容就是css的路径，我们可以根据以上的知识进行相对路径的转换。<br><br>　　例：<br>　　c:/website/web/xz/index.htm<br>　　c:/website/css/test.css<br>　　在此例中index.htm中联接test.css文件，可以使用../../css/test.css的相对路径来定位文件，完整的代码标记是：&lt;link rel="stylesheet" href="../../../css/test.css " type="text/css"&gt;<br>　　错误写法举例：../../../css/test.css<br>　　这种写法是不正确的，在此例中对于index.htm文件来说../../../css/test.css所代表的绝对路径是：c:/css/test.css</strong></font></p>
            <p><font face="Arial Narrow" color=#008080 size=4><strong>　　最后，为了避免在制作网页时出现路径错误，我们可以使用dreamweaver的站点管理功能来管理站点。只要使用菜单命令site-new site新建站点并定义站点目录之后，它将自动的把绝对路径转化为相对路径，并且当你在站点中移动文件的时候，与这些文件关联的连接路径都会自动更改，实在是非常的方便。</strong></font></p>
            <p><font color=#008080 size=4><strong></strong></font></p>
            <p><font face="Arial Narrow" color=#008080 size=4><strong>linux系统中文件路径</strong></font></p>
            <p><font face="Arial Narrow" color=#008080 size=4><strong>使用Linux系统的过程中，需要经常对文件和目录进行操作，而数据和程序大多以文件的形式保存。本节主要介绍文件与目录的基本概念以及文件和目录操作的命令。</strong></font></p>
            <h2><font face="Arial Narrow" color=#008080 size=4>文件与目录的基本概念</font></h2>
            <h3><font face="Arial Narrow" color=#008080>1.文件与文件名</font></h3>
            <p><font face="Arial Narrow" color=#008080 size=4><strong>在多数操作系统中都有文件的概念。文件是Linux用来存储信息的基本解构，它是被命名(称为文件名)的存储在某种介质(如磁盘、光盘和磁带 等)上的一组信息的集合。Linux中的文件均为无无结构的字符流形式。文件名是文件的标识，DOS时代的文件名限制在了8.3，即文件名的长度最多只能有8个字符，而扩展名最多只能有3个字符；到了windows95时代文件名的支持到了128位；而Linux支持最多256个字符。Linux中没有扩展名的概念，只要您原意，你完全可以创建类似&#8220;...&#8221;、&#8220;libacl.so.1.0.4&#8221;这样的目录与文件，但是扩展名对于Linux中的文件分类也是十分有用的。我们应当选择有意义的文件名与扩展名。用户可能对某些大众已接纳的标准扩展名比较熟悉，例如：C语言编写的源代码文件总是具有C的扩展名。用户可以根据自己的需要，随意加入自己的文件扩展名。 </strong></font></p>
            <p><font face="Arial Narrow" color=#008080 size=4><strong>Linux中也有一些特殊字符，如：！@^&lt;等。在Linux中您直接使用它们中的大部分，另外一些也可以通过转义来加以使用。虽然我们可以使用这些字符，但是不建议用户使用它们。<br>在Linux下也有一些特殊的文件它们以&#8220;.&#8221;开头，这些属于隐藏文件，我们用ls -a命令可以看见它们。</strong></font></p>
            <h3><font face="Arial Narrow" color=#008080>2.绝对路径和相对路径</font></h3>
            <p><font face="Arial Narrow" color=#008080 size=4><strong>在Linux下绝对路径是指从目录树的根/一直到文件所在目录的完整路径。如：/home/epaul/test.txt是一个绝对路径。相对路径指目标文件相对于当前目录的位置。如当前目录为/home/epaul，用相对路径表示/etc/group文件为../../etc/group。</strong></font></p>
            <p><font face="Arial Narrow" color=#008080 size=4><strong>在Linux中&#8220;.&#8221;、&#8220;..&#8221;分别代表当前目录和上级目录。而&#8220;~&#8221;可以代表家目录(/home/$USER)。</strong></font></p>
            <p><font face="Arial Narrow" color=#008080 size=4><strong>举几个例子：<br><br>当前目录为/home/epaul/work，/home/epaul/目录下有另外的music目录，我们切换当前目录到/etc/epaul/music以下几种方法是等价的：</strong></font></p>
            <pre><font face="Arial Narrow" color=#008080 size=4><strong>$cd ../music/            相对路径表示法<br>
            $cd /home/epaul/music/   绝对路径表示法<br>
            $cd ~/music/             用~代表家目录表示法
            </strong></font></pre>
            <h3><font face="Arial Narrow" color=#008080>3.文件类型</font></h3>
            <p><font face="Arial Narrow" color=#008080 size=4><strong>在Linux下文件分为普通文件、目录文件、连接文件、和设备文件。<br>[list=1]<br>[*]普通文件是我们接触最多的，普通文件又分为：字符文件、C语言源文件，mp3文件、脚本文件等等。我们可以通过file *命令查看当前目录下文件的类型。<br>[*]目录也是一种文件，不同于普通文件的是，目录中记录是是一些文件和目录的名字地址。也就是说我们通常修改一个文件的名称其实只是修改目录文件中的一条记录。<br>[*]连接文件是Linux下的一种特殊文件，类似于windows下的快捷方式，而连接的功能要强大的多。连接本身不包括内容，他指向别的文件和目录。<br>[*]Linux下的所有设备都用文件来标识，这是Linux一个重要的特点与优点。设备文件存放于/dev目录下，设备文件根据其读取方式的差别又分为块设备和字符设备。块设备的存取是以块为最小单位的，块的读取可以随即进行，块的大小可以在格式化的时候定义；而字符设备则是按顺序一个一个地传递字符。常见的块设备有硬盘如：/dev/hda1,字符设备有终端等。Linux中还有一个特殊的设备文件：/dev/null，它并不是一个真正的设备，当我们传递数据给它时，会将这些数据清除。<br>[/list]</strong></font></p>
            <h3><font face="Arial Narrow" color=#008080>4.文件权限</font></h3>
            <p><font face="Arial Narrow" color=#008080 size=4><strong>Linux系统中的每个文件和目录都有访问许可权限，每个权限分为只读、只写、可执行三种。以文件为例，只读权限标识只允许读取其中内容而禁止修改于执行，只写代表只允许写入内容而无读取权限，可执行权限表示允许将该文件作为一个程序执行。通常我们遇到的会是三种权限的组合，如拥有只读、只写组成读写权限。 </strong></font></p>
            <p><font face="Arial Narrow" color=#008080 size=4><strong>文件权限又分为三种不同的类型：文件所有者，同组用户，其它用户。所有者一般是文件的创建者。用ls -l命令会得到当前目录下文件的详细信息，包括文件权限。如：</strong></font></p>
            <pre><font face="Arial Narrow" color=#008080 size=4><strong> [paulin@epaul work]$ ls -l<br>
            total 8<br>
            -rwxrw-r-x    1 paulin   paul            0 12月 26 20:43 test.bin<br>
            drwxr-xr-x    2 paulin   paul         4096 12月 26 20:42 testdir<br>
            -rw-r--r--    1 paulin   paul         3052 12月 26 20:41 test.txt
            </strong></font></pre>
            <p><font face="Arial Narrow" color=#008080 size=4><strong>左边一列是文件权限，共分为四个部分，第一个部分是第一个字符，代表文件类型，第二、三、四部分都为三个字符。 </strong></font></p>
            <p><font face="Arial Narrow" color=#008080 size=4><strong>如上例种的test.bin的权限：<br><br>-rwxr-xr-x 可分为：- rwx rw- r-x<br>[list]<br>[*]- 代表文件类型为普通文件。<br>[*]rwx 代表文件所有者的权限为可读可写可执行。<br>[*]rw- 代表同组用户权限为可读可写但不可执行。<br>[*]r-w 代表其它用户权限为可读可执行但不可写。<br>[/list]</strong></font></p>
            <h2><font face="Arial Narrow" color=#008080 size=4>10.1.2操作文件的命令</font></h2>
            <h3><font face="Arial Narrow" color=#008080>1.新建文件与目录</font></h3>
            <p><font face="Arial Narrow" color=#008080 size=4><strong>touch命令可以用来新建文件，其用法为：&#8220;touch 文件名&#8221;。 </strong></font></p>
            <p><font face="Arial Narrow" color=#008080 size=4><strong>mkdir命令可以新建目录，其用法为：&#8220;mkdir 目录名&#8221;。如：</strong></font></p>
            <pre><font face="Arial Narrow" color=#008080 size=4><strong>[paulin@epaul paulin]$ mkdir sampdir</strong></font></pre>
            <h3><font face="Arial Narrow" color=#008080>2.cat命令与操作文件</font></h3>
            <p><font face="Arial Narrow" color=#008080 size=4><strong>1)cat命令最基本的用法为用法为：&#8220;cat 文件名&#8221;用来查看文件的内容。<br><br>cat命令还可以通过管道符联合more程序来查看一屏无法显示完成的文件，如cat filename.txt | more 。<br><br>2)cat重定向，cat与&gt;符号一起使用(如cat &gt; filename.txt)可以重定向标准输出到文件。输入此命令后按回车键([ENTER])转到一个空行，可以连续输入多行，输入完成后按CTRL+D组合键退出cat，这个时候刚刚输入就将重定向到filename.txt。cat与重定向符号&gt;的组合也可以这样来用，如：cat filename.txt &gt; file2.txt，这时输出将被重定向到file2.txt。</strong></font></p>
            <h3><font face="Arial Narrow" color=#008080>3.文件查看</font></h3>
            <p><font face="Arial Narrow" color=#008080 size=4><strong>除了cat命令外其它的文件查看命令还有more、less、head、tail等。 </strong></font></p>
            <p><font face="Arial Narrow" color=#008080 size=4><strong>当用cat查看较长的文件时候可能一屏看不完，这个时候我们可以用more或者less来代替cat，more可以通过空格键转到下一屏，而less种用p。more和less命令都可以用q来退出。head和tail命令分别用来查看文件的头部和尾部。</strong></font></p>
            <h3><font face="Arial Narrow" color=#008080>4.修改文件权限</font></h3>
            <p><font face="Arial Narrow" color=#008080 size=4><strong>一个文件的访问权限可以通过chmod命令来设定。chown命令用来更改某个文件或目录的所有者。chgrp命令用来更改某个文件或目录的用户组。</strong></font></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.cnitblog.com/sunnywang/aggbug/55690.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sunnywang/" target="_blank">sunnywang   </a> 2009-03-24 09:29 <a href="http://www.cnitblog.com/sunnywang/archive/2009/03/24/55690.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL中CLR用户自定义数据是什么意思？</title><link>http://www.cnitblog.com/sunnywang/archive/2008/11/28/52032.html</link><dc:creator>sunnywang   </dc:creator><author>sunnywang   </author><pubDate>Fri, 28 Nov 2008 08:50:00 GMT</pubDate><guid>http://www.cnitblog.com/sunnywang/archive/2008/11/28/52032.html</guid><wfw:comment>http://www.cnitblog.com/sunnywang/comments/52032.html</wfw:comment><comments>http://www.cnitblog.com/sunnywang/archive/2008/11/28/52032.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/sunnywang/comments/commentRss/52032.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/sunnywang/services/trackbacks/52032.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; SQL Server CLR 集成简介 <br><br>&nbsp;&nbsp;&nbsp; 公共语言运行库 (CLR) 是 Microsoft .NET Framework 的核心，为所有 .NET Framework 代码提供执行环境。在 CLR 中运行的代码称为托管代码。CLR 提供执行程序所需的各种函数和服务，包括实时 (JIT) 编译、分配和管理内存、强制类型安全性、异常处理、线程管理和安全性。 <br><br>&nbsp; 通过在 Microsoft SQL Server 中托管 CLR（称为 CLR 集成），可以在托管代码中编写存储过程、触发器、用户定义函数、用户定义类型和用户定义聚合函数。因为托管代码在执行之前会编译为本机代码，所以，在有些方案中可以大大提高性能。 <br><br>&nbsp; 托管代码使用代码访问安全性 (CAS)、代码链接和应用程序域来阻止程序集执行某些操作。SQL Server 2005 使用 CAS 帮助保证托管代码的安全，并避免操作系统或数据库服务器受到威胁。 <br><br>&nbsp; CLR 集成的优点 <br>Transact-SQL 专门为数据库中的直接数据访问和操作而设计。尽管 Transact-SQL 在数据访问和管理方面领先，但是它没有提供编程构造来使数据操作和计算更加容易。例如，Transact-SQL 不支持数组、集合、for-each 循环、位转移或类。尽管在 Transact-SQL 中可以模拟其中某些构造，但是托管代码对这些构造提供集成支持。根据方案的不同，这些功能可以为使用托管代码实现某些数据库功能提供令人心动的理由。 <br><br>Microsoft Visual Basic .NET 和 Microsoft Visual C# 提供面向对象的功能，例如封装、继承和多态性。现在，相关代码可以很容易在类和命名空间中进行组织。在使用大量服务器代码时，这样可以更容易地组织和维护您的代码。 <br><br>&nbsp;对于计算和复杂的执行逻辑，托管代码比 Transact-SQL 更适合，它全面支持许多复杂的任务，包括字符串处理和正则表达式。通过 .NET Framework 库中提供的功能，可以访问数千个预生成的类和例程。可以很容易从任何存储过程、触发器或用户定义函数进行访问。基类库 (BCL) 包括的类提供用于字符串操作、高级数学运算、文件访问、加密等的功能。 <br><br>&nbsp; 注意 <br>尽管其中许多类可以从 SQL Server 的 CLR 代码中使用，但是不适合服务器端使用的类（例如窗口类）将无法使用。 <br><br><br>&nbsp;&nbsp;&nbsp; 托管代码的一个优点是类型安全性，即确保代码只通过正确定义并且权限许可的方式访问类型。在执行托管代码之前，CLR 将验证代码是否安全。例如，通过检查代码来确保不读取以前未曾写入的内存。CLR 还可以帮助确保代码不操作非托管内存。 <br><br>&nbsp;&nbsp;&nbsp; 选择 Transact-SQL 和托管代码 <br>在编写存储过程、触发器和用户定义函数时，必须做的一个决定是使用传统的 Transact-SQL 还是使用 Visual Basic .NET 或 Visual C# 等 .NET Framework 语言。对于几乎或根本不需要过程逻辑的数据访问，请使用 Transact-SQL。对于具有复杂逻辑的 CPU 密集型函数和过程，或要使用 .NET Framework 的 BCL 时，请使用托管代码。 <br><br>&nbsp;&nbsp; 选择在服务器中执行和在客户端中执行 <br>决定使用 Transact-SQL 还是托管代码的另一个因素是您希望代码驻留的位置，驻留在服务器计算机上还是客户端计算机上。Transact-SQL 和托管代码均可以在服务器上运行。这样使代码和数据距离很近，可以利用服务器的处理能力。另一方面，您可能希望避免将处理器密集型任务放在数据库服务器上。现在，大多数客户端计算机非常强大，您可能希望将尽可能多的代码放在客户端上，以利用客户端的处理能力。托管代码可以在客户端计算机上运行，而 Transact-SQL 不能。 <br><br>&nbsp;&nbsp; 选择扩展存储过程和托管代码 <br>生成的扩展存储过程可以执行 Transact-SQL 存储过程无法执行的功能。但是，扩展存储过程会影响 SQL Server 进程的完整性，而通过类型安全性验证的托管代码不会。另外，内存管理、线程和构造的调度以及同步服务在 CLR 的托管代码与 SQL Server 之间更深入地集成。通过 CLR 集成，可以通过比扩展存储过程更加安全、可伸缩性更强的方式来编写所需的存储过程，以执行 Transact-SQL 中无法执行的任务。
<img src ="http://www.cnitblog.com/sunnywang/aggbug/52032.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sunnywang/" target="_blank">sunnywang   </a> 2008-11-28 16:50 <a href="http://www.cnitblog.com/sunnywang/archive/2008/11/28/52032.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>doc文档格式破坏之后怎么办？</title><link>http://www.cnitblog.com/sunnywang/archive/2008/09/30/49659.html</link><dc:creator>sunnywang   </dc:creator><author>sunnywang   </author><pubDate>Tue, 30 Sep 2008 02:54:00 GMT</pubDate><guid>http://www.cnitblog.com/sunnywang/archive/2008/09/30/49659.html</guid><wfw:comment>http://www.cnitblog.com/sunnywang/comments/49659.html</wfw:comment><comments>http://www.cnitblog.com/sunnywang/archive/2008/09/30/49659.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnitblog.com/sunnywang/comments/commentRss/49659.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/sunnywang/services/trackbacks/49659.html</trackback:ping><description><![CDATA[&nbsp;&nbsp; 忽遇DOC文档格式被破坏， 要求文档恢复，xuanMM ,采用以下办法就挽救了doc文档：<br>1.首先在&#8220;命令&#8221;处输入&#8220;%temp%&#8221;这个自然是查找临时文件了，最好让这些被找到的文件按照修改时间排列，打开一些doc文件，看是不是刚才写的文档。<br>2.上步的操作不成功， 将被破坏的doc 文档， 点击鼠标右键， 使用&#8220;记事本&#8221;等打开， 这样好像就打开了， 将在记事本上打开的文件全部粘贴到一个新的doc 文件中即可。<br><br>&nbsp; 此时， 很多图形被破坏了， 不过， 这个就没有办法了， 只有重新再沾了。 
<img src ="http://www.cnitblog.com/sunnywang/aggbug/49659.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sunnywang/" target="_blank">sunnywang   </a> 2008-09-30 10:54 <a href="http://www.cnitblog.com/sunnywang/archive/2008/09/30/49659.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>excel表格中打开的时间没有默认打开一个文件 情况的参数配置</title><link>http://www.cnitblog.com/sunnywang/archive/2008/05/22/44087.html</link><dc:creator>sunnywang   </dc:creator><author>sunnywang   </author><pubDate>Thu, 22 May 2008 04:37:00 GMT</pubDate><guid>http://www.cnitblog.com/sunnywang/archive/2008/05/22/44087.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;先打开一个excel文件<br>&nbsp;&nbsp; 工具<br>&nbsp;&nbsp; 选项<br>&nbsp; 常规<br>&nbsp; 同时去掉勾选&nbsp;&nbsp; &#8220;忽略其他应用程序&#8221;和&#8220;提示输入工作簿摘要信息&#8221; <br>即可。<br>
<img src ="http://www.cnitblog.com/sunnywang/aggbug/44087.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sunnywang/" target="_blank">sunnywang   </a> 2008-05-22 12:37 <a href="http://www.cnitblog.com/sunnywang/archive/2008/05/22/44087.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> Data Intergrator  的主要解决方案：ETL 的技术的介绍</title><link>http://www.cnitblog.com/sunnywang/archive/2008/05/08/43510.html</link><dc:creator>sunnywang   </dc:creator><author>sunnywang   </author><pubDate>Thu, 08 May 2008 07:49:00 GMT</pubDate><guid>http://www.cnitblog.com/sunnywang/archive/2008/05/08/43510.html</guid><wfw:comment>http://www.cnitblog.com/sunnywang/comments/43510.html</wfw:comment><comments>http://www.cnitblog.com/sunnywang/archive/2008/05/08/43510.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/sunnywang/comments/commentRss/43510.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/sunnywang/services/trackbacks/43510.html</trackback:ping><description><![CDATA[摘要：数据集成是把不同来源、格式和特点的数据在逻辑上或物理上有机地集中，从而为企业提供全面的数据共享，是企业商务智能、数据仓库系统的重要组成部分。ETL是企业数据集成的主要解决方案。文章从ETL的概念出发，简要分析了当前ETL中用到的一些基本技术，为ETL系统的开发和ETL技术的应用提供一些参考。 <br><br>1.ETL简介 <br><br>　　随着企业信息化建设的发展，巨大的投资为企业建立了众多的信息系统，以帮助企业进行内外部业务的处理和管理工作。但是随着信息系统的增加，各自孤立工作的信息系统将会造成大量的冗余数据和业务人员的重复劳动。企业应用集成（EAI，Enterprise&nbsp;Application&nbsp;Integration）应运而生。EAI通过建立底层数据交换平台来联系横贯整个企业的异构系统、应用、数据源等，完成在企业内部的ERP、CRM、SCM、数据库、数据仓库，以及其它重要的内部系统之间无缝地共享和交换数据的需要。数据集成是企业应用集成的重要环节，企业实现数据集成，可以使更多的人更充分地使用已有数据资源，减少资料收集、数据采集等重复劳动和相应费用。 <br>　　但是，在实施数据集成的过程中，由于不同用户提供的数据可能来自不同的途径，其数据内容、数据格式和数据质量千差万别，有时甚至会遇到数据格式不能转换或数据转换格式后丢失信息等棘手问题，严重阻碍了数据在各部门和各应用系统中的流动与共享。因此，如何对数据进行有效的集成管理已成为增强企业商业竞争力的必然选择。<br><br>ETL是实现数据集成的主要技术。 <br><br>　　ETL中三个字母分别代表的是Extract、Transform、Load，即抽取、转换、加载。<br>（1）数据抽取：从源数据源系统抽取目的数据源系统需要的数据；<br>（2）数据转换：将从源数据源获取的数据按照业务需求，转换成目的数据源要求的形式，并对错误、不一致的数据进行清洗和加工。<br>（3）数据加载：将转换后的数据装载到目的数据源。 <br><br>　　ETL原本是作为构建数据仓库的一个环节，负责将分布的、异构数据源中的数据如关系数据、平面数据文件等抽取到临时中间层后进行清洗、转换、集成，最后加载到数据仓库或数据集市中，成为联机分析处理、数据挖掘的基础。<br>现在也越来越多地将ETL应用于一般信息系统中数据的迁移、交换和同步。<br><br>一个简单的ETL体系结构如图1.1所示。 <br><br>2.ETL中的关键技术 <br><br>　　ETL过程中的主要环节就是数据抽取、数据转换和加工、数据装载。为了实现这些功能，各个ETL工具一般会进行一些功能上的扩充，例如工作流、调度引擎、规则引擎、脚本支持、统计信息等。 <br><br>2.1&nbsp;数据抽取 <br>　　数据抽取是从数据源中抽取数据的过程。实际应用中，数据源较多采用的是关系数据库。从数据库中抽取数据一般有以下几种方式。 <br>(1)全量抽取 <br>　　全量抽取类似于数据迁移或数据复制，它将数据源中的表或视图的数据原封不动的从数据库中抽取出来，并转换成自己的ETL工具可以识别的格式。全量抽取比较简单。 <br><br>(2)增量抽取 <br>　　增量抽取只抽取自上次抽取以来数据库中要抽取的表中新增或修改的数据。在ETL使用过程中。增量抽取较全量抽取应用更广。如何捕获变化的数据是增量抽取的关键。对捕获方法一般有两点要求：准确性，能够将业务系统中的变化数据按一定的频率准确地捕获到；性能，不能对业务系统造成太大的压力，影响现有业务。<br><br>目前增量数据抽取中常用的捕获变化数据的方法有： <br><br>　　　a.触发器：在要抽取的表上建立需要的触发器，一般要建立插入、修改、删除三个触发器，每当源表中的数据发生变化，就被相应的触发器将变化的数据写入一个临时表，抽取线程从临时表中抽取数据，临时表中抽取过的数据被标记或删除。触发器方式的优点是数据抽取的性能较高，缺点是要求业务表建立触发器，对业务系统有一定的影响。&nbsp;<br><br>&nbsp;　　　b.时间戳：它是一种基于快照比较的变化数据捕获方式，在源表上增加一个时间戳字段，系统中更新修改表数据的时候，同时修改时间戳字段的值。当进行数据抽取时，通过比较系统时间与时间戳字段的值来决定抽取哪些数据。有的数据库的时间戳支持自动更新，即表的其它字段的数据发生改变时，自动更新时间戳字段的值。有的数据库不支持时间戳的自动更新，这就要求业务系统在更新业务数据时，手工更新时间戳字段。同触发器方式一样，时间戳方式的性能也比较好，数据抽取相对清楚简单，但对业务系统也有很大的倾入性（加入额外的时间戳字段），特别是对不支持时间戳的自动更新的数据库，还要求业务系统进行额外的更新时间戳操作。另外，无法捕获对时间戳以前数据的delete和update操作,在数据准确性上受到了一定的限制。 <br><br>　　　c.全表比对：典型的全表比对的方式是采用MD5校验码。ETL工具事先为要抽取的表建立一个结构类似的MD5临时表，该临时表记录源表主键以及根据所有字段的数据计算出来的MD5校验码。每次进行数据抽取时，对源表和MD5临时表进行MD5校验码的比对，从而决定源表中的数据是新增、修改还是删除，同时更新MD5校验码。MD5方式的优点是对源系统的倾入性较小（仅需要建立一个MD5临时表），但缺点也是显而易见的，与触发器和时间戳方式中的主动通知不同，MD5方式是被动的进行全表数据的比对，性能较差。当表中没有主键或唯一列且含有重复记录时，MD5方式的准确性较差。 <br><br>　　　d.日志对比：通过分析数据库自身的日志来判断变化的数据。<br>Oracle的改变数据捕获（CDC，Changed&nbsp;Data&nbsp;Capture）技术是这方面的代表。<br>CDC&nbsp;特性是在Oracle9i数据库中引入的。CDC能够帮助你识别从上次抽取之后发生变化的数据。利用CDC，在对源表进行insert、update或&nbsp;delete等操作的同时就可以提取数据，并且变化的数据被保存在数据库的变化表中。这样就可以捕获发生变化的数据，然后利用数据库视图以一种可控的方式提供给目标系统。<span style="COLOR: #800080"><strong>CDC体系结构基于发布者/订阅者模型</strong>。</span>发布者捕捉变化数据并提供给订阅者。订阅者使用从发布者那里获得的变化数据。通常，CDC系统拥有一个发布者和多个订阅者。发布者首先需要识别捕获变化数据所需的源表。然后，它捕捉变化的数据并将其保存在特别创建的变化表中。它还使订阅者能够控制对变化数据的访问。订阅者需要清楚自己感兴趣的是哪些变化数据。一个订阅者可能不会对发布者发布的所有数据都感兴趣。订阅者需要创建一个订阅者视图来访问经发布者授权可以访问的变化数据。<br><span style="COLOR: #800080"><strong>CDC分为同步模式和异步模式</strong></span>，同步模式实时的捕获变化数据并存储到变化表中，发布者与订阅都位于同一数据库中。异步模式则是基于Oracle的流复制技术。 <br><br>　　ETL处理的数据源除了关系数据库外，还可能是<span style="COLOR: #800000"><strong>文件</strong></span>，例如txt文件、excel文件、xml文件等。对文件数据的抽取一般是进行全量抽取，一次抽取前可保存文件的时间戳或计算文件的MD5校验码，下次抽取时进行比对，如果相同则可忽略本次抽取。 <br><br>2.2&nbsp;数据转换和加工 <br><br>　　从数据源中抽取的数据不一定完全满足目的库的要求，例如数据格式的不一致、数据输入错误、数据不完整等等，因此有必要对抽取出的数据进行数据转换和加工。 <br><br>数据的转换和加工可以在ETL引擎中进行，也可以在数据抽取过程中利用关系数据库的特性同时进行。 <br><br>(1)ETL引擎中的数据转换和加工 <br>　　ETL引擎中一般<u>以组件化的方式</u>实现数据转换。常用的数据转换组件有字段映射、数据过滤、数据清洗、数据替换、数据计算、数据验证、数据加解密、数据合并、数据拆分等。这些组件如同<u>一条流水线上的一道道工序，它们是可插拔的，且可以任意组装，各组件之间通过数据总线共享数据。</u> <br><br>有些ETL工具还提供了脚本支持，使得用户可以以一种编程的方式定制数据的转换和加工行为。 <br><br>(2)在数据库中进行数据加工 <br>　　关系数据库本身已经提供了强大的SQL、函数来支持数据的加工，如在SQL查询语句中添加where条件进行过滤，查询中重命名字段名与目的表进行映射，substr函数，case条件判断等等。下面是一个SQL查询的例子。 <br><br>　select&nbsp;ID&nbsp;as&nbsp;USERID,&nbsp;substr(TITLE,&nbsp;1,&nbsp;20)&nbsp;as&nbsp;TITLE,&nbsp;case&nbsp;when&nbsp;REMARK&nbsp;is&nbsp;null&nbsp;then&nbsp;'&nbsp;'&nbsp;else&nbsp;REMARK&nbsp;end&nbsp;as&nbsp;CONTENT&nbsp;from&nbsp;TB_REMARK&nbsp;where&nbsp;ID&nbsp;&gt;&nbsp;100;&nbsp; <br><br><br>　　<img src="http://www.cnitblog.com/CuteSoft_Client/CuteEditor/images/emrainbow.gif" align=absMiddle border=0>相比在ETL引擎中进行数据转换和加工，直接在SQL语句中进行转换和加工更加简单清晰，性能更高。对于SQL语句无法处理的可以交由ETL引擎处理。 <br><br>2.3&nbsp;数据装载 <br><br>　　将转换和加工后的数据装载到目的库中通常是ETL过程的最后步骤。装载数据的最佳方法取决<u>于所执行操作的类型以及需要装入多少数据</u>。当目的库是关系数据库时，一般来说有两种装载方式： <br><br>　　(1)直接SQL语句进行insert、update、delete操作。 <br><br>　　(2)采用批量装载方法，如bcp、bulk、关系数据库特有的批量装载工具或api。<br>&nbsp;<br>　　大多数情况下会使用第一种方法，因为它们<u>进行了日志记录并且是可恢复的。但是，批量装载操作易于使用</u>，并且在装入大量数据时效率较高。使用哪种数据装载方法取决于业务系统的需要。 <br><br>　　3.主流ETL工具 <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ETL工具从厂商来看分为两种,一种是数据库厂商自带的ETL工具,如Oracle&nbsp;warehouse&nbsp;builder、Oracle&nbsp;Data&nbsp;Integrator。另外一种是第三方工具提供商，如Kettle。开源世界也有很多的ETL工具，功能各异，强弱不一。 <br><br>(1)Oracle&nbsp;Data&nbsp;Integrator（ODI） <br>　　ODI前身是Sunopsis&nbsp;Active&nbsp;Integration&nbsp;Platform，在2006年底被Oracle收购，重新命名为Oracle&nbsp;Data&nbsp;Integrator，<br>&nbsp; 主要定位于在ETL和数据集成的场景里使用。<br>ODI和Oracle原来的ETL工具OWB相比有一些显著的特点，比如和OWB一样是ELT架构，但是比OWB支持更多的异构的数据源，<br>ODI提供了call&nbsp;web&nbsp;service的机制，并且ODI的接口也可以暴露为web&nbsp;service，从而可以和SOA环境进行交互。ODI能够检测事件，一个事件可以触发ODI的一个接口流程，从而完成近乎实时的数据集成。 <br><br>　ODI的主要功能特点有： <br>　　a.使用CDC作为变更数据捕获的捕获方式。&nbsp; <br>　　b.代理支持并行处理和负载均衡。 <br>　　c.完善的权限控制、版本管理功能。 <br>　　d.支持数据质量检查，清洗和回收脏数据。 <br>　　e.支持与JMS消息中间件集成。 <br>　　f.支持Web&nbsp;Service。 <br><br>(2)SQL&nbsp;Server&nbsp;Integration&nbsp;Services（SSIS） <br><br>　　SSIS是SQL&nbsp;Server&nbsp;2005的新成员，在SQL&nbsp;Server的早期版本中，其实就已经有了它的雏形，那时的名称叫做<u>数据转换服务（DTS）。</u>在SQL&nbsp;Server&nbsp;2005的前两个版本SQL&nbsp;Server&nbsp;7.0和SQL&nbsp;Server&nbsp;2000中，<u>DTS主要集中于提取和加载</u>。通过使用DTS，可以从任何数据源中提取数据以及将数据加载到任何数据源中。<br>在SQL&nbsp;Server&nbsp;2005中，对DTS进行了重新设计和改进形成了SSIS。<br>SSIS提供了数据相关的控制流、数据流、日志、变量、event、连接管理等基础设施。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 控制流也称为工作流或者任务流，它更像工作流，在工作流中每个组件都是一个任务。这些任务是按预定义的顺序执行的。在任务流中可能有分支。当前任务的执行结果决定沿哪条分支前进。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据流是新的概念。数据流也称为流水线，主要解决数据转换的问题。数据流由一组预定义的转换操作组成。数据流的起点通常是数据源(源表)；数据流的终点通常是数据的目的地(目标表)。可以将数据流的执行认为是一个流水线的过程，在该过程中，每一行数据都是装配线中需要处理的零件，而每一个转换都是装配线中的处理单元。 <br>
<img src ="http://www.cnitblog.com/sunnywang/aggbug/43510.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sunnywang/" target="_blank">sunnywang   </a> 2008-05-08 15:49 <a href="http://www.cnitblog.com/sunnywang/archive/2008/05/08/43510.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>创新性应用    数据建模经验谈</title><link>http://www.cnitblog.com/sunnywang/archive/2008/04/30/43124.html</link><dc:creator>sunnywang   </dc:creator><author>sunnywang   </author><pubDate>Wed, 30 Apr 2008 08:38:00 GMT</pubDate><guid>http://www.cnitblog.com/sunnywang/archive/2008/04/30/43124.html</guid><wfw:comment>http://www.cnitblog.com/sunnywang/comments/43124.html</wfw:comment><comments>http://www.cnitblog.com/sunnywang/archive/2008/04/30/43124.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/sunnywang/comments/commentRss/43124.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/sunnywang/services/trackbacks/43124.html</trackback:ping><description><![CDATA[<h1 class=headtit>&nbsp;</h1>
<div class=artl_con>
<div class=wenzhang>
<div class=huazhonghua><span id=hua1></span>&nbsp;</div>
　笔者从98年进入数据库及数据仓库领域工作至今已经有近八年的时间，对数据建模工作接触的比较多，创新性不敢谈，本文只是将工作中的经验总结出来，供大家一同探讨和指正。<br><br>　　提起数据建模来，有一点是首先要强调的，数据建模师和DBA有着较大的不同，对数据建模师来说，对业务的深刻理解是第一位的，不同的建模方法和技巧是为业务需求来服务的。而本文则暂时抛开业务不谈，主要关注于建模方法和技巧的经验总结。 <br><br>　　从目前的数据库及数据仓库建模方法来说，主要分为四类。 <br><br>　　第一类是大家最为熟悉的关系数据库的三范式建模，通常我们将三范式建模方法用于建立各种操作型数据库系统。 <br><br>　　第二类是Inmon提倡的三范式数据仓库建模，它和操作型数据库系统的三范式建模在侧重点上有些不同。Inmon的数据仓库建模方法分为三层，第一层是实体关系层，也即企业的业务数据模型层，在这一层上和企业的操作型数据库系统建模方法是相同的；第二层是数据项集层，在这一层的建模方法根据数据的产生频率及访问频率等因素与企业的操作型数据库系统的建模方法产生了不同；第三层物理层是第二层的具体实现。 <br><br>　　第三类是Kimball提倡的数据仓库的维度建模，我们一般也称之为星型结构建模，有时也加入一些雪花模型在里面。维度建模是一种面向用户需求的、容易理解的、访问效率高的建模方法，也是笔者比较喜欢的一种建模方式。 <br><br>　　第四类是更为灵活的一种建模方式，通常用于后台的数据准备区，建模的方式不拘一格，以能满足需要为目的，建好的表不对用户提供接口，多为临时表。 <br><br>　　下面简单谈谈第四类建模方法的一些的经验。 <br><br>　　数据准备区有一个最大的特点，就是不会直接面对用户，所以对数据准备区中的表进行操作的人只有ETL工程师。ETL工程师可以自己来决定表中数据的范围和数据的生命周期。下面举两个例子： <br><br>　　1）数据范围小的临时表 <br><br>　　当需要整合或清洗的数据量过大时，我们可以建立同样结构的临时表，在临时表中只保留我们需要处理的部分数据。这样，不论是更新还是对表中某些项的计算都会效率提高很多。处理好的数据发送入准备加载到数据仓库中的表中，最后一次性加载入数据仓库。 <br><br>　　2）带有冗余字段的临时表 <br><br>　　由于数据准备区中的表只有自己使用，所以建立冗余字段可以起到很好的作用而不用承担风险。 <br><br>　　举例来说，笔者在项目中曾遇到这样的需求，客户表，债项表，即客户和债项是一对多的关系。其中，客户净扣值和债项余额已知，需要计算债项净扣值。计算的规则是按债项余额的比例分配客户的净扣值。这时，我们可以给两个表增加几个冗余字段，如客户表，债项表。这样通过三条SQL就可以直接完成整个计算过程。将债项余额汇总到客户余额，将客户余额和客户净扣值冗余到债项表中，在债项表中通过（债项余额&#215;客户净扣值/客户余额）公式即可直接计算处债项净扣值。 <br><br>　　另外还有很多大家可以发挥的建表方式，如不需要主键的临时表等等。总结来说，正因为数据准备区是不对用户提供接口的，所以我们一定要利用好这一点，以给我们的数据处理工作带来最大的便利为目的来进行数据准备区的表设计。
<p>　　行业借鉴经验： <br><br>　　数据仓库架构经验谈 <br><br>　　对于数据仓库的架构方法，不同的架构师有不同的原则和方法，笔者在这里来总结一下当前常采用的架构方式及其优缺点。这些架构方式不限于某个行业，可以供各个行业借鉴使用。 <br><br>　　首先需要说明的一点是，目前在数据仓库领域比较一致的意见是在数据仓库中需要保留企业范围内一致的原子层数据。而独立的数据集市架构（Independent data marts）没有企业范围内一致的数据，很可能会导致信息孤岛的产生，除非在很小的企业内或只针对固定主题，否则不建议建立这样的架构方式。联邦式的数据仓库架构（Federated Data Warehouse Architecture）不管是在地域上的联邦还是功能上的联邦都需要先在不同平台上建立各自的数据仓库，再通过参考（reference）数据来实现整合，而这样很容易造成整合的不彻底，除非联邦式的数据仓库架构也采用Kimball的总线架构（Bus Architecture）中类似的功能，即在数据准备区保留一致性维度（Conformed Table）并不断更新它。所以，这两种架构方式不在讨论范围之内。下面主要讨论剩下的三种架构方式。 <br><br>　　1）三范式（3NF）的原子层＋数据集市 <br><br>　　这样的数据仓库架构最大的倡导者就是数据仓库之父Inmon，而他的企业信息工厂（Corporate Information System）就是典型的代表。这样的架构也称之为企业数据仓库（Enterprise Data Warehouse，EDW）。企业信息工厂的实现方式是，首先进行全企业的数据整合，建立企业信息模型，即EDW。对于各种分析需求再建立相应的数据集市或者探索仓库，其数据来源于EDW。三范式的原子层给建立OLAP带来一定的复杂性，但是对于建立更复杂的应用，如挖掘仓库、探索仓库提供了更好的支持。这类架构的建设周期比较长，相应的成本也比较高。 <br><br>　　2）星型结构（Star Schema）的原子层＋HOLAP <br><br>　　星型结构最大的倡导者是Kimall，他的总线架构是该类架构的典型代表。总线架构实现方式是，首先在数据准备区中建立一致性维度、建立一致性事实的计算方法；其次在一致性维度、一致性事实的基础上逐步建立数据集市。每次增加数据集市，都会在数据准备区整合一致性维度，并将整合好的一致性维度同步更新到所有的数据集市。这样，建立的所有数据集市合在一起就是一个整合好的数据仓库。正是因为总线架构这个可以逐步建立的特点，它的开发周期比其他架构方式的开发周期要短，相应的成本也要低。在星型结构的原子层上可以直接建立聚集，也可以建立HOLAP。笔者比较倾向于Kimball的星型结构的原子层架构，在这种架构中的经验也比较多。 <br><br>　　3）三范式（3NF）的原子层＋ROLAP <br><br>　　这样的数据仓库架构也称为集中式架构（Centralized Architecture），思路是在三范式的原子层上直接建立ROLAP，做的比较出色的就是MicroStrategy。在三范式的原子层上定义ROLAP比在星型结构的原子层上定义ROLAP要复杂很多。采用这种架构需要在定义ROLAP是多下些功夫，而且ROLAP的元数据不一定是通用的格式，所以对ROLAP做展现很可能会受到工具的局限。这类架构和第一类很相似，只是少了原子层上的数据集市。 <br><br>　　总结来说，这三种数据仓库的架构方式都是不错的选择。对于需要见效快、成本低的项目可以考虑采用第二种总线架构，对于资金充足并有成熟业务数据模型的企业可以考虑采用第一种架构或第三种架构。 </p>
<p>　　应用难点技巧： <br><br>　　变化数据捕获经验谈 <br><br>　　在数据仓库系统中，一个很重要的目的就是保留数据的历史变化信息。而变化数据捕获（Change Data Capture，CDC）就是为这个目的而产生的一项技术。变化数据捕获常用的方法有：1）文件或者表的全扫描对比，2）DBMS日志获取，3）在源系统中增加触发器获取，4）基于源系统的时间戳获取，5）基于复制技术的获取，6）DBMS提供的变化数据捕获方法等。其中，由DBMS提供变化数据捕获的方法是大势所趋，即具体的捕获过程由DBMS来完成。 <br><br>　　像银行、电信等很多行业的操作记录生成后就不会改变，只有像客户、产品等信息会随时间发生缓慢的变化，所以通常的变化数据捕获是针对维度表而言的。Kimball对缓慢变化维的分析及应对策略基本上可以处理维度表的各种变化。 <br><br>　　而对于一些零售行业，像合同表中的合同金额类似的数值在录入后是有可能会发生改变的，也就是说事实表的数据也有可能发生变化。通常对于事实表数据的修改属于勘误的范畴，可以采用类似缓慢变化维TYPE 1的处理方式直接更新事实表。笔者不太赞同对事实表的变化采用快照的方式插入一条新的事实勘误记录，这样会给后续的展现、分析程序带来太多的麻烦。 <br><br>　　接下来要讨论的是笔者曾经遇到的一个颇为棘手的事实表数据改变的问题，该事实表的主键随表中某些数据的变化发生改变。以其中的一个合同表为例，该合同表的主键是由&#8220;供货单位编号&#8221;＋&#8220;合同号&#8221;生成的智能主键，当其中的&#8220;供货单位编号&#8221;和&#8220;合同号&#8221;中任何一个发生变化时，该合同表的主键都会发生变化，给变化数据捕获带来了很大的麻烦。 <br><br>　　项目中，笔者的处理方式是采用触发器的办法来实现变化数据捕获。具体的实现方式是：<br><br>　　1）建立一个新表作为保存捕获的数据表使用，其中字段有&#8220;原主键&#8221;、&#8220;修改后主键&#8221;、及其他需要的字段，称为&#8220;合同捕获表&#8221;。<br><br>　　2）在原合同表Delete和Update时分别建立触发器，当删除操作发生时，建在Delete上的触发器会插入一条记录到&#8220;合同捕获表&#8221;，其中&#8220;修改后主键&#8221;字段为空，表示该记录是删除的记录；当发生更新时，将&#8220;原主键&#8221;、&#8220;修改后主键&#8221;及其他需要记录的字段都保存入&#8220;合同捕获表&#8221;中，表示该记录被修改过，如果&#8220;原主键&#8221;和&#8220;修改后主键&#8221;不同，则表示主键被修改，如果相同，则表示主键没有被修改。<br><br>　　3）由于操作系统中的主键通常会成为数据仓库中事实表的退化维度，可能仍会起主键的作用。所以在数据加载时，需要分情况判断&#8220;合同捕获表&#8221;的数据来决定是否更新事实表中的退化维度。 <br><br>　　可以说，这样的基于触发器的变化数据捕获方法并不是一个很好的选择。首先这需要对源系统有较大的权限；其次，触发器会给源系统的性能带来很大的影响。所以除非是没有别的选择，否则不建议采用这种方法。 <br><br>　　而对于这样的情况，我们在建立操作型数据库系统时完全可以避免。下面是对操作型数据库系统建立者的几点建议：1）操作型系统的主键不要建立成智能型的，至少不要建立成会变化的。2）操作型系统的表中需要加入操作人和操作时间字段，或者直接加入时间戳。3）操作型系统中操作型数据最好不要直接在原值上修改，可以采用&#8220;冲红&#8221;的方式加入新的记录。这样后续建立数据仓库时就不需要考虑事实表数据的变化问题。 <br><br>　　最后，期待各大数据库管理系统的厂商能尽快在DBMS层提供功能强大、简单好用的变化数据捕获功能，目前Oracle已经有了这个功能。毕竟技术方面复杂的事情留给厂商做是一个趋势，而我们做应用的则更关注于业务。</p>
</div>
</div>
<img src ="http://www.cnitblog.com/sunnywang/aggbug/43124.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sunnywang/" target="_blank">sunnywang   </a> 2008-04-30 16:38 <a href="http://www.cnitblog.com/sunnywang/archive/2008/04/30/43124.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数学建模</title><link>http://www.cnitblog.com/sunnywang/archive/2008/03/30/41676.html</link><dc:creator>sunnywang   </dc:creator><author>sunnywang   </author><pubDate>Sun, 30 Mar 2008 02:21:00 GMT</pubDate><guid>http://www.cnitblog.com/sunnywang/archive/2008/03/30/41676.html</guid><wfw:comment>http://www.cnitblog.com/sunnywang/comments/41676.html</wfw:comment><comments>http://www.cnitblog.com/sunnywang/archive/2008/03/30/41676.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/sunnywang/comments/commentRss/41676.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/sunnywang/services/trackbacks/41676.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 广义地说，一切数学概念&#247;数学理论体系、方程式和算法系统都可以称为数学模型；各种数学分支也都可以看作数学模型，<br>&nbsp;&nbsp; 狭义的数学模型的含义：<br>（1）数学模型是指解决实际问题时所用的一种数学框架。<br>&nbsp;（2）数学模型是指对于现实世界的一个特定对象，为了一个特定目的，根据其特有的内在规律作出一些必要的简化假设，并运用适当的数学工具得到的一个数学结构。<br>（3）数学模型不同于一般的模型， 它是用数学语言模拟现实的一种模型，即把一个实际问题中某些事物的主要特性、主要关系抽象成数学语言，近似地反映客观事物的内在联系与变化过程。<br><br><br>数学模型的分类：<br><br>&nbsp;按照不同的分类标准， 数学模型有如下分类：<br>（1）按模型的应用领域分为：人口模型、交通模型、环境模型、生态模型、水资源模型、城市规划模型、生产过程模型等。<br>（2）按建立模型所采用的方法分为：初等数学模型、几何模型、微分方程模型、图论模型、马氏链模型、规划论模型等。<br>（3）按模型的特性分为：确定性模型＆随机性模型&#247;静态模型＆动态模型、离散模型＆连续模型等。<br>（4）按建模的目的分为：描述模型、仿真模型、预报模型、优化模型、决策模型、控制模型等。同一个对象，由于建模目的不同，可以有不同的模型。<br>（5）按对模型结构＆参数的了解程度分为：白箱模型（模型结构＆参数都是已知的）、灰箱模型（模型结构已知但参数未知）、黑箱模型（模型结构＆参数均未知）。<br><br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据建模是指根据具体问题，在一定的假设下找出解决这个问题的数学框架， 求出模型的解，并对它进行验证的全过程。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由上可知，数学建模是一个&#8220;迭代&#8221;的过程，每次&#8220;迭代&#8221;包括建模准备、简化假设、明确变量与参数、形成数学框架、用解析法或数值法求出模型的解，对求解所得结果进行解释分析与验证。如其符合实际，可交付使用。如其与实际不符，需对假设做出修改，进入下一个迭代， 即：准备——》假设——》建模——》求解——》分析——》检验——》应用。 
<img src ="http://www.cnitblog.com/sunnywang/aggbug/41676.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sunnywang/" target="_blank">sunnywang   </a> 2008-03-30 10:21 <a href="http://www.cnitblog.com/sunnywang/archive/2008/03/30/41676.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>group by 使用并举例</title><link>http://www.cnitblog.com/sunnywang/archive/2008/03/27/41559.html</link><dc:creator>sunnywang   </dc:creator><author>sunnywang   </author><pubDate>Thu, 27 Mar 2008 07:12:00 GMT</pubDate><guid>http://www.cnitblog.com/sunnywang/archive/2008/03/27/41559.html</guid><wfw:comment>http://www.cnitblog.com/sunnywang/comments/41559.html</wfw:comment><comments>http://www.cnitblog.com/sunnywang/archive/2008/03/27/41559.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/sunnywang/comments/commentRss/41559.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/sunnywang/services/trackbacks/41559.html</trackback:ping><description><![CDATA[<h2><a id=viewpost1_TitleUrl href="http://www.blogjava.net/caixuetao/articles/36648.html"><u><font color=#0000ff>使用GROUP BY子句的规则 </font></u></a></h2>
<div class=postbody>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;使用 GROUP BY 子句时，一定要记住下面的规则：<br>
<table cellSpacing=2 cellPadding=2 width=498 border=0>
    <tbody>
        <tr>
            <td vAlign=center width=22></td>
            <td width=476>1.&nbsp; 不能 GROUP BY text、image 或 bit 数据类型的列</td>
        </tr>
        <tr>
            <td vAlign=center width=22></td>
            <td width=476><font color=#ff1493>2.&nbsp; SELECT 列表中指定的每一列也必须出现在 GROUP BY 子句中，除非这列是用于聚合函数。</font></td>
        </tr>
        <tr>
            <td vAlign=center width=22></td>
            <td width=476>3.&nbsp; 不能 GROUP BY 列的别名。 这是说 GROUP BY 字段列表中的所有字段必须是实际存在于 FROM 子句中指定的表中的列。</td>
        </tr>
        <tr>
            <td vAlign=center width=22></td>
            <td width=476>4.&nbsp; 进行分组前可以使用 WHERE 子句消除不满足条件的行。</td>
        </tr>
        <tr>
            <td vAlign=center width=22></td>
            <td width=476>5.&nbsp; 使用 GROUP BY 子句返回的组没有特定的顺序。可以使用 ORDER BY 子句指定想要的排序次序。</td>
        </tr>
    </tbody>
</table>
</div>
比如例子：<br><br>ID&nbsp;&nbsp;&nbsp; name&nbsp;&nbsp;&nbsp;&nbsp; positionNo&nbsp;&nbsp;&nbsp;&nbsp; number<br><br>1&nbsp;&nbsp;&nbsp;&nbsp; paper&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;10<br>2&nbsp;&nbsp;&nbsp;&nbsp; paper&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; 20<br>3&nbsp;&nbsp; &nbsp; paper&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;30<br>4&nbsp;&nbsp;&nbsp; &nbsp;pen&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<br>5&nbsp;&nbsp;&nbsp; &nbsp;pen&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; 1<br>6&nbsp;&nbsp;&nbsp;&nbsp; pencil&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; 1<br>7&nbsp;&nbsp;&nbsp; &nbsp;pencil&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; 1<br><br><br><br><br>&nbsp;SQL&gt;&nbsp; select&nbsp;&nbsp;name&nbsp; sum(number) totalnum&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from&nbsp; tablename<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; group by&nbsp;&nbsp; name ;<br><br><br>&nbsp;&nbsp;此时， 将按name分组，&nbsp;每一个组将返回一条记录，totalnum&nbsp; 中是改组中所number&nbsp;之和。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; totalnium<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; paper&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 60<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pen&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; 2<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pencil&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<img src ="http://www.cnitblog.com/sunnywang/aggbug/41559.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sunnywang/" target="_blank">sunnywang   </a> 2008-03-27 15:12 <a href="http://www.cnitblog.com/sunnywang/archive/2008/03/27/41559.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>理解XML Schema  xml schema 初步</title><link>http://www.cnitblog.com/sunnywang/archive/2007/12/24/38031.html</link><dc:creator>sunnywang   </dc:creator><author>sunnywang   </author><pubDate>Mon, 24 Dec 2007 06:56:00 GMT</pubDate><guid>http://www.cnitblog.com/sunnywang/archive/2007/12/24/38031.html</guid><wfw:comment>http://www.cnitblog.com/sunnywang/comments/38031.html</wfw:comment><comments>http://www.cnitblog.com/sunnywang/archive/2007/12/24/38031.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/sunnywang/comments/commentRss/38031.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/sunnywang/services/trackbacks/38031.html</trackback:ping><description><![CDATA[文章系列是XML Schema的一个从入门到进阶的基本教程。内容主要翻译整理了W3C关于XML Schema的入门级规范：XML Schema Part 0： Primer（ http://www.w3.org/TR/xmlschema-0/），同时译者添加了一些个人的编注，并重新整理安排了章节。奉献给大家，旨在让更多的读者来了解，熟悉XML Schema. XML Schema是W3C的推荐标准，于2001年5月正式发布，经过数年的大规模讨论和开发，终于最终奠定下来，使得XML建模有了一个国际标准。XML Schema一确定下来，立刻成为全球公认得首选XML环境下的建模工具，已经基本取代了DTD在XML刚刚成为W3C推荐标准时的地位。由于XML是SGML的一个子集，因此它也继承了SGML世界中用于建模的DTD，当时使用DTD的好处是可以利用大量的在SGML世界中现有的DTD工具，使得开发应用代价维持在一个相对较低的水平。然而，DTD有着不少缺陷：1）DTD是基于正则表达式的，描述能力有限；2） DTD没有数据类型的支持，在大多数应用环境下能力不足；3） DTD的约束定义能力不足，无法对XML实例文档作出更细致的语义限制；4） DTD的结构不够结构化，重用的代价相对较高；5）DTD并非使用XML作为描述手段，而DTD的构建和访问并没有标准的编程接口，无法使用标准的编程方式进行DTD维护。而XML Schema正是针对这些DTD的缺点而设计的，XML Schema是完全使用XML作为描述手段，具有很强的描述能力、扩展能力和处理维护能力。
<p>&nbsp;&nbsp;&nbsp; XML Schema的主要目的是用来定义一类XML文档（一个XML Application）。因此模式的"实例文档"形式常常用来描述一个与特定XML Schema相一致的XML文档。事实上，文档实例和Schema文档都不是必须要以文档的形式存在，他们可以存在以于应用之间传递的字节流的形式存在，或者作为一个数据库记录或者作为XML的"信息项"的集合而存在。然而为了简化入门，我们总是把实例和模式看作文档或者文件，认为它们总以文档实例或是模式文档的形式存在。让我们开始考虑一个在文件po.xml中的实例文档。它描述了一个由家庭产品采购和支付应用生成的购买订单。<br><br>po.xml，购买订单的XML实例文档<br><br>&lt;?xml&nbsp;version="1.0"?&gt;<br>&lt;purchaseOrder&nbsp;orderDate="1999-10-20"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;shipTo&nbsp;country="US"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;name&gt;Alice&nbsp;Smith&lt;/name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;street&gt;123&nbsp;Maple&nbsp;Street&lt;/street&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;city&gt;Mill&nbsp;Valley&lt;/city&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;state&gt;CA&lt;/state&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;zip&gt;90952&lt;/zip&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/shipTo&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;billTo&nbsp;country="US"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;name&gt;Robert&nbsp;Smith&lt;/name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;street&gt;8&nbsp;Oak&nbsp;Avenue&lt;/street&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;city&gt;Old&nbsp;Town&lt;/city&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;state&gt;PA&lt;/state&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;zip&gt;95819&lt;/zip&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/billTo&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;comment&gt;Hurry,&nbsp;my&nbsp;lawn&nbsp;is&nbsp;going&nbsp;wild!&lt;/comment&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;items&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;item&nbsp;partNum="872-AA"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;productName&gt;Lawnmower&lt;/productName&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;quantity&gt;1&lt;/quantity&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;USPrice&gt;148.95&lt;/USPrice&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;comment&gt;Confirm&nbsp;this&nbsp;is&nbsp;electric&lt;/comment&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/item&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;item&nbsp;partNum="926-AA"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;productName&gt;Baby&nbsp;Monitor&lt;/productName&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;quantity&gt;1&lt;/quantity&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;USPrice&gt;39.98&lt;/USPrice&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;shipDate&gt;1999-05-21&lt;/shipDate&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/item&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/items&gt;<br>&lt;/purchaseOrder&gt;<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; 购买订单由一个主元素purchaseOrder和子元素shipTo、billTo、comment和items组成。这些子元素（除了comment）也依次包括其他子元素等等。直到一个像USPrice这样的子元素，它包含的是一个数字而不是任何子元素。元素如果包含子元素或者是带有属性则被称为复合类型；反之元素如果仅仅包含数字、字符串或者其他数据等，但不包含任何子元素则称为简单类型。</p>
<p>&nbsp;&nbsp;&nbsp; 在实例文档中复合类型和一些简单类型是在购买定单的模式文档中定义。而其他一些标准的简单类型则是作为XML Schema内置的简单类型的指令表的一部分定义的。</p>
<p>&nbsp;&nbsp;&nbsp; 在继续查阅购买订单模式文档之前，我们暂时离题来提一下实例文档和购买订单模式文档之间的联系。观察实例文档你可以看到购买订单模式文档并没有被提及。一个实例文档实际上不需要引用模式文档，当然尽管很多实例文档确实引用了，为了使这第一节简单化，我们一开始选择不引用。并且假设任何实例文档的处理器即使从实例文档中得不到任何信息，也能够包含购买订单模式文档的处理。在后面的章节，我们将介绍联系实例文档和模式文档的外部机制。<br><br><strong>购买订单模式文档</strong><br><br>购买订单模式文档包含在文件po.xsd中：<br><br><br>po.xsd，购买订单的Schema文档<br><br>&lt;xsd:schema&nbsp;xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;<br><br>&nbsp;&lt;xsd:annotation&gt;<br>&nbsp;&nbsp;&lt;xsd:documentation&nbsp;xml:lang="en"&gt;<br>&nbsp;&nbsp;&nbsp;Purchase&nbsp;order&nbsp;schema&nbsp;for&nbsp;Example.com.<br>&nbsp;&nbsp;&nbsp;Copyright&nbsp;2000&nbsp;Example.com.&nbsp;All&nbsp;rights&nbsp;reserved.<br>&nbsp;&nbsp;&lt;/xsd:documentation&gt;<br>&nbsp;&lt;/xsd:annotation&gt;<br><br>&nbsp;&lt;xsd:element&nbsp;name="purchaseOrder"&nbsp;type="PurchaseOrderType"/&gt;<br><br>&nbsp;&lt;xsd:element&nbsp;name="comment"&nbsp;type="xsd:string"/&gt;<br><br>&nbsp;&lt;xsd:complexType&nbsp;name="PurchaseOrderType"&gt;<br>&nbsp;&nbsp;&lt;xsd:sequence&gt;<br>&nbsp;&nbsp;&nbsp;&lt;xsd:element&nbsp;name="shipTo"&nbsp;type="USAddress"/&gt;<br>&nbsp;&nbsp;&nbsp;&lt;xsd:element&nbsp;name="billTo"&nbsp;type="USAddress"/&gt;<br>&nbsp;&nbsp;&nbsp;&lt;xsd:element&nbsp;ref="comment"&nbsp;minOccurs="0"/&gt;<br>&nbsp;&nbsp;&nbsp;&lt;xsd:element&nbsp;name="items"&nbsp;&nbsp;type="Items"/&gt;<br>&nbsp;&nbsp;&lt;/xsd:sequence&gt;<br>&nbsp;&nbsp;&lt;xsd:attribute&nbsp;name="orderDate"&nbsp;type="xsd:date"/&gt;<br>&nbsp;&lt;/xsd:complexType&gt;<br><br>&nbsp;&lt;xsd:complexType&nbsp;name="USAddress"&gt;<br>&nbsp;&nbsp;&lt;xsd:sequence&gt;<br>&nbsp;&nbsp;&nbsp;&lt;xsd:element&nbsp;name="name"&nbsp;&nbsp;&nbsp;type="xsd:string"/&gt;<br>&nbsp;&nbsp;&nbsp;&lt;xsd:element&nbsp;name="street"&nbsp;type="xsd:string"/&gt;<br>&nbsp;&nbsp;&nbsp;&lt;xsd:element&nbsp;name="city"&nbsp;&nbsp;&nbsp;type="xsd:string"/&gt;<br>&nbsp;&nbsp;&nbsp;&lt;xsd:element&nbsp;name="state"&nbsp;&nbsp;type="xsd:string"/&gt;<br>&nbsp;&nbsp;&nbsp;&lt;xsd:element&nbsp;name="zip"&nbsp;&nbsp;&nbsp;&nbsp;type="xsd:decimal"/&gt;<br>&nbsp;&nbsp;&lt;/xsd:sequence&gt;<br>&nbsp;&nbsp;&lt;xsd:attribute&nbsp;name="country"&nbsp;type="xsd:NMTOKEN"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fixed="US"/&gt;<br>&nbsp;&lt;/xsd:complexType&gt;<br><br>&nbsp;&lt;xsd:complexType&nbsp;name="Items"&gt;<br>&nbsp;&nbsp;&lt;xsd:sequence&gt;<br>&nbsp;&nbsp;&nbsp;&lt;xsd:element&nbsp;name="item"&nbsp;minOccurs="0"&nbsp;maxOccurs="unbounded"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsd:complexType&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsd:sequence&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsd:element&nbsp;name="productName"&nbsp;type="xsd:string"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsd:element&nbsp;name="quantity"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsd:simpleType&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsd:restriction&nbsp;base="xsd:positiveInteger"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsd:maxExclusive&nbsp;value="100"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xsd:restriction&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xsd:simpleType&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xsd:element&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsd:element&nbsp;name="USPrice"&nbsp;&nbsp;type="xsd:decimal"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsd:element&nbsp;ref="comment"&nbsp;&nbsp;&nbsp;minOccurs="0"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsd:element&nbsp;name="shipDate"&nbsp;type="xsd:date"&nbsp;minOccurs="0"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xsd:sequence&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsd:attribute&nbsp;name="partNum"&nbsp;type="SKU"&nbsp;use="required"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xsd:complexType&gt;<br>&nbsp;&nbsp;&nbsp;&lt;/xsd:element&gt;<br>&nbsp;&nbsp;&lt;/xsd:sequence&gt;<br>&nbsp;&lt;/xsd:complexType&gt;<br><br>&nbsp;&lt;!--&nbsp;Stock&nbsp;Keeping&nbsp;Unit,&nbsp;a&nbsp;code&nbsp;for&nbsp;identifying&nbsp;products&nbsp;--&gt;<br>&nbsp;&lt;xsd:simpleType&nbsp;name="SKU"&gt;<br>&nbsp;&nbsp;&lt;xsd:restriction&nbsp;base="xsd:string"&gt;<br>&nbsp;&nbsp;&nbsp;&lt;xsd:pattern&nbsp;value="\d{3}-[A-Z]{2}"/&gt;<br>&nbsp;&nbsp;&lt;/xsd:restriction&gt;<br>&nbsp;&lt;/xsd:simpleType&gt;<br><br>&lt;/xsd:schema&gt;<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; 购买订单模式文档由一个schema元素和一系列子元素组成，大多数子元素为element， complexType， 和simpleType，这些决定了在实例文档中的元素的表现方式和内容。</p>
<p>&nbsp;&nbsp;&nbsp; 通过出现在schema元素中的命名空间声明xmlns：xsd="http://www.w3.org/2001/XMLSchema"，在模式文档中的每一个元素都有一个与XML Schema命名空间相联系的命名空间前缀"xsd：".尽管任何前缀都能够被使用，但是，前缀"xsd："被约定用于表示XML Schema命名空间。通过使用同样的前缀，这样同样的关联也出现在内置的简单类型的名字中。例如，xsd：string.这种形式的关联的目的是用来标识元素和简单类型是属于XML Schema语言的词汇表而不是模式文档作者自己的词汇表。为了在这里清楚表示，我们仅提及元素的名字和简单类型（如simpleType）而忽略了它们的前缀"xsd：".<br></p>
<img src ="http://www.cnitblog.com/sunnywang/aggbug/38031.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sunnywang/" target="_blank">sunnywang   </a> 2007-12-24 14:56 <a href="http://www.cnitblog.com/sunnywang/archive/2007/12/24/38031.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ETL之metadata   (讲了pentato  的kettle 的元数据)</title><link>http://www.cnitblog.com/sunnywang/archive/2007/12/19/37900.html</link><dc:creator>sunnywang   </dc:creator><author>sunnywang   </author><pubDate>Wed, 19 Dec 2007 07:31:00 GMT</pubDate><guid>http://www.cnitblog.com/sunnywang/archive/2007/12/19/37900.html</guid><wfw:comment>http://www.cnitblog.com/sunnywang/comments/37900.html</wfw:comment><comments>http://www.cnitblog.com/sunnywang/archive/2007/12/19/37900.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnitblog.com/sunnywang/comments/commentRss/37900.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/sunnywang/services/trackbacks/37900.html</trackback:ping><description><![CDATA[<br>--&nbsp;&nbsp;商业智能平台研究：ETL之metadata<br>元数据的定义就是：描述数据的数据，你非要问什么描述元数据，还是元数据本身，UML中也有这种概念，只不过是描述的对象不一样罢了。
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;让我们解释的更加通俗易懂一些吧，在javaSE中也有metadata的概念，最早的就算是JavaDoc了，在5.0之后，Annotation就是大量的使用metadata了，这是关于源代码的数据，具体来说就是关于Java的类、方法、字段等关联的附加数据。这些数据可以被Java的编译器或者其它工具（比如Java IDE 象eclipse+junit一样）来发现和使用。junit在4.0后也使用了Annotation也算是metadata的一种应用。可见metadata并不是什么高不可攀的技术，我们时刻都在使用。 </p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;再来看看metadata在BI系统上的定义吧，元数据（Metadata）是关于数据、操纵数据的进程，以及应用程序的结构、意义的描述信息，其主要目标是提供数据资源的全面指南。元数据是描述数据仓库内数据结构和建立方法的数据，可将其按用途分为两类：技术元数据（Technical Metadata）、业务元数据（Business Metadata）和内联映射元数据（Inter-Mapping Metadata）。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;技术元数据是存储关于数据仓库系统技术细节的数据，是用于开发和管理数据仓库的数据，主要包括数据仓库结构的描述（各个主题的定义，星型模式或雪花型模式的描述定义等）、ODS层（操作数据存储ODS .Operation Data Storage)的企业数据模型描述（以描述关系表及其关联关系为形式）、对数据稽核规则的定义、数据集市定义描述与装载描述（包括Cube的维度、层次、度量以及相应事实表、概要表的抽取规则）。另外，安全认证数据也作为元数据的一个重要部分进行管理。 </p>
<p>业务元数据从业务角度描述了数据仓库中的数据，它提供了介于使用者和实际系统之间的语义层，使得不懂计算机技术的业务人员也能够理解数据仓库中的数据。业务元数据包括以下信息:使用者的业务术语所表达的数据模型、对象名和属性名；访问数据的原则和数据来源;系统所提供的分析方法及公式、报表信息。 </p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;内联映射元数据（Inter-Mapping Metadata）实现技术元数据与业务元数据的层间映射，使得信息系统的概念模型与物理模型相互独立，使企业的概念、业务模型重组，以及物理模型的变化相互透明。 </p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;内联映射元数据从技术上为业务需求驱动、企业数据驱动的双驱动建设模型提供了重要保证,使信息系统的建设具有更高的灵活性与适应性。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;元数据是跟特定的数据对象有关的，换句话说，talend和kettle的元数据就是不一样的。ETL的元数据就和pentaho report 的元数据不一样，因为他们要描述的东西不一样。这些元数据的存储格式可以有多种，可以储存成XML格式的也可以是放在数据库里面的。事实上这两种最通用的，也是可以互补的两种，没有谁比谁重要之说。 </p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;metadata储存在repository的地方,我不知道是不是所有的ETL工具都喜欢这么叫.每个repository都会选用数据库来储存,他们都是按照一定的格式,这些格式最后也是可以变成XML形式的.这是看每个工具的支持程度,kettle 就支持导出到XML格式,其他的工具我就不知道了. </p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;具体解释到kettle来说，metadata就是你定义的每一个动作.kettle的repository里面有如下一些表,我没有列出全部,从表的结构看一下kettle的metadata有哪些 </p>
<p>1. R_DATABASE R_DATABASE_ATIRIBUTE R_DATABASE_CONTYPE R_DATABASE_TYPE </p>
<p>2. R_JOB R_JOB_HOP R_JOBENTRY R_JOBENTRY_ATIRIBUTE R_JOBENTRY_TYPE </p>
<p>3. R_LOG R_LOGLEVEL </p>
<p>4. R_STEP R_STEP_DATABASE </p>
<p>5. R_TRANS_ATIRIBUTE R_TRANS_HOP R_TRANS_CONDITION </p>
<p>6. R_USER R_VALUE R_PERMISSION </p>
<p>7. R_CLUSTER R_CLUSTER_SLAVE R_SLAVE </p>
<p>8. R_PARTITION R_PARTITION_SCHEMA </p>
<p>&nbsp;</p>
<p>1 . database的链接信息.在R_DATABASE_TYPE 表里面包含了所有支持的数据库链接信息,一共是25种,算是支持非常的多了. </p>
<p>&nbsp;</p>
<p>2. 任务设计部分的表,R_JOB_HOP 是指两个数据之间的链接部分, R_JOBENTRY_TYPE 是目前支持的操作种类,一共有27种,包括Transformation , Job , Shell , Mail , SQL ,FTP ,Table exists ,File Exists , JavaScript , Secure FTP , HTTP , Create File , Delete File , Wait for File , Put a file with SFTP , File Compare , BulkLoad into Mysql , Display Msgbox Info , Wait for , Zip file , XSL Transformatio, BulkLoad from Mysql into File , Abort Job , Get mails from POP , Ping a host , Dummy Job Entry . </p>
<p>其中BulkLoad 只跟Mysql有关,我感觉很奇怪,BulkLoad 是数据库批量处理的方式,大型数据库都是支持的,比如oracle就有sqlloader来支持批量处理,其他的大型数据库应该也有吧,而且在transform里面kettle也有oracle的支持，在任务设计的时候就只有mysql的支持，不知道什么原因. </p>
<p>最后一个Dummy Job Entry 就是什么都不做. </p>
<p>&nbsp;</p>
<p>3. Log记录,loglevel 一共有6种,Nothing at all , Minimal loggin , Basic loggin , Detailed loggin , Debugging , RowLevel(very detailed).根据你自己的需要来选择log的级别. </p>
<p>&nbsp;</p>
<p>4. 每一步操作的表格与你使用的数据库 </p>
<p>&nbsp;</p>
<p>5. 转换的定义.一共有70种不同的转化,你不会想看到全部列出来的,其中有几种很有用的,比如DimensionLookup , 它的解释就是"在一个数据仓库里更新一个渐变维,或者在这个维里查询信息. </p>
<p>还有基于关键字删除记录, </p>
<p>cuebOutput, 把数据写入一个cube, </p>
<p>从一个excel文件读数据,执行一个sql脚本,调用数据库的储存过程, </p>
<p>OraBulkLoader ,调用oracle 的bulk loader to load data ,(应该是指Oracle的SQLLOADER吧). </p>
<p>ProSAPCONN, 从一个SAP系统取数据. </p>
<p>MergeRows,合并两个数据流, 并根据某个关键字排序. 这两个数据流被比较，以标识相等的、变更的、删除的和新建的记录. </p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;插一句关于merge的概念，从网上copy下来的： </p>
<p>MERGE语句是Oracle9i新增的语法，用来合并UPDATE和INSERT语句。通过MERGE语句，根据一张表或子查询的连接条件对另外一张表进行查询，连接条件匹配上的进行UPDATE，无法匹配的执行INSERT。这个语法仅需要一次全表扫描就完成了全部工作，执行效率要高于INSERT＋UPDATE。 </p>
<p>&nbsp;</p>
<p>6. 用户与权限.一开始建立的用户有两种,admin和guest ,权限有5种,Read only access , Administrator , Use transformations , Use Jobs , Use schemas . </p>
<p>&nbsp;</p>
<p>7. pentaho官方网站上面有一个新闻是关于在mysql的Kettle集群新记录： </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;最近Kettle集群基于 Amazon Elastic Computing Cloud做了一次测试，单台服务器输出4000 rows/sec ，数据库为MySQL. 如果你发送数据通过sockets从一个master到5个slave servers, 你将获得 5x4000 row inserts/sec。集群的效果非常好. </p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;我个人也做过测试。数据库是oracle 10.2.0.1,内网连接，从一台机器的oracle到本地机器，没有集群，速度也大概是4000 多一点 ，数据量大概是16万。 </p>
<p>&nbsp;</p>
<p>8 . 数据库分区是数据库的高级特性之一，oracle的XE版和Enterprise版本的有一个差别就是XE版不支持分区。 </p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;kettle还支持metadata搜索，可搜索的选项包括步骤，数据库连接和注释 ，可见metadata对于ETL的重要性就是它能够更好的管理你的数据，而不只是让你的数据呆在数据库里面。kettle对与数据库的元数据管理并不是很好，所谓数据库的元数据就比如数据库中表的名字，每一个column的信息，column的长度，每一个表的constrain，index等，而只有提供这些信息的管理才能够将ETL过程做的更好。下一篇介绍ETL质量控制的时候会看到oracle warehouse builder 对于这些数据管理是多么的强大，目前kettle的能力还不能算是非常的强大的。 </p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;pentaho平台本身还有一种metadata , 在官方主页上是这么写的： </p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;pentaho metadata的能力是让管理员定义一个抽象层来显示数据库信息和商业流程，管理员用关系型数据库的表来表现相互之间的关系，为了复杂和含义模糊的数据库表和列而创建商用术语，为特性用户而设定权限参数，指定默认的数据格式，为多种语言部署提供翻译，商业用户可以使用pentaho新的ad hoc query能力查询他们想要的报表，比如订单的数量和按地区排序的客户开销，SQL可以自动取得这些信息。 </p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;数据仓库的建模也需要用到metadata, oracle的数据仓库建模就是用的一种叫 Common Warehouse Metamodel 的metadata , CWM提供一个数据仓库的标准让不同的厂商集成和管理他们的数据，CWM建立在开发的标准XMI(XML for Metadata interchange) XML 和 UML2 作为建模语言。CWM 用UML2 定义一组核心类，这些类分作package（或者叫做子模型submodels)，每一个提供一个特定的数据仓库的domain , 比如 Relational , OLAP ,Transformation , CWM 提供一个强大的数据模型来实现数据仓库的Extraction , transformation , loading , integration and analysis ，没有一个单独的模型能够满足各种应用程序和开发工具的需求，但是CWM 为这些工具提供特定的扩展，它被设计用来支持关于metadata的快速开发，使用户能够通过扩展来满足他们的需求。</p>
<img src ="http://www.cnitblog.com/sunnywang/aggbug/37900.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sunnywang/" target="_blank">sunnywang   </a> 2007-12-19 15:31 <a href="http://www.cnitblog.com/sunnywang/archive/2007/12/19/37900.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ETL学习心得-----数据仓库中关键的etl 。。</title><link>http://www.cnitblog.com/sunnywang/archive/2007/12/19/37890.html</link><dc:creator>sunnywang   </dc:creator><author>sunnywang   </author><pubDate>Wed, 19 Dec 2007 03:42:00 GMT</pubDate><guid>http://www.cnitblog.com/sunnywang/archive/2007/12/19/37890.html</guid><wfw:comment>http://www.cnitblog.com/sunnywang/comments/37890.html</wfw:comment><comments>http://www.cnitblog.com/sunnywang/archive/2007/12/19/37890.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/sunnywang/comments/commentRss/37890.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/sunnywang/services/trackbacks/37890.html</trackback:ping><description><![CDATA[<a href="http://www.124k.com/"><a href="http://www.cnitblog.com/sunnywang/admin/www.124k.cn"><a href="http://www.124k.com/">http://www.124k.com</a>&nbsp;&nbsp;</a></a>&nbsp;谈谈我们自己的技术<br><br>&nbsp;中的好东东 
<img src ="http://www.cnitblog.com/sunnywang/aggbug/37890.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sunnywang/" target="_blank">sunnywang   </a> 2007-12-19 11:42 <a href="http://www.cnitblog.com/sunnywang/archive/2007/12/19/37890.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>什么是ORACLE ,数据库的建模与设计（逻辑建模， 物理设计（表空间、分区）， 参数配置， 接口，备份）</title><link>http://www.cnitblog.com/sunnywang/archive/2007/12/17/37800.html</link><dc:creator>sunnywang   </dc:creator><author>sunnywang   </author><pubDate>Mon, 17 Dec 2007 10:39:00 GMT</pubDate><guid>http://www.cnitblog.com/sunnywang/archive/2007/12/17/37800.html</guid><wfw:comment>http://www.cnitblog.com/sunnywang/comments/37800.html</wfw:comment><comments>http://www.cnitblog.com/sunnywang/archive/2007/12/17/37800.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/sunnywang/comments/commentRss/37800.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/sunnywang/services/trackbacks/37800.html</trackback:ping><description><![CDATA[　<a href="http://doc.qiuhao.com/phrase/200604040935115.html">ORACLE</a>是一种适用于大型、中型和<a href="http://doc.qiuhao.com/phrase/200603021509475.html">微型计算机</a>的关系<a href="http://doc.qiuhao.com/phrase/200603011033425.html">数据库管理系统</a>,它使用<a href="http://doc.qiuhao.com/phrase/200604022014515.html">SQL</a>(Structured guery language)作为它的<a href="http://doc.qiuhao.com/phrase/200602271218062.html">数据库</a>语言。
<p>　　SQL主要包括数据定义、数据操纵（包括查询）和数据控制等三方面功能。SQL是一种非过程化程度很高的语言，用户只需说明"干什么"而无需具体说明"怎么干"语言简洁、使用方便功能强大，集联机交互与嵌入于一体，能适应广泛的使用环境。ORACLE数据库由三种<a href="http://doc.qiuhao.com/phrase/200603051002565.html">类型</a>的<a href="http://doc.qiuhao.com/phrase/200602282323195.html">文件</a>组成：数据库文件、日志文件和控制文件。</p>
<p>　　数据字典是由ORACLE自动建立并更新的一组表，这些表中记录用户的姓名、描述表和<a href="http://doc.qiuhao.com/phrase/200603141659315.html">视图</a>以及有关用户权限等的信息。数据字典是只读的，只允许查询。也就是说数据字典是一种数据库资源，每个用户都可以访问数据字典，<a href="http://doc.qiuhao.com/phrase/200604022049575.html">DBA</a>可通过数据字典来监视ORACLE RDBMS的使用，并帮助用户完成其应用。ORACLE RDBMS本身也要利用数据库字典来管理和控制整个数据库。</p>
<p>　　提起数据库，第一个想到的公司，一般都会是Oracle。该公司成立于1977年，最初是一家专门开发数据库的公司。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Oracle在数据库领域一直处于领先地位。1984年，首先将关系数据库转到了桌面<a href="http://doc.qiuhao.com/phrase/200603021438435.html">计算机</a>上。然后，Oracle的下一个版本，版本5，率先推出了分布式数据库、客户/服务器结构等崭新的概念。Oracle的版本6首创行锁定<a href="http://doc.qiuhao.com/phrase/200603061709535.html">模式</a>以及对称多处理计算机的支持&#8230;&#8230;最新的Oracle8主要增加了<a href="http://doc.qiuhao.com/phrase/200603090845215.html">对象</a>技术，成为关系-对象<a href="http://doc.qiuhao.com/phrase/200603011056245.html">数据库系统</a>。目前，ORACLE产品覆盖了大、中、小型机等几十种机型，Oracle数据库成为世界上使用最广泛的关系数据系统之一。</p>
<p><br>Oracl入门基本知识</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.一个表空间只能属于一个数据库。 </p>
<p>　　2.每个数据库最少有一个控制文件（建议3个，分别放在不同的磁盘上）。 </p>
<p>　　3.每个数据库最少有一个表空间（SYSTEM表空间）。</p>
<p>　　4.建立SYSTEM表空间的目的是尽量将目的相同的表存放在一起，以提高使用效率，只应存放数据字典。</p>
<p>　　5.每个数据库最少有两个联机日志组，每组最少一个联机日志文件。 </p>
<p>　　6.一个数据文件只能属于一个表空间。 </p>
<p>　　7.一个数据文件一旦被加入到一个表空间中，就不能再从这个表空间中移走，也不能再加入到其他表空间中。 </p>
<p>　　8.建立新的表空间需要建立新的数据文件。 </p>
<p>　　9.数据文件被ORACLE格式化为ORACLE块，Oracle9i以前版本中，ORACLE块的大小是在第一次创建数据库时设定的。 </p>
<p>　　10.并且以后不能改变，要想改变，只能重建数据库。 </p>
<p>　　11.一个段segment只能属于一个表空间，但可以属于多个数据文件。 </p>
<p>12.一个区extent只能属于一个数据文件，即区间（extent）不能跨越数据文件。 </p>
<p>　　13.PCTFREE和PCTUSED总和不能大于等于100。 </p>
<p>　　14.单独一个事务不能跨越多个回滚段。 </p>
<p>　　15.索引表不含ROWID值。</p>
<p>　　16.拥有不同大小的回滚段没有任何益处。 </p>
<p>　　17.COMMIT后，数据不一定立即写盘（数据文件）。 </p>
<p>　　18.一个事务即使不被提交，也会被写入到重做日志中。 </p>
<p>　　19.Oracle 8.0.4中，在初始安装时建立的缺省数据库，实例名为ORCL 。</p>
<p>　　20.一个块的最大长度为16KB(有2K、4K、8K、16K)。<br>　　 每个数据库最大文件数（按块大小）<br>　　 2K块　　　　　　　　20000个文件<br>　　 4K块　　　　　　　　40000个文件<br>　　 8K块或以上　　　　　65536个文件</p>
<p><br>　　21.oracle server可以同时启动多个数据库 。</p>
<p>　　22.一套<a href="http://doc.qiuhao.com/phrase/200602281634075.html">操作系统</a>上可以安装多个版本的ORACLE数据库系统（UNIX可以，NT不可以）。 </p>
<p>　　23.一套ORACLE数据库系统中可以有多个ORACLE数据库及其相对应的实例 。</p>
<p>　　24.每个ORACLE数据库拥有一个数据库实例（INSTANCE）（OPS除外）。 </p>
<p>　　25.所以，一套操作系统上同时可以有多个oracle数据库实例启动。 </p>
<p>Oracle数据库产品具有的优良特性</p>
<p>（1） 兼容性</p>
<p>　　Oracle产品采用标准SQL，并经过美国国家标准技术所（NIST）测试。与IBM SQL/DS，<a href="http://doc.qiuhao.com/phrase/200604022243315.html">DB2</a>，INGRES，IDMS/R等兼容。</p>
<p>（2） 可移植性</p>
<p>　　Oracle的产品可运行于很宽范围的硬件与操作系统平台上。可以安装在70种以上不同的大、中、小型机上；可在VMS、<br>DOS、UNIX、WINDOWS等多种操作系统下工作。</p>
<p>（3） 可联结性</p>
<p>　　能与多种通讯网络相连，支持各种协议（TCP/IP、DECnet、LU6.2等）。</p>
<p>（4） 高生产率</p>
<p>　　提供了多种开发工具，能极大的方便用户进行进一步的开发。</p>
<p>（5） 开放性</p>
<p>　　Oracle良好的兼容性、可移植性、可连接性和高生产率是Oracle RDBMS具有良好的开放性。</p>
<p>　　ORACLE产品主要包括数据库服务器、开发工具和连接产品三<a href="http://doc.qiuhao.com/phrase/200603090857555.html">类</a>。</p>
<p>数据库服务器</p>
<p>　　最新版本是8，但广泛应用的是7。版本7具有以下特色：</p>
<p>（1）多进程、多线索的<a href="http://doc.qiuhao.com/phrase/200603122156385.html">体系结构</a></p>
<p>　　多进程、多线索的体系结构。Oracle7包括一个到多个线索进程、多个服务器进程和多个后台进程。线索进程负责监听用户请求，将用户请求链入内存的请求队列中，并将应答队列中的执行结果返给相应用户。服务器进程负责处理请求队列中的用户请求，并把结果链入应答队列。<a href="http://doc.qiuhao.com/phrase/200603091754305.html">线程</a>和线索的数目都可以根据当前工作负荷动态调整。Oracle7的进程结构能充分利用并行机上多处理机的能力，但由于其线索是用进程模拟的，由操作系统调度，这在一定程度上消弱了线索开销低的优越性。</p>
<p>（2）为提高性能改进核心技术</p>
<p>　　Oracle7改进了其核心技术。其并发控制机制更加精致，包括了无限制行级封锁、无竞争查询、线索的顺序号产生机制。在共享内存缓冲区中增加了共享的SQL Cache，提高了运行效率。</p>
<p>（3）高可用性</p>
<p>　　Oracle7提供了联机备份、联机恢复、镜像等多种机制保障系统具有高可用性和容错功能。</p>
<p>（4）SQL实现</p>
<p>　　Oracle7的SQL符合ANSI/ISO SQL 89标准。完整性约束符合ANSI/ISO标准的实体完整性和参照完整性约束。提供基于角色的安全性。</p>
<p>　　角色是一组权限的集合。有了角色的概念，安全管理机制可翼把表或其他数据库对象上的一些权限进行组合，将它们赋予一个角色。需要时只需将该角色授予一个用户或一组用户，这样可以降低安全机制的负担和成本。</p>
<p>　　针对集群和MPP并行计算机平台，Oracle7提供了并行服务器选件实现存盘共享。同时，Oracle7还为SMP、集群和MPP平台提供了并行查询选件，以实现并行查询、并行数据装载等操作。</p>
<p>　　Oracle7通过分布式选件提供分布式数据库功能。其分布式选件提供了多场地的分布式查询和多场地更新功能，具有位置透明性和场地自治性，提供全局数据库名，支持<a href="http://doc.qiuhao.com/phrase/200604241405415.html">远程过程调用</a>。</p>
<p>开发工具</p>
<p>　　Oracle提供的开发工具包是Developer/2000、Designer/2000、Discover/2000、Oracle Office等，它涵盖了从建模、分析、设计到具体实现的各个环节。</p>
<p>Developer/2000包括：</p>
<p>　　Oracle Forms用于快速生成基于屏幕的复杂应用，具有GUI界面和多媒体功能，主要用于操纵数据和查询。</p>
<p>　　Oracle Reports是快速生成报表的工具。能生成各种复杂的报表，同样能处理多媒体信息。</p>
<p>　　Oracle Graphics用于生成各种图形应用。</p>
<p>　　Oracle Books用于生成联机文档。</p>
<p>Designer/2000：</p>
<p>　　这是Oracle提供的CASE工具。该工具能够帮助用户对复杂系统进行建模、分析和设计。还可以帮助用户绘制ER图、功能<a href="http://doc.qiuhao.com/phrase/200604161254415.html">分层</a>图、数据流图和方阵图。</p>
<p>Discover/2000:</p>
<p>　　这是一个<a href="http://doc.qiuhao.com/phrase/200604232107315.html">OLAP</a>工具，主要用于支持<a href="http://doc.qiuhao.com/phrase/200603091358275.html">数据仓库</a>应用。它可以对历史数据进行挖掘，以找到发展趋势，对不同层次的概况数据进行分析，以便发现有关业务的详细信息。</p>
<p>　　Oracle Office适用于办公自动化的，能完成企业范围内的<a href="http://doc.qiuhao.com/phrase/200603090938465.html">消息</a>接收与发送、日程安排、日历管理、目录管理以及拼写检查。 <br></p>
<p>
<hr color=#000080>
<br><br><br>oracle数据库的建模与设计：<br>
<p>&#160;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要开发一个基于数据库的应用系统，其中最关键的一步就是整个系统所依据的数据库的建模设计，从逻辑的到物理的，一个环节疏于设计，整个的应用系统便似建立在危房之上，随着开发过程的不断深入，它要随时面临着各种难以预料的风险，开发者要为修改或重新设计没有设计好的数据库系统而付出难以预料的代价。所以，一个良好的<a href="http://doc.qiuhao.com/phrase/200603011123415.html">数据库设计</a>是高效率的系统所必须的。</p>
<p style="FONT-SIZE: 14pt"><strong>一、逻辑建模</strong></p>
<p style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据库设计的方法因具体数据库而异，但是建模阶段的相同的，所以可以用一些通用的工具来进行，如<a href="http://doc.qiuhao.com/phrase/200604032145145.html">Rational rose</a>,PowerDesigner等，这一阶段主要是依据系统的<a href="http://doc.qiuhao.com/phrase/200603101518295.html">需求</a>，获取与分析要实现的应用系统信息,进行数据内部以及外在关系的分析，从而有效地建立整个系统的数据结构（在关系数据库中通常称为表结构），在此基础上对数据库的数据量、数据流量、及响应速度的估算分析，这样数据模型就产生了。<img src="http://www.cnitblog.com/CuteSoft_Client/CuteEditor/images/face6.gif" align=absMiddle border=0>具体的操作准则是数据库的几个<a href="http://doc.qiuhao.com/phrase/200604241409355.html">范式</a>、用户的具体需求和分析者的经验，从数据库的性能、安全、方便管理、易于开发等方面出发，具体方法因分析员的喜好和习惯而异，可以不用工具，最好使用工具，能让分析过程简便，最主要是能生成一些图，如E-R图，让分析过程一目了然。<br></p>
<p style="FONT-SIZE: 14pt"><br><strong>二、物理设计</strong>（&nbsp; 要注意的地方很多哦@）<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 此步设计和系统将具体使用的数据库有关，也和数据库所运行的硬、<a href="http://doc.qiuhao.com/phrase/200604232134205.html">软件</a>平台有关，目的是尽量合理地给数据库分配物理空间，这一步在数据库设计中很重要，关系到数据库数据的安全和数据库的性能，具体的来说，这一步包括相应表空间的数据文件在磁盘上的分配，还要根据数据量的大小确定redolog文件、rollback段的大小，然后进行分配，这些文件的分配要遵循一些原则，本着利于备份，利于性能优化的原则，原则如下（以ORACLE数据库为例）：<br></p>
<p style="FONT-SIZE: 14pt"><br><br>1、为表和索引建立不同的表空间，禁止在系统表空间中放入非核心oracle系统成分的对象，确保数据表空间和索引表空间位于不同的磁盘磁盘驱动器上。</p>
<p style="FONT-SIZE: 14pt">2、了解终端用户怎样访问数据，如果可能，将经常同时查询和频繁查询的对象放在不同的物理磁盘上。</p>
<p style="FONT-SIZE: 14pt">3、当数据库包含允许用户并行访问不同数据元素的大对象时，将对象分割存放在多个磁盘上是有好处的。可以采用分区。在某个操作系统平台上定义拥有数百万行的表时，则更需小心，因为数据库文件的大小受到限止，这种限制是由操作系统而不是由oracle引起的。</p>
<p style="FONT-SIZE: 14pt">4、在独立的各盘上至少创建两个用户定义的rollback表空间，以存放用户自己的rollback段。在初始化文件中安排rollback段的次序，使它们在多个磁盘之间进行切换。</p>
<p style="FONT-SIZE: 14pt">5、将redo log文件放在一个读写较少的盘上。对于每个oracle 实例要建立两个以上的redo log 组，同组的两个成员放在不同的设备上。</p>
<p style="FONT-SIZE: 14pt">6、确立表和索引的大小，这决定了保存它们所需的表空间的尺寸，也决定了哪些表空间物理地装在哪些盘上和哪些表空间可以结合在一起。具体的估算方法可以按照oracle 一些公式，这里还要按照各个表的具体特性，用途，定义它的存贮参数如（pctfree,pctused）。<br></p>
<p style="FONT-SIZE: 14pt"><br><br><strong>三、关于数据库参数的设计</strong></p>
<p style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 每个数据库在建立时，都有缺省的参数设置，但是对于具体的应用要求参数设置可能不同，缺省的参数设置往往需要根据应用系统的特点而需要改动，如每个数据库的操作系统平台、instance 数目、各种内存大小的设置、采取的线程方式、备份方式等不同，具体的参数就一定要进行最为恰当的修改，这个步骤对数据库性能很重要，也是保证应用系统所要求的数据库功能得以实现重要一步。</p>
<p style="FONT-SIZE: 14pt"><strong>四、与开发软件的接口问题</strong></p>
<p style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据库设计最后要考虑的是与要选择的开发软件之间的接口问题，要准备好接口<a href="http://doc.qiuhao.com/phrase/200604232224305.html">程序</a>，有些是第三方软件已经备好的，有些是数据库本身要具备的，如<a href="http://doc.qiuhao.com/phrase/200604151904545.html">jdbc</a>,bde,<a href="http://doc.qiuhao.com/phrase/200604152347055.html">ado</a>,等与数据库的接口，主要是考虑接口的可用性、效率问题。这一步主要从经验出发，因为这种产品不断出台，而且都是经过各商家的吹捧，要在实践中决定哪个是最适合。<br></p>
<p style="FONT-SIZE: 14pt"><br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以上是数据库建模设计的几个重要步骤的大致分析，整个设计过程是不断地改进的，是<a href="http://doc.qiuhao.com/phrase/200604241134185.html">数据库管理员</a>、设计人员、开发人员共同完成的，只是各有侧重点不同，数据库管理员侧重于是2、3步的设计，设计人员侧重于1步的设计，而开发人员侧重于4步的设计，由于有些应用系统的编程环境和实际应用环境不同，所以要做两套设计，并注意两套设计的兼容性可移植性。<br></p>
<p><br>
<hr color=#000080>
<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面结合一个实际开发的劳资管理系统中的数据库设计，对以上几个步骤做进一步解释。<br><br>
<p>&#160;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该系统应用于大型企业集团，包括几十个分厂，基本数据均来源于各分厂，各分厂有一套access数据库，存贮着自己的人才档案信息，由各厂自己维护，定期传到总的数据库里，供劳资处各室查询、统计用,。这是一个分部式的数据库。</p>
<p>一、逻辑建模</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先是对数据库的数据量、数据流量、及响应速度的估算分析，这一步对物理设计也是必须的，劳资系统的主要数据是人员档案，大概有100兆左右，还有人员配备等信息加上工种序列、工资等级、厂矿车间等各种编码，总的数据量大约在某些方面300兆左右。数据的输入、维护大部分在各厂矿进行，然后到处里集中，所以数据流量很大，对响应速度要求一般。</p>
<p>在逻辑建模上的工具上，采用Rantional rose 2000，根据用户的需求，设计各种<a href="http://doc.qiuhao.com/phrase/200604241334095.html">use case view</a>， 在 logic view中生成数据库的实体，及实体之间的E-R图，然后生成Data modeler,确定以后，用Schema generation在建好的数据库中的对应的用户下生成表。</p>
<p>详细的图很繁琐，在这里就不展示了。</p>
<p>二、物理设计</p>
<p>1、因为职工档案信息库很大，还有照片，所以把它分成两个表，把照片单独地放在一个表中，并且采用分区技术，在档案表、照片表上建立分区，不同的分区分别放在不同的表空间。</p>
<p>2、因为职工档案信息库里有许多编码，查询的时候要和编码库一起进行read操作，所以不把职工档案信息表和编码库放在一个表空间。</p>
<p>3、建立二个rollback 表空间，十个rollback段，分区放在二个表空间里，建立一个比较大的rollback段，因为职工档案信息表经常会有批量的修改与添加。</p>
<p>4、将redo log文件放在一个读写较少的盘上。建立三个redo log 组，同组的两个成员放在两个盘上。因为选用的是ARCHIVELOG的备份方式。</p>
<p>5、根据每个表的性质，确定其存贮的参数，如职工档案信息表的修改、删除、插入都比较多，所以把它的Pctfree 10,Pctused 80定大小，估算出它大致需要的block数，算出存放这些表的表空间的数据文件的大小。</p>
<p>6、根据用户的需求，建立一套数据库的安全体系。也就是总结出几种权限级别的用户，建立这些用户，并给这些用户赋上相应的仅限，供开发人员编程时使用。</p>
<p>三、参数的设置</p>
<p>缺省的初始化参数文件中，选择large。因为用户数很多，100个左右。</p>
<p>SHARED_POOL_SIZE, 与数据库大小有关，也与应用软件有关。这里设成缺省值的1.5倍。</p>
<p><a href="http://doc.qiuhao.com/phrase/200604231245475.html">DB</a>_BLOCK_BUFFERS 根据所用服务器的内存与交易数的大小，设为25兆。</p>
<p>SORT_AREA_SIZE 根据所用服务器的内存，设为10兆</p>
<p>LOG_BUFFER 用缺省值的1.5倍。</p>
<p>DBWR_IO_SLAVES 设为1</p>
<p>ROLLBACK_SEGMENTS 根据交易量的大小，定为10个。分别放在两个磁盘上。</p>
<p>PROCESS 80</p>
<p>MTS_SERVERS 3</p>
<p>MTS_DISPATCHERS tcp,3</p>
<p>ARCHIVE_LOG_START TRUE 采用ARCHIVE方式备份。</p>
<p>这些参数的确定是暂时的，没有一个系统可以运行之前把参数确定得正好，需要在应用程序运行之后进行调整。</p>
<p>四、与开发软件的接口问题</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 因为我们这个系统的开发软件用的是Borland c++builder 5,所以采用的是比较成熟的BDE的接口，它是Borland公司提供的，性能比较好。</p>
<p>以上是根据多年数据库管理、开发的实践总结而出的数据库建模与设计的大致思路，希望能对大家有所帮助。<br></p>
<p>Oracle数据库的备份与恢复</p>
<p>---- 当我们使用一个数据库时，总希望数据库的内容是可靠的、正确的，但由于计算机系统的故障（包括机器故障、介质故障、误操作等），数据库有时也可能遭到破坏，这时如何尽快恢复数据就成为当务之急。如果平时对数据库做了备份，那么此时恢复数据就显得很容易。由此可见，做好数据库的备份是多么的重要，下面笔者就以ORACLE7为例，来讲述一下数据库的备份和恢复。ORACLE 数据库有三种标准的备份方法，它们分别为导出/导入（EXPORT/IMPORT）、冷备份、热备份。导出备份是一种逻辑备份，冷备份和热备份是物理备份。 </p>
<p>---- 一、 导出/导入（Export/Import） </p>
<p>---- 利用Export可将数据从数据库中提取出来，利用Import则可将提取出来的数据送回Oracle数据库中去。 </p>
<p>---- 1. 简单导出数据（Export）和导入数据（Import） </p>
<p>---- Oracle支持三种类型的输出： </p>
<p>---- （1）表方式（T方式），将指定表的数据导出。 </p>
<p>---- （2）用户方式（U方式），将指定用户的所有对象及数据导出。 </p>
<p>---- （3）全库方式（Full方式），将数据库中的所有对象导出。 </p>
<p>---- 数据导出（Import）的过程是数据导入（Export）的逆过程，它们的数据流向不同。 </p>
<p>---- 2. 增量导出/导入 </p>
<p>---- 增量导出是一种常用的数据备份方法，它只能对整个数据库来实施，并且必须作为SYSTEM来导出。在进行此种导出时，系统不要求回答任何问题。导出文件名缺省为export.dmp，如果不希望自己的输出文件定名为export.dmp，必须在命令行中指出要用的文件名。 </p>
<p>---- 增量导出包括三个类型： </p>
<p>---- （1）&#8220;完全&#8221;增量导出（Complete） </p>
<p>---- 即备份整个数据库，比如： </p>
<p>---- ＄exp system/manager inctype=complete file=990702.dmp </p>
<p>---- （2） &#8220;增量型&#8221;增量导出 </p>
<p>---- 备份上一次备份后改变的数据。比如： </p>
<p>---- ＄exp system/manager inctype=incremental file=990702.dmp </p>
<p>---- （3） &#8220;累计型&#8221;增量导出（Cumulative） </p>
<p>---- 累计型导出方式只是导出自上次&#8220;完全&#8221; 导出之后数据库中变化了的信息。比如： </p>
<p>---- ＄exp system/manager inctype=cumulative file=990702.dmp </p>
<p>---- 数据库管理员可以排定一个备份日程表，用数据导出的三个不同方式合理高效地完成。 </p>
<p>---- 比如数据库的备份任务可作如下安排： </p>
<p>---- 星期一：完全导出（A） </p>
<p>---- 星期二：增量导出（B） </p>
<p>---- 星期三：增量导出（C） </p>
<p>---- 星期四：增量导出（D） </p>
<p>---- 星期五：累计导出（E） </p>
<p>---- 星期六：增量导出（F） </p>
<p>---- 星期日：增量导出（G） </p>
<p>---- 如果在星期日，数据库遭到意外破坏，数据库管理员可按以下步骤来恢复数据库： </p>
<p>---- 第一步：用命令CREATE <a href="http://doc.qiuhao.com/phrase/200604231244235.html">DATABASE</a>重新生成数据库结构； </p>
<p>---- 第二步：创建一个足够大的附加回段。 </p>
<p>---- 第三步：完全增量导入A： </p>
<p>---- ＄imp system./manager inctype= RECTORE FULL=Y FILE=A </p>
<p>---- 第四步：累计增量导入E： </p>
<p>---- ＄imp system/manager inctype= RECTORE FULL=Y FILE =E </p>
<p>---- 第五步：最近增量导入F： </p>
<p>---- ＄imp system/manager inctype=RESTORE FULL=Y FILE=F </p>
<p>---- 二、 冷备份 </p>
<p>---- 冷备份发生在数据库已经正常关闭的情况下，当正常关闭时会提供给我们一个完整的数据库。冷备份是将关键性文件拷贝到另外位置的一种说法。对于备份Oracle信息而言，冷备份是最快和最安全的方法。冷备份的优点是： </p>
<p>---- 1．是非常快速的备份方法（只需拷贝文件） </p>
<p>---- 2．容易归档（简单拷贝即可） </p>
<p>---- 3．容易恢复到某个时间点上（只需将文件再拷贝回去） </p>
<p>---- 4．能与归档方法相结合，作数据库&#8220;最新状态&#8221;的恢复。 </p>
<p>---- 5．低度维护，高度安全。 </p>
<p>---- 但冷备份也有如下不足： </p>
<p>---- 1．单独使用时，只能提供到&#8220;某一时间点上&#8221;的恢复。 </p>
<p>---- 2．在实施备份的全过程中，数据库必须要作备份而不能作其它工作。也就是说，在冷备份过程中，数据库必须是关闭状态。 </p>
<p>---- 3．若磁盘空间有限，只能拷贝到磁带等其它外部存储设备上，速度会很慢。 </p>
<p>---- 4．不能按表或按用户恢复。 </p>
<p>---- 如果可能的话（主要看效率），应将信息备份到磁盘上，然后启动数据库（使用户可以工作）并将所备份的信息拷贝到磁带上（拷贝的同时，数据库也可以工作）。冷备份中必须拷贝的文件包括： </p>
<p>---- 1．所有数据文件 </p>
<p>---- 2．所有控制文件 </p>
<p>---- 3．所有联机REDO LOG文件 </p>
<p>---- 4．Init.ora文件（可选）。 </p>
<p>---- 值得注意的是冷备份必须在数据库关闭的情况下进行，当数据库处于打开状态时，执行数据库文件系统备份是无效的 </p>
<p>---- 下面是做冷备份的完整例子： </p>
<p>---- （1） 关闭数据库＄sqldba lmode=y </p>
<p>---- SQLDBA &gt;connect internal; </p>
<p>---- SQLDBA &gt;shutdown normal; </p>
<p>---- （2） 用拷贝命令备份全部的时间文件、重做日志文件、控制文件、初始化参数文件 </p>
<p>---- SQLDBA &gt;! cp &lt; file &gt; &lt; backup directory &gt; </p>
<p>---- （3） 重启Oracle数据库 </p>
<p>---- ＄sqldba lmode=y </p>
<p>---- SQLDBA &gt;connect internal; </p>
<p>---- SQLDBA &gt;startup; </p>
<p>---- 三、 热备份 </p>
<p>---- 热备份是在数据库运行的情况下，采用archivelog mode方式备份数据的方法。所以，如果你有昨天夜里的一个冷备份而且又有今天的热备份文件，在发生问题时，就可以利用这些资料恢复更多的信息。热备份要求数据库在Archivelog方式下操作，并需要大量的档案空间。一旦数据库运行在archivelog状态下，就可以做备份了。热备份的命令文件由三部分组成： </p>
<p>---- 1．数据文件一个表空间一个表空间地备份。 </p>
<p>---- （1）设置表空间为备份状态 </p>
<p>---- （2）备份表空间的数据文件 </p>
<p>---- （3）恢复表空间为正常状态 </p>
<p>---- 2．备份归档log文件。 </p>
<p>---- （1）临时停止归档进程 </p>
<p>---- （2）log下那些在archive redo log目标目录中的文件 </p>
<p>---- （3）重新启动archive进程 </p>
<p>---- （4）备份归档的redo log 文件 </p>
<p>---- 3．用alter database backup controlfile命令来备份拷贝文件 </p>
<p>---- 热备份的优点是： </p>
<p>---- 1．可在表空间或数据文件级备份，备份时间短。 </p>
<p>---- 2．备份时数据库仍可使用。 </p>
<p>---- 3．可达到秒级恢复（恢复到某一时间点上）。 </p>
<p>---- 4．可对几乎所有数据库实体作恢复。 </p>
<p>---- 5．恢复是快速的，在大多数情况下在数据库仍工作时恢复。 </p>
<p>---- 热备份的不足是： </p>
<p>---- 1．不能出错，否则后果严重。 </p>
<p>---- 2．若热备份不成功，所得结果不可用于时间点的恢复。 </p>
<p>---- 3．因难于维护，所以要特别仔细小心，不允许&#8220;以失败而告终&#8221;。 <br></p>
<img src ="http://www.cnitblog.com/sunnywang/aggbug/37800.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sunnywang/" target="_blank">sunnywang   </a> 2007-12-17 18:39 <a href="http://www.cnitblog.com/sunnywang/archive/2007/12/17/37800.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OLAP 中的outline ， data file ,　cube ,  star-schema , snow-flake schema , 以及 与OLTP 的区别</title><link>http://www.cnitblog.com/sunnywang/archive/2007/12/17/37799.html</link><dc:creator>sunnywang   </dc:creator><author>sunnywang   </author><pubDate>Mon, 17 Dec 2007 09:36:00 GMT</pubDate><guid>http://www.cnitblog.com/sunnywang/archive/2007/12/17/37799.html</guid><wfw:comment>http://www.cnitblog.com/sunnywang/comments/37799.html</wfw:comment><comments>http://www.cnitblog.com/sunnywang/archive/2007/12/17/37799.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/sunnywang/comments/commentRss/37799.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/sunnywang/services/trackbacks/37799.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; <a href="http://doc.qiuhao.com/phrase/200603132213275.html">联机分析处理</a> (<a href="http://doc.qiuhao.com/phrase/200604232107315.html">OLAP</a>) 的概念最早是由关系<a href="http://doc.qiuhao.com/phrase/200602271218062.html">数据库</a>之父E.F.Codd于1993年提出的，他同时提出了关于OLAP的12条准则。OLAP的提出引起了很大的反响，OLAP作为一<a href="http://doc.qiuhao.com/phrase/200603090857555.html">类</a>产品同<a href="http://doc.qiuhao.com/phrase/200603011740155.html">联机事务处理</a> (<a href="http://doc.qiuhao.com/phrase/200604230827105.html">OLTP</a>) 明显区分开来。
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Codd提出OLAP的12条准则来描述OLAP系统：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 准则1 OLAP模型必须提供多维概念<a href="http://doc.qiuhao.com/phrase/200603141659315.html">视图</a><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;准则2 透明性准则<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 准则3 存取能力推测<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 准则4 稳定的报表能力<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 准则5 客户/服务器<a href="http://doc.qiuhao.com/phrase/200603122156385.html">体系结构</a><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 准则6 维的等同性准则<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 准则7 动态的稀疏矩阵处理准则<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 准则8 多用户支持能力准则<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 准则9 非受限的跨维操作<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 准则10 直观的数据操纵<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 准则11 灵活的报表生成<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 准则12 不受限的维与聚集层次</p>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当今的数据处理大致可以分成两大类：联机事务处理OLTP（on-line transaction processing）、联机分析处理OLAP（On-Line Analytical Processing）。OLTP是传统的关系型数据库的主要应用，主要是基本的、日常的事务处理，例如银行交易。OLAP是<a href="http://doc.qiuhao.com/phrase/200603091358275.html">数据仓库</a>系统的主要应用，支持复杂的分析操作，侧重决策支持，并且提供直观易懂的查询结果。下表列出了OLTP与OLAP之间的比较。</font></p>
<p><font face=Verdana>
<table width="97%" border=1>
    <tbody>
        <tr>
            <td width="22%">
            <div align=center></div>
            </td>
            <td width="41%">
            <div align=center>OLTP</div>
            </td>
            <td width="37%">
            <div align=center>OLAP</div>
            </td>
        </tr>
        <tr>
            <td width="22%">
            <div align=center>用户</div>
            </td>
            <td width="41%">
            <div align=center>操作人员,低层管理人员</div>
            </td>
            <td width="37%">
            <div align=center>决策人员,高级管理人员</div>
            </td>
        </tr>
        <tr>
            <td width="22%">
            <div align=center>功能</div>
            </td>
            <td width="41%">
            <div align=center>日常操作处理</div>
            </td>
            <td width="37%">
            <div align=center>分析决策</div>
            </td>
        </tr>
        <tr>
            <td width="22%">
            <div align=center><a href="http://doc.qiuhao.com/phrase/200604231245475.html">DB</a> 设计</div>
            </td>
            <td width="41%">
            <div align=center>面向应用</div>
            </td>
            <td width="37%">
            <div align=center>面向主题</div>
            </td>
        </tr>
        <tr>
            <td width="22%">
            <div align=center>数据</div>
            </td>
            <td width="41%">
            <div align=center>当前的, 最新的细节的, 二维的分立的</div>
            </td>
            <td width="37%">
            <div align=center>历史的, 聚集的, 多维的集成的, 统一的</div>
            </td>
        </tr>
        <tr>
            <td width="22%">
            <div align=center>存取</div>
            </td>
            <td width="41%">
            <div align=center>读/写数十条记录</div>
            </td>
            <td width="37%">
            <div align=center>读上百万条记录</div>
            </td>
        </tr>
        <tr>
            <td width="22%">
            <div align=center>工作单位</div>
            </td>
            <td width="41%">
            <div align=center>简单的事务</div>
            </td>
            <td width="37%">
            <div align=center>复杂的查询</div>
            </td>
        </tr>
        <tr>
            <td width="22%">
            <div align=center>用户数</div>
            </td>
            <td width="41%">
            <div align=center>上千个</div>
            </td>
            <td width="37%">
            <div align=center>上百个</div>
            </td>
        </tr>
        <tr>
            <td width="22%">
            <div align=center>DB 大小</div>
            </td>
            <td width="41%">
            <div align=center>100MB-GB</div>
            </td>
            <td width="37%">
            <div align=center>100GB-TB</div>
            </td>
        </tr>
    </tbody>
</table>
</font></p>
<font face=Verdana>
<p><br><strong>一、OLAP的发展背景</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 随着数据库技术的广泛应用，企业<a href="http://doc.qiuhao.com/phrase/200603011147495.html">信息系统</a>产生了大量的数据，如何从这些海量数据中提取对企业决策分析有用的信息成为企业决策管理人员所面临的重要难题。传统的企业<a href="http://doc.qiuhao.com/phrase/200603011056245.html">数据库系统</a>（<a href="http://doc.qiuhao.com/phrase/200603011329335.html">管理信息系统</a>）即联机事务处理系统（On-LineTransactionProcessing,简称OLTP）作为数据管理手段，主要用于事务处理，但它对分析处理的支持一直不能令人满意。因此，人们逐渐尝试对OLTP数据库中的数据进行再加工，形成一个综合的、面向分析的、更好的支持决策制定的<a href="http://doc.qiuhao.com/phrase/200603011653185.html">决策支持系统</a>（DecisionSupportSystem，简称<a href="http://doc.qiuhao.com/phrase/200604230823395.html">DSS</a>）。企业目前的信息系统的数据一般由<a href="http://doc.qiuhao.com/phrase/200604221337185.html">DBMS</a>管理，但决策数据库和运行操作数据库在数据来源、数据内容、数据<a href="http://doc.qiuhao.com/phrase/200603061709535.html">模式</a>、服务<a href="http://doc.qiuhao.com/phrase/200603090845215.html">对象</a>、访问方式、事务管理乃至无力存储等方面都有不同的特点和要求，因此直接在运行操作的数据库上建立DSS是不合适的。数据仓库（DataWarehouse）技术就是在这样的背景下发展起来的。数据仓库的概念提出于20世纪80年代中期，20世纪90年代，数据仓库已从早起的探索阶段走向实用阶段。业界公认的数据仓库概念创始人W.H.Inmon在《BuildingtheDataWarehouse》一书中对数据仓库的定义是：&#8220;数据仓库是支持管理决策过程的、面向主题的、集成的、随时间变化的持久的数据集合&#8221;。构建数据仓库的过程就是根据预先设计好的逻辑模式从分布在企业内部各处的OLTP数据库中提取数据并对经过必要的变换最终形成全企业统一模式数据的过程。当前数据仓库的核心仍是RDBMS管理下的一个数据库系统。数据仓库中数据量巨大，为了提高性能，RDBMS一般也采取一些提高效率的措施：采用并行处理结构、新的数据组织、查询策略、索引技术等等。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 包括联机分析处理（On-LineAnalyticalProcessing，简称OLAP）在内的诸多应用牵引驱动了数据仓库技术的出现和发展；而数据仓库技术反过来又促进了OLAP技术的发展。联机分析处理的概念最早由关系数据库之父E.F.Codd于1993年提出的。Codd认为联机事务处理（OLTP）已不能满足终端用户对数据库查询分析的要求，<a href="http://doc.qiuhao.com/phrase/200604022014515.html">SQL</a>对大数据库的简单查询也不能满足用户分析的<a href="http://doc.qiuhao.com/phrase/200603101518295.html">需求</a>。用户的决策分析需要对关系数据库进行大量计算才能得到结果，而查询的结果并不能满足决策者提出的需求。因此，Codd提出了多维数据库和多维分析的概念，即OLAP。OLAP委员会对联机分析处理的定义为：使分析人员、管理人员或执行人员能够从多种角度对从<a href="http://doc.qiuhao.com/phrase/200604091753595.html">原始数据</a>中转化出来的、能够真正为用户所理解的、并真实反映企业维特性的信息进行快速、一致、交互地存取，从而获得对数据的更深入了解的一类<a href="http://doc.qiuhao.com/phrase/200604232134205.html">软件</a>技术。OLAP的目标是满足决策支持或多维环境特定的查询和报表需求，它的技术核心是&#8220;维&#8221;这个概念，因此OLAP也可以说是多维数据分析工具的集合。</p>
<p><strong>二、联机分析处理的特点</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在过去的二十年中，大量的企业利用关系型数据库来存储和管理业务数据，并建立相应的应用系统来支持日常业务运作。这种应用以支持业务处理为主要目的，被称为联机事务处理(OLTP，On-line Transaction Processing)应用，它所存储的数据被称为操作数据或者业务数据。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 随着市场竞争的日趋激烈，近年来企业更加强调决策的及时性和准确性，这使得以支持决策管理分析为主要目的的应用迅速崛起，这类应用被称为联机分析处理，它所存储的数据被称为信息数据。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 联机分析处理的用户是企业中的专业分析人员及管理决策人员，他们在分析业务经营的数据时，从不同的角度来审视业务的衡量指标是一种很自然的思考模式。例如分析销售数据，可能会综合时间周期、产品类别、分销渠道、地理分布、客户群类等多种因素来考量。这些分析角度虽然可以通过报表来反映，但每一个分析的角度可以生成一张报表，各个分析角度的不同组合又可以生成不同的报表，使得IT人员的工作量相当大，而且往往难以跟上管理决策人员思考的步伐。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 联机分析处理的主要特点，是直接仿照用户的多角度思考模式，预先为用户组建多维的数据模型，在这里，维指的是用户的分析角度。例如对销售数据的分析，时间周期是一个维度，产品类别、分销渠道、地理分布、客户群类也分别是一个维度。一旦多维数据模型建立完成，用户可以快速地从各个分析角度获取数据，也能动态的在各个角度之间切换或者进行多角度综合分析，具有极大的分析灵活性。这也是联机分析处理在近年来被广泛关注的根本原因，它从设计理念和真正实现上都与旧有的管理信息系统有着本质的区别。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 事实上，随着数据仓库理论的发展，数据仓库系统已逐步成为新型的决策管理信息系统的解决方案。数据仓库系统的核心是联机分析处理，但数据仓库包括更为广泛的内容。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -概括来说，数据仓库系统是指具有综合企业数据的能力，能够对大量企业数据进行快速和准确分析，辅助做出更好的商业决策的系统。它本身包括三部分内容：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据层。实现对企业操作数据的抽取、转换、清洗和汇总，形成信息数据，并存储在企业级的中心信息数据库中。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 应用层。通过联机分析处理，甚至是<a href="http://doc.qiuhao.com/phrase/200603011738105.html">数据挖掘</a>等应用处理，实现对信息数据的分析。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表现层。通过前台分析工具，将查询报表、统计分析、多维联机分析和数据发掘的结论展现在用户面前。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从应用角度来说，数据仓库系统除了联机分析处理外，还可以采用传统的报表，或者采用数理统计和<a href="http://doc.qiuhao.com/phrase/200603011759495.html">人工智能</a>等数据挖掘手段，涵盖的范围更广；就应用范围而言，联机分析处理往往根据用户分析的主题进行应用分割，例如：销售分析、市场推广分析、客户利润率分析等等，每一个分析的主题形成一个OLAP应用，而所有的OLAP应用实际上只是数据仓库系统的一部分。</p>
<p><strong>三、OLAP逻辑概念和典型操作</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OLAP展现在用户面前的是一幅幅多维视图。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 维（Dimension）：是人们观察数据的特定角度，是考虑问题时的一类属性，属性集合构成一个维（时间维、地理维等）。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 维的层次（Level）：人们观察数据的某个特定角度（即某个维）还可以存在细节程度不同的各个描述方面（时间维：日期、月份、季度、年）。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 维的成员（Member）：维的一个取值，是数据项在某维中位置的描述。（&#8220;某年某月某日&#8221;是在时间维上位置的描述）。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://doc.qiuhao.com/phrase/200604231331545.html">度量</a>（Measure）：多维数组的取值。（2000年1月，上海，笔记本<a href="http://doc.qiuhao.com/phrase/200604231234155.html">电脑</a>，$100000）。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OLAP的基本多维分析操作有<a href="http://doc.qiuhao.com/phrase/200603141012445.html">钻取</a>（Drill-up和Drill-down）、切片（Slice）和切块（Dice）、以及旋转（Pivot）等。<br>钻取：是改变维的层次，变换分析的粒度。它包括向下钻取（Drill-down）和向上钻取（Drill-up）/上卷(Roll-up)。Drill-up是在某一维上将低层次的细节数据概括到高层次的汇总数据，或者减少维数；而Drill-down则相反，它从汇总数据深入到细节数据进行观察或增加新维。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 切片和切块：是在一部分维上选定值后，关心度量数据在剩余维上的分布。如果剩余的维只有两个，则是切片；如果有三个或以上，则是切块。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 旋转：是变换维的方向，即在表格中重新安排维的放置（例如行列互换）。</p>
<p><strong>四、OLAP系统的体系结构和分类</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据仓库与OLAP的关系是互补的，现代OLAP系统一般以数据仓库作为基础，即从数据仓库中抽取详细数据的一个子集并经过必要的聚集存储到OLAP存储器中供前端分析工具读取。典型的OLAP系统体系结构如下图所示：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OLAP系统按照其存储器的数据存储格式可以分为<a href="http://doc.qiuhao.com/phrase/200604241321295.html">关系OLAP</a>（RelationalOLAP，简称<a href="http://doc.qiuhao.com/phrase/200604152223065.html">ROLAP</a>）、<a href="http://doc.qiuhao.com/phrase/200604241319595.html">多维OLAP</a>（MultidimensionalOLAP，简称<a href="http://doc.qiuhao.com/phrase/200604152128365.html">MOLAP</a>）和混合型OLAP（HybridOLAP，简称<a href="http://doc.qiuhao.com/phrase/200604152302015.html">HOLAP</a>）三种<a href="http://doc.qiuhao.com/phrase/200603051002565.html">类型</a>。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.ROLAP</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ROLAP将分析用的多维数据存储在关系数据库中并根据应用的需要有选择的定义一批实视图作为表也存储在关系数据库中。不必要将每一个SQL查询都作为实视图保存，只定义那些应用频率比较高、计算工作量比较大的查询作为实视图。对每个针对OLAP服务器的查询，优先利用已经计算好的实视图来生成查询结果以提高查询效率。同时用作ROLAP存储器的RDBMS也针对OLAP作相应的优化，比如并行存储、并行查询、并行数据管理、基于成本的查询优化、位图索引、SQL的OLAP扩展(cube,rollup)等等。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.MOLAP</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOLAP将OLAP分析所用到的多维数据物理上存储为多维数组的形式，形成&#8220;立方体&#8221;的结构。维的属性值被映射成多维数组的下标值或下标的范围，而总结数据作为多维数组的值存储在数组的单元中。由于MOLAP采用了新的存储结构，从物理层实现起，因此又称为物理OLAP（PhysicalOLAP）；而ROLAP主要通过一些<a href="http://doc.qiuhao.com/phrase/200602282117345.html">软件工具</a>或中间软件实现，物理层仍采用关系数据库的存储结构，因此称为虚拟OLAP（VirtualOLAP）。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.HOLAP</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由于MOLAP和ROLAP有着各自的优点和缺点（如下表所示）,且它们的结构迥然不同，这给分析人员设计OLAP结构提出了难题。为此一个新的OLAP结构——混合型OLAP（HOLAP）被提出，它能把MOLAP和ROLAP两种结构的优点结合起来。迄今为止，对HOLAP还没有一个正式的定义。但很明显，HOLAP结构不应该是MOLAP与ROLAP结构的简单组合，而是这两种结构技术优点的有机结合，能满足用户各种复杂的分析请求。</p>
<p>
<table cellSpacing=0 cellPadding=0 width=729 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=355>
            <h4><span>rolap</span></h4>
            </td>
            <td vAlign=top width=374>
            <h4><span>molap</span></h4>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=355>
            <p><span>沿用现有的关系数据库的技术</span></p>
            </td>
            <td vAlign=top width=374>
            <p><span>专为</span><span>olap</span><span>所设计</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=355>
            <p><span>响应速度比</span><span>molap</span><span>慢；</span></p>
            <p><span>现有关系型数据库已经对</span><span>olap</span><span>做了很多优化，包括并行存储、并行查询、并行数据管理、基于成本的查询优化、位图索引、</span><span>sql</span><span> </span><span>的</span><span>olap</span><span>扩展</span><span>(</span><span>cube</span><span>,</span><span>rollup</span><span>)</span><span>等，性能有所提高</span><span> </span></p>
            </td>
            <td vAlign=top width=374>
            <p><span>性能好、响应速度快</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=355>
            <p><span>数据装载速度快</span></p>
            </td>
            <td vAlign=top width=374>
            <p><span>数据装载速度慢</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=355>
            <p><span>存储空间耗费小，维数没有限制</span></p>
            </td>
            <td vAlign=top width=374>
            <p><span>需要进行预计算<span>,可能导致数据爆炸，维数有限；无法支持维的动态变化</span></span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=355>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width=374>
            <p>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=355>
            <p><span>借用</span><span>rdbms</span><span>存储数据，没有<a href="http://doc.qiuhao.com/phrase/200602282323195.html">文件</a>大小限制</span></p>
            </td>
            <td vAlign=top width=374>
            <p><span>受<a href="http://doc.qiuhao.com/phrase/200602281634075.html">操作系统</a>平台中文件大小的限制，难以达到</span><span>tb </span><span>级</span><span>(</span><span>只能</span><span>10~20g)</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=355>
            <p><span>可以通过</span><span>sql</span><span>实现详细数据与概要数据的存储</span></p>
            </td>
            <td vAlign=top width=374>
            <p><span>缺乏数据模型和数据访问的标准</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=355>
            <p><span>&#8211;</span><span>不支持有关预计算的读写操作</span></p>
            <p><span>&#8211;</span><span>sql</span><span>无法完成部分计算</span></p>
            <p><span>?</span><span>无法完成多行的计算</span></p>
            <p><span>?</span><span>无法完成维之间的计算</span></p>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width=374>
            <p><span>&#8211;</span><span>支持高性能的决策支持计算</span></p>
            <p><span>?</span><span>复杂的跨维计算</span></p>
            <p><span>?</span><span>多用户的读写操作</span></p>
            <p><span>?</span><span>行级的计算</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=355>
            <p><span>维护困难</span></p>
            </td>
            <td vAlign=top width=374>
            <p><span>管理简便</span></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><strong>五、联机分析处理的实现方式</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 同样是仿照用户的多角度思考模式，联机分析处理有三种不同的实现方法：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; &#183; <a href="http://doc.qiuhao.com/phrase/200604241321475.html">关系型联机分析处理</a>(ROLAP,Relational OLAP)<br>&nbsp;&nbsp;&nbsp;&nbsp; &#183; <a href="http://doc.qiuhao.com/phrase/200604241319415.html">多维联机分析处理</a>(MOLAP,Multi-Dimensional OLAP)<br>&nbsp;&nbsp;&nbsp;&nbsp; &#183; 前端展示联机分析处理(Desktop OLAP)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其中，前端展示联机分析需要将所有数据下载到客户机上，然后在客户机上进行数据结构/报表格式重组，使用户能在本机实现动态分析。该方式比较灵活，然而它能够支持的数据量非常有限，严重地影响了使用的范围和效率。因此，随着时间的推移，这种方式已退居次要地位，在此不作讨论。<br></p>
<p><br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以下就ROLAP和MOLAP的具体实施方法进行讨论：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、关系型联机分析处理的具体实施方法：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 顾名思义，关系型联机分析处理是以关系型数据库为基础的。唯一特别之处在于<span style="BACKGROUND-COLOR: #3366ff">联机分析处理中的数据结构组织的方</span>式。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 让我们考察一个例子，假设我们要进行产品销售的财务分析，分析的角度包括时间、产品类别、市场分布、实际发生与预算四方面内容，分析的财务指标包括：销售额、销售支出、毛利(=销售额-销售支出)、费用、纯利(=毛利-费用)等内容，则我们可以建立如下的数据结构：</p>
<p><img src="http://www.itisedu.com/manage/Upload/image/200631322170302.jpg" border=0><span style="BACKGROUND-COLOR: #ffcc00">&nbsp;&nbsp;星型模式 star-schema&nbsp; 我们看到的是表的数据<br></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;<br><br>&nbsp; 该数据结构的中心是<span style="BACKGROUND-COLOR: #ffcc00">主表</span>，里面包含了所有分析维度的外键，以及所有的财务指标，可计算推导的财务指标不计在内，我们称之为事实表(Fact Table)。周围的表分别是对应于各个分析角度的维表(Dimension Table)，每个维表除了主键以外，还包含了描述和分类信息。无论原来的业务数据的数据结构为何，只要原业务数据能够整理成为以上模式，则无论业务人员据此提出任何问题，都可以用SQL语句进行表连接或汇总(table join and group by)实现数据查询和解答。（当然，有一些现成的ROLAP前端分析工具是可以自动根据以上模型生成SQL语句的）。这种模式被称为星型模式(Star-Schema)，可应用于不同的联机分析处理应用中。<br></p>
<p><br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以下是另一个采用星型模式的例子，分析的角度和指标截然不同，但数据结构模式一样。我们看到的不是表的数据，而是表的结构。在联机分析处理的数据模型设计中，这种表达方式更为常见：</p>
<p><img src="http://www.itisedu.com/manage/Upload/image/200631322187967.jpg" border=0>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 星型模式star model&nbsp;看到表的结构</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;有时候，维表的定义会变得复杂，例如对产品维，既要按产品种类进行划分，对某些特殊商品，又要另外进行品牌划分，商品品牌和产品种类划分方法并不一样。因此，单张维表不是理想的解决方案，可以采用以下方式，这种数据模型实际上是星型结构的拓展，我们称之为雪花型模式(snow-flake schema).<br></p>
<p><br><img src="http://www.itisedu.com/manage/Upload/image/2006313221817766.jpg" border=0>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 雪花型模式 snow-flake schema 表的结构<br><br><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;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对同一维度要求有不用的划分种类！&nbsp;&nbsp;&nbsp;&nbsp; <br><br><br><br><br><br>总结：</p>
<p>&nbsp;<br></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 无论采用星型模式还是雪花型模式，关系型联机分析处理都具有以下特点：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183; 数据结构和组织模式需要预先设计和建立；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183; 数据查询需要进行表连接，在查询<a href="http://doc.qiuhao.com/phrase/200603291559575.html">性能测试</a>中往往是影响速度的关键；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183; 数据汇总查询（例如查询某个品牌的所有产品销售额），需要进行Group by 操作，虽然实际得出的数据量很少，但查询时间变得更长；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183; 为了改善数据汇总查询的性能，可以建立汇总表，但汇总表的数量与用户分析的角度数目和每个角度的层次数目密切相关。例如，用户从8个角度进行分析，每个角度有3个汇总层次，则汇总表的数目高达3的8次方。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以采取对常用汇总数据建立汇总表，对不常用的汇总数据进行Group by 操作，这样来取得性能和管理复杂度之间的均衡。<br></p>
<p><br><br><br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><span style="BACKGROUND-COLOR: #ccffff"> 2、多维联机分析处理的具体实施方法：<br><br></span><br></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 多维联机分析处理实际上是用多维数组的方式对关系型数据表进行处理。下图是ROLAP与MOLAP的对比：</p>
<p><img src="http://www.itisedu.com/manage/Upload/image/2006313221826447.jpg" border=0>&nbsp;&nbsp;&nbsp;&nbsp; <span style="COLOR: #808000"><img src="http://www.cnitblog.com/CuteSoft_Client/CuteEditor/images/face2.gif" align=absMiddle border=0>看看这就是MOLAP&nbsp;<u> 数据文件</u>和 <u>概要文件！</u></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图中左边是ROLAP方式，右边是MOLAP方式，两者对应的是同一个三维模型。MOLAP首先对事实表中的所有外键进行排序，并将排序后的具体指标数值一一写进虚拟的多维立方体中。当然，虚拟的多维立方体只是为了便于理解而构想的，<span style="COLOR: #ff00ff">MOLAP实际的数据存储放在数据文件(Data File)中</span>，其数据放置的顺序与虚拟的多维立方体按x,y,z坐标展开的顺序是一致的(如上图)。同时，为了数据查找的方便，MOLAP需要预先建立维度的索引，<span style="COLOR: #3366ff">这个索引被放置在MOLAP的概要文件(Outline)中。</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="BACKGROUND-COLOR: #cc99ff"> 概要文件是MOLAP的核心，相当于ROLAP的数据模型设计</span>。概要文件包括所有维的定义（包括复杂的维度结构）以及各个层次的数据汇总关系(例如在时间维，日汇总至月，月汇总至季，季汇总至年)，这些定义往往从关系型维表中直接引入即可。概要文件也包括分析指标的定义，因此可以在概要文件中包含丰富的衍生指标，这些衍生指标由基础指标计算推导出来（例如ROLAP例子1中的纯利和毛利）。<span style="BACKGROUND-COLOR: #3366ff">概要文件</span>的结构如下图所示：</p>
<p><img src="http://www.itisedu.com/manage/Upload/image/2006313221839347.jpg" border=0></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一旦概要文件定义好，MOLAP系统可以自动安排数据存储的方式和进行数据查询。从MOLAP的数据文件与ROLAP的事实表的对比可以看出，MOLAP的数据文件完全不需要纪录维度的外键，在维度比较多的情况下，这种数据存储方式大量地节省了空间。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 但是，如果数据相当稀疏，虚拟的多维立方体中很多数值为空时，MOLAP的数据文件需要对相关的位置留空，而ROLAP的事实表却不会存储这些纪录。<span style="BACKGROUND-COLOR: #008000">为了有效地解决这种情况，MOLAP采用了稀疏维和密集维相结合的处理方式，如下图。</span></p>
<p><img src="http://www.itisedu.com/manage/Upload/image/200631322190262.jpg" border=0></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 上图的背景是某些客户只通过某些分销渠道才购买，但是只要该客户存在，他在各个月和各个地区内均有消费(例如，华南IBM只通过熊猫国旅定购南航机票，但在华南四省在每个月均有机票订购)。则时间和地区维是密集维，客户和分销渠道是稀疏维，MOLAP将稀疏维建成索引文件(Index File)，密集维所对应的数值仍然保留在数据文件中，索引文件不存储空纪录。这样保持了对空间的合理利用。我们也可以看到，如果所有维都是稀疏维，则MOLAP的索引文件就退化成ROLAP的事实表， 两者没有区别了。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cnitblog.com/CuteSoft_Client/CuteEditor/images/face2.gif" align=absMiddle border=0> 在实际应用中，不可能所有分析的维度都是密集的，也绝少存在所有分析的维度都是稀疏的，因此稀疏维和密集维并用的模式几乎主导了所有的MOLAP应用。而稀疏维和密集维的定义全部集中在概要文件中，因此，只要预先定义好概要文件，所有的数据分布就自动确定了。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在这种模式中，<span style="COLOR: #33cccc; BACKGROUND-COLOR: #008000">密集维的组合组成了的数据块(Data Block)，</span><span style="BACKGROUND-COLOR: #ffcc99">每个数据块是I/O读写的基础单位</span>(如上图)，所有的数<span style="BACKGROUND-COLOR: #ffff99">据块组成了数据文件</span>。稀疏维的组合组成了索引文件，索引文件的每一个数据纪录的末尾都带有一个指针，指向要读写的数据块。因此，进行数据查询时，系统先搜索索引文件纪录，然后直接调用指针指向的数据块进行I/O读写(如果该数据块尚未驻留内存)，将相应数据块调入内存后，根据密集维的数据放置顺序直接计算出要查询的数据距离数据块头的偏移量，直接提取数据下传到<a href="http://doc.qiuhao.com/phrase/200603082208195.html">客户端</a>。因此，<u><span style="BACKGROUND-COLOR: #ffff99">MOLAP 方式基本上是索引搜索与直接寻址的查询方式相结合</span>，</u>比起ROLAP的表/索引搜索和表连接方式，速度要快得多。<br></p>
<p><br><br><br><br><br><br><br><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 多维联机分析处理有以下特点：</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183; 需要预先定义概要文件；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183; 数据查询采用<u>索引搜索与直接寻址的</u>方式相结合，不需要进行表连接，在查询性能测试中比起ROLAP有相当大的优势；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183; 在进行数据汇总查询之前，MOLAP需要预先按概要文件中定义的数据汇总关系进行计算，这个计算通常以批处理方式运行。计算结果回存在数据文件中，当用户查询时，直接调用计算结果，速度非常快。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183; 无论是数据汇总还是计算衍生数据，预先计算的方式实际上是用空间来换时间。当然，用户也可以选择动态计算的方式，用查询时间来换取存储空间。MOLAP可以灵活调整时空的取舍平衡。 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183; 用户难以使用概要文件中没有定义的数据汇总关系和衍生指标。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183; 在大数据量环境下，关系型数据库可以达到TB级的数据量，现有的MOLAP应用局限于基于文件系统的处理和查询方式，其性能会在100GB级别开始下降，需要进行数据分区处理，因此扩展性不如ROLAP。因此，MOLAP多数用于部门级的主题分析应用。 <br></p>
<p><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、其它考虑因素</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 联机分析处理其他要素<span style="BACKGROUND-COLOR: #99cc00">包括假设分析(What-if)，复杂计算，数据评估等等</span>。这些因素对用户的分析效用至关重要，但是与ROLAP和MOLAP的核心工作原理的不一定有很紧密的关系，事实上，ROLAP和MOLAP都可以在以上三方面有所建树，只不过实现的方法迥异。因此，这些因素更取决于各个厂商为他们的产品提供的外延功能。对于像IBM的<a href="http://doc.qiuhao.com/phrase/200604022243315.html">DB2</a> OLAP Server这样一个成熟的产品来说，这三方面均有独特的优势：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 假设分析</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 假设分析提出了类似于以下的问题："如果产品降价5%，而运费增加8%，对不同地区的分销商的进货成本会有什么影响？"这些问题常用于销售预测、费用预算分配、奖金制度确定等等。据此，用户可以分析出哪些角度、哪些因素的变化将对企业产生重要影响；并且，用户可以灵活调节自己手中掌握的资源(例如费用预算等)，将它用到最有效的地方中去。<br>假设分析要求OLAP系统能够随用户的思路调整数据，并动态反映出在调整后对其他数据的影响结果。事实上，进入OLAP的数据分两大类：事实数据和预算数据，例如本月实际发生的销售额是事实数据，上月对本月的销售额估算是预算数据。事实数据一般情况下不容修改，而预算数据则应常常进行调整。DB2 OLAP Server通过详细的权限定义区分了数据的读写权限，允许用户对预算数据进行更改，系统可以对其他受影响的数据进行计算，以反映出"假如发生如上情况，将会引起以下结果"的结论。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 复杂计算</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 分析人员往往需要分析复杂的衍生数据，诸如：同期对比、期初/期末余额、百分比份额计算、资源分配(按从顶向下的结构图逐级分配)、移动平均、均方差等等。对这些要求，DB2 OLAP Server提供丰富的功能函数以便用户使用。因为只有在无需编程的环境下，商业用户才能更好地灵活利用这些功能进行复杂的真实世界模拟。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据评估</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据评估包括两方面内容，有效性评估和商业意义评估。在有效性评估方面，数据抽取、清洗和转换的规则的定义是至关重要的。而合理的数据模型设计能有效防止无效数据的进入。例如在ROLAP中，如果维表没有采用<a href="http://doc.qiuhao.com/phrase/200604241409355.html">范式</a>设计(normalise design)，可能会接受如下的维表：</p>
<p>
<table cellSpacing=0 cellPadding=3 width="96%" border=0>
    <tbody>
        <tr>
            <td bgColor=#006699><strong><font color=#ffffff>机构代码</font></strong></td>
            <td bgColor=#006699><strong><font color=#ffffff>机构名称</font></strong></td>
            <td bgColor=#006699><strong><font color=#ffffff>所属区县 </font></strong></td>
            <td bgColor=#006699><strong><font color=#ffffff>所属城市 </font></strong></td>
            <td bgColor=#006699><strong><font color=#ffffff>所属省份</font></strong></td>
        </tr>
        <tr>
            <td>001</td>
            <td>越秀支行</td>
            <td>越秀区</td>
            <td>广州</td>
            <td>广东</td>
        </tr>
        <tr>
            <td colSpan=5><img height=1 alt=image src="http://www-900.ibm.com/images/dot.gif" width="100%"></td>
        </tr>
        <tr>
            <td>002</td>
            <td>祖庙支行</td>
            <td>佛山</td>
            <td>广州</td>
            <td>广东</td>
        </tr>
        <tr>
            <td colSpan=5><img height=1 alt=image src="http://www-900.ibm.com/images/dot.gif" width="100%"></td>
        </tr>
        <tr>
            <td>003</td>
            <td>翠屏支行</td>
            <td>佛山</td>
            <td>南海</td>
            <td>广东</td>
        </tr>
        <tr>
            <td colSpan=5><img height=1 alt=image src="http://www-900.ibm.com/images/dot.gif" width="100%"></td>
        </tr>
        <tr>
            <td>004</td>
            <td>。。。</td>
            <td>。。。</td>
            <td>。。。</td>
            <td>。。。</td>
        </tr>
    </tbody>
</table>
</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显然，002中显示的佛山属于广州市，与003中显示的佛山属于南海市是矛盾的。这显示出数据源有问题，但是如果采用星型模式设计，ROLAP无法自动发现数据源的问题！</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在类似情况下，MOLAP的表现稍占优势。因为MOLAP需要预先定义概要文件，而概要文件会详细分析维度的层次关系，因此生成概要文件时会反映数据源的错误。因此，在DB2 OLAP Server中，记录003会被拒收，并纪录在出错日志中，供IT人员更正。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 但是，OLAP对数据源有效性的验证能力毕竟是有限的，因此，数据有效性必须从<a href="http://doc.qiuhao.com/phrase/200604241224155.html">源数据</a>一级和数据抽取/清洗/转换处理一级来进行保障。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对用户而言，数据的商业含义评估更有意义。在商业活动中，指标数值的取值范围是比较稳定的，如果指标数值突然发生变化，或者在同期比较、同类比较中有特殊表现，意味着该指标代表的方方面面具有特别的分析意义。普通的OLAP往往需要用户自己去观察发现异常指标，而DB2 OLAP Server的OLAP Minor(多维数据挖掘功能)能为用户特别地指出哪些条件下的哪些指标偏离常值，从而引起用户的注意和思考。例如：12月份南部的圣诞礼品销售额不到同期类似区域（东部、中部、西部）的50%。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 综上所述，无论ROLAP还是MOLAP，都能够实现联机分析处理的基本功能，两者在查询效率，存储空间和扩展性方面各有千秋。IT人员在选择OLAP系统时，既要考虑产品内部的实现机制，同时也应考虑假设分析，复杂计算，数据评估方面的功能，为实现决策管理信息系统打下坚实的基础。<br></p>
<p><strong><br><br>六、主要OLAP厂商产品介绍</strong></p>
<p>Hyperion</p>
<p>HyperionEssbaseOLAPServer，在上面有超过100个的应用<a href="http://doc.qiuhao.com/phrase/200604232224305.html">程序</a>，有300多个用Essbase作为平台的开发商。具有几百个计算公式，支持过程的脚本预言，及统计和基于维的计算。</p>
<p>强大的OLAP查询能力，利用EssbaseQueryDesigner，商业用户可以不用IT人员的帮助自己<a href="http://doc.qiuhao.com/phrase/200604161439595.html">构件</a>复杂的查询。</p>
<p>广泛的应用支持，可以扩展数据仓库和ERP系统的价值，建立对<a href="http://doc.qiuhao.com/phrase/200603011335015.html">电子商务</a>、CRM、金融、制造业、零售和CPG（consumerpackagedgoods）等应用的分析程序。</p>
<p>Speed-of-Thought的响应时间，支持多用户同时读写</p>
<p>Web-Enabled的，以服务器为中心的体系结构，支持SMP</p>
<p>强大的合作伙伴提供完整的解决方案，60多个包装好的解决方案，300多个咨询和实施公司。</p>
<p>丰富的前端工具，有30多个前端工具可供选择，其中包括Hyperion自己的WiredforOLAP、Spider-ManWebApplication、Objects、EssbaseSpreadsheetAdd-In、WebGateway、Reporting。</p>
<p>HyperionEnterprise，为跨国公司提供的财务整合、报告和分析的解决方案。有3000多家组织在使用此套系统。</p>
<p>功能丰富：支持多种财务标准USGAAP，CanadianGAAP，UKGAAP，国际会计标准（ISA），FASB，HGB。分公司间交易的自动平帐。FAS52货币转换。FAS94。</p>
<p>易用：可通过Excel，Lotus1-2-3和各种浏览器访问系统。</p>
<p>支持公司结构的调整。</p>
<p>跨国公司的支持：同时支持6种语言及各个不同国家的法律和税收要求。</p>
<p>完整的过程控制和审计跟踪，及安全等级的设置。</p>
<p>能与ERP或其他数据源集成</p>
<p>HyperionPillar，预算和计划工具。全球用户超过1500家，提供基于活动的预算，基于项目的计划，集中式计划，销售预测和综合计划。</p>
<p>分布式体系结构</p>
<p>详细计划的制订：允许一线经理制订详细的计划</p>
<p>复杂的建模和分析能力</p>
<p><a href="http://doc.qiuhao.com/phrase/200604040935115.html">Oracle</a></p>
<p>ExpressServer提供全面的OLAP能力，有全球超过3000家用户</p>
<p>用户可通过Web和电子表格使用</p>
<p>灵活的数据组织方式，数据可以存放在ExpressServer内，也可直接在RDB上使用</p>
<p>有内建的分析函数和4GL来用户自己定制查询</p>
<p>Cognos</p>
<p>PowerPlay，为商务效率评价<a href="http://doc.qiuhao.com/phrase/200604241239285.html">BPM</a>（BusinessPerformanceMeasurement）提供全面的报告和分析环境。向决策者提供企业运行效率的各种关键数据，进行各种各样的分析。</p>
<p>只用鼠标点击、拖拉就可以浏览多维数据</p>
<p>自动利用Web发布得到的分析报告</p>
<p>支持多种OLAPServer：MicrosoftOLAPServices、HyperionEssbase、SAPBW、IBMOLAPforDB2</p>
<p>完备的授权和安全体系</p>
<p>NovaView，是MicrosoftSQLServer7.0OLAPServices的客户端应用程序。</p>
<p>MicroStrategy</p>
<p>MicroStrategy7，是新一代的智能平台（IntelligencePlatform）面向电子商务应用e-business和电子客户关系管理eCRM。</p>
<p>具有强大的分析能力</p>
<p>以Web为中心的界面</p>
<p>支持上百万的用户和TB的数据</p>
<p>快速开发能力，可直接利用已有的数据模式</p>
<p>IntelligenceServer，Oneforallanalyticapplications</p>
<p>Microsoft</p>
<p>SQLServer7.0OLAPServices，是SQLServer7.0的OLAP模块，可以使用任何关系数据库或平面文件作为数据源，其中的PivotTableService提供了客户端的数据缓存和计算能力。</p>
<p>智能的<a href="http://doc.qiuhao.com/phrase/200604231337375.html">Client</a>/Server数据管理，提高响应速度，降低网络流量</p>
<p>通过OLEDBforOLAP，允许不同的客户端访问</p>
<p>BusinessObjects</p>
<p>BusinessObjects，是易用的<a href="http://doc.qiuhao.com/phrase/200604232056595.html">BI</a>工具，允许用户存取、分析和共享数据。</p>
<p>可应用多种数据源：RDB，ERP，OLAP，Excel等</p>
<p>可应用VBA和开放式对象模型来进行开发定制</p>
<p>IBM</p>
<p>DB2OLAPServer，是强大的多维分析工具，把HyperionEssbase的OLAP引擎和DB2的关系数据库集成在一起。</p>
<p>与EssbaseAPI完全兼容</p>
<p>数据用星型模型存放在关系数据库DB2中</p>
<p>Brio</p>
<p>Brio.Enterprise，是强大的易用的BI工具，提供查询，OLAP分析和报告的能力</p>
<p>支持多种语言，包括中文</p>
<p>Brio.Report，强大的企业级报告工具</p>
<p><br>OLAP相关标准<br>APB-1OLAPBenchmarkReleaseII(SPONSOREDBYOLAPCOUNCIL)<br></p>
<p></font><br>
<hr color=#000080>
<br><br>2007-12-17 周一， 其实一直在说自己在学什么DW， 好多概念性的东西我还真是说不上来， 简单的就是这模式。<br><br>甚至不明白OLAP ， OLTP的区别。<br><br><br>&nbsp;&nbsp; 这篇文章， 感觉很好，让我清楚的明白了:OLAP&nbsp; 的数据结构， 设计模式，数据文件， 概要文件。<br><br>Cube "立方体" ：是指MOLAP的多维数据在物理上采用多维数组存储， 形成一个立方体的结构。
<p>&nbsp;</p>
<img src ="http://www.cnitblog.com/sunnywang/aggbug/37799.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sunnywang/" target="_blank">sunnywang   </a> 2007-12-17 17:36 <a href="http://www.cnitblog.com/sunnywang/archive/2007/12/17/37799.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库设计</title><link>http://www.cnitblog.com/sunnywang/archive/2007/12/14/37705.html</link><dc:creator>sunnywang   </dc:creator><author>sunnywang   </author><pubDate>Fri, 14 Dec 2007 09:09:00 GMT</pubDate><guid>http://www.cnitblog.com/sunnywang/archive/2007/12/14/37705.html</guid><wfw:comment>http://www.cnitblog.com/sunnywang/comments/37705.html</wfw:comment><comments>http://www.cnitblog.com/sunnywang/archive/2007/12/14/37705.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/sunnywang/comments/commentRss/37705.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/sunnywang/services/trackbacks/37705.html</trackback:ping><description><![CDATA[<p align=left>&nbsp;&nbsp; 　<a href="http://www.itisedu.com/phrase/200603011123415.html" target=_new>数据库设计</a>(<a href="http://www.itisedu.com/phrase/200604222040295.html" target=_new>Database Design</a>)是指对于一个给定的应用环境，构造最优的<a href="http://www.itisedu.com/phrase/200602271218062.html" target=_new>数据库</a><a href="http://www.itisedu.com/phrase/200603061709535.html" target=_new>模式</a>，建立数据库及其应用系统，使之能够有效地存储数据，满足各种用户的应用<a href="http://www.itisedu.com/phrase/200603101518295.html" target=_new>需求</a>（信息要求和处理要求）。</p>
<p>　　在数据库领域内，常常把使用数据库的各<a href="http://www.itisedu.com/phrase/200603090857555.html" target=_new>类</a>系统统称为数据库应用系统。</p>
<p>一、数据库和<a href="http://www.itisedu.com/phrase/200603011147495.html" target=_new>信息系统</a><br>　　(1)数据库是信息系统的核心和基础，把信息系统中大量的数据按一定的模型组织起来，提供存储、维护、检索数据的<br>　&nbsp;&nbsp; 　功能，使信息系统可以方便、及时、准确地从数据库中获得所需的信息。<br>　　(2)数据库是信息系统的各个部分能否紧密地结合在一起以及如何结合的关键所在。<br>　　(3)数据库设计是信息系统开发和建设的重要组成部分。<br>　　(4)数据库设计人员应该具备的技术和知识：<br>　　　 　数据库的基本知识和数据库设计技术<br>　　　　 <a href="http://www.itisedu.com/phrase/200603021438435.html" target=_new>计算机</a>科学的基础知识和<a href="http://www.itisedu.com/phrase/200602281641255.html" target=_new>程序设计</a>的方法和技巧<br>　　　 　<a href="http://www.itisedu.com/phrase/200602281725525.html" target=_new>软件工程</a>的原理和方法<br>　　　　 应用领域的知识</p>
<p>二、数据库设计的特点 <br>　　数据库建设是硬件、<a href="http://www.itisedu.com/phrase/200604232134205.html" target=_new>软件</a>和干件的结合<br>　　　三分技术，七分管理，十二分基础数据<br>　　　技术与管理的界面称之为&#8220;干件&#8221;<br>　　数据库设计应该与应用系统设计相结合<br>　　　结构（数据）设计：设计数据库<a href="http://www.itisedu.com/phrase/200603061723295.html" target=_new>框架</a>或数据库结构<br>　　　行为（处理）设计：设计应用<a href="http://www.itisedu.com/phrase/200604232224305.html" target=_new>程序</a>、事务处理等<br>　　结构和行为分离的设计<br>　　　传统的软件工程忽视对应用中数据语义的分析和抽象，只要有可能就尽量推迟数据结构设计的决策早期的数据库设计致力于数据模型和建模方法研究，忽视了对行为的设计<br>　　如图：<br></p>
<p align=center><img src="http://www.itisedu.com/manage/Upload/image/2006327171322129.jpg" border=0></p>
<p>　　　　　　&nbsp;&nbsp; 　 <br>三、数据库设计方法简述 <br>　　手工试凑法<br>　　　设计质量与设计人员的经验和水平有直接关系<br>　　　缺乏科学理论和工程方法的支持，工程的质量难以保证<br>　　　数据库运行一段时间后常常又不同程度地发现各种问题，增加了维护代价<br>　　规范设计法<br>　　　手工设计方<br>　　　基本思想<br>　　过程迭代和逐步求精<br>　　规范设计法(续)<br>　　典型方法：<br>　　(1)新奥尔良（New Orleans）方法：将数据库设计分为四个阶段<br>　　　　S.B.Yao方法：将数据库设计分为五个步骤<br>　　　　I.R.Palmer方法：把数据库设计当成一步接一步的过程<br>　　(2)计算机辅助设计<br>　　　　<a href="http://www.itisedu.com/phrase/200604040935115.html" target=_new>ORACLE</a> Designer 2000<br>　　　　<a href="http://www.itisedu.com/phrase/200604040934365.html" target=_new>SYBASE</a> PowerDesigner</p>
<p>四、数据库设计的基本步骤<br>　　数据库设计的过程(六个阶段) <br>　&nbsp; 1.<a href="http://www.itisedu.com/phrase/200603062220345.html" target=_new>需求分析</a>阶段<br>　　　准确了解与分析用户需求（包括数据与处理）<br>　　　是整个设计过程的基础，是最困难、最耗费时间的一步<br>　　2.概念结构设计阶段<br>　　　是整个数据库设计的关键<br>　　　通过对用户需求进行综合、归纳与抽象，形成一个独立于具体<a href="http://www.itisedu.com/phrase/200604221337185.html" target=_new>DBMS</a>的<a href="http://www.itisedu.com/phrase/200604181844195.html" target=_new>概念模型</a><br>　　3.逻辑结构设计阶段<br>　　　将概念结构转换为某个DBMS所支持的数据模型<br>　　　对其进行优化<br>　　4.数据库物理设计阶段<br>　　　为逻辑数据模型选取一个最适合应用环境的物理结构（包括存储结构和存取方法）<br>　　5.数据库实施阶段<br>　　　运用DBMS提供的数据语言、工具及宿主语言，根据逻辑设计和物理设计的结果<br>　　　建立数据库，编制与调试应用程序，组织数据入库，并进行试运行<br>　　6.数据库运行和维护阶段<br>　　　数据库应用系统经过试运行后即可投入正式运行。<br>　　　在<a href="http://www.itisedu.com/phrase/200603011056245.html" target=_new>数据库系统</a>运行过程中必须不断地对其进行评价、调整与修改<br>　<strong>　设计特点:<br></strong>　　　在设计过程中把数据库的设计和对数据库中数据处理的设计紧密结合起来将这两个方面的需求分析、抽象、设计、实现在各个阶段同时进行，相互参照，相互补充，以完善两方面的设计</p>
<p>　　设计过程各个阶段的设计描述：<br>　　如图：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p align=center><img src="http://www.itisedu.com/manage/Upload/image/2006327171351881.jpg" border=0></p>
<p><br>五、数据库各级模式的形成过程<br>　　1.需求分析阶段：综合各个用户的应用需求<br>　　2.概念设计阶段：形成独立于机器特点，独立于各个DBMS产品的概念模式(E-R图)<br>　　3.逻辑设计阶段：首先将E-R图转换成具体的数据库产品支持的数据模型，如关系模型，形成数据库逻辑模式；然后根据用户处理的要求、安全性的考虑，在基本表的基础上再建立必要的<a href="http://www.itisedu.com/phrase/200603141659315.html" target=_new>视图</a>(View)，形成数据的外模式<br>　　4.物理设计阶段：根据DBMS特点和处理的需要，进行物理存储安排，建立索引，形成数据库内模式 <br><br><br></p>
<p><span style="COLOR: #ff00ff"><br>六、数据库设计技巧</span></p>
<p>　　1. 设计数据库之前（需求分析阶段）<br><br>　　1) 理解客户需求，询问用户如何看待未来需求变化。让客户解释其需求，而且随着开发的继续，还要经常询问客户保证其需求仍然在开发的目的之中。<br><br>　　2) 了解企业业务可以在以后的开发阶段节约大量的时间。<br><br>　　3) 重视输入输出。<br><br>　　在定义数据库表和字段需求（输入）时，首先应检查现有的或者已经设计出的报表、查询和视图（输出）以决定为了支持这些输出哪些是必要的表和字段。<br>　　举例：假如客户需要一个报表按照邮政编码排序、分段和求和，你要保证其中包括了单独的邮政编码字段而不要把邮政编码糅进地址字段里。<br><br>　　4) 创建数据字典和ER 图表<br><br>　　ER 图表和数据字典可以让任何了解数据库的人都明确如何从数据库中获得数据。ER图对表明表之间关系很有用，而数据字典则说明了每个字段的用途以及任何可能存在的别名。对<a href="http://www.itisedu.com/phrase/200604022014515.html" target=_new>SQL</a> 表达式的文档化来说这是完全必要的。<br><br>　　5) 定义标准的<a href="http://www.itisedu.com/phrase/200603090845215.html" target=_new>对象</a>命名规范<br>　　数据库各种对象的命名必须规范。</p>
<p>　<strong>2. 表和字段的设计（数据库逻辑设计）<br><br></strong>　　表设计原则<br><br>　　1) 标准化和规范化<br>　　数据的标准化有助于消除数据库中的数据冗余。标准化有好几种形式，但Third Normal Form（<a href="http://www.itisedu.com/phrase/200604172019525.html" target=_new>3NF</a>）通常被认为在性能、扩展性和数据完整性方面达到了最好平衡。简单来说，遵守3NF 标准的数据库的表设计原则是：&#8220;One Fact in One Place&#8221;即某个表只包括其本身基本的属性，当不是它们本身所具有的属性时需进行分解。表之间的关系通过外键相连接。它具有以下特点：有一组表专门存放通过键连接起来的关联数据。<br>　　举例：某个存放客户及其有关定单的3NF 数据库就可能有两个表：Customer 和Order。Order 表不包含定单关联客户的任何信息，但表内会存放一个键值，该键指向Customer 表里包含该客户信息的那一行。<br>　　事实上，为了效率的缘故，对表不进行标准化有时也是必要的。<br><br>　　2) 数据驱动<br>　　采用数据驱动而非硬编码的方式，许多策略变更和维护都会方便得多，大大增强系统的灵活性和扩展性。<br>　　举例，假如用户界面要访问外部数据源（<a href="http://www.itisedu.com/phrase/200602282323195.html" target=_new>文件</a>、<a href="http://www.itisedu.com/phrase/200604231236585.html" target=_new>XML</a> 文档、其他数据库等），不妨把相应的连接和路径信息存储在用户界面支持表里。还有，如果用户界面执行<a href="http://www.itisedu.com/phrase/200603110944215.html" target=_new>工作流</a>之类的任务（发送邮件、打印信笺、修改记录状态等），那么产生工作流的数据也可以存放在数据库里。角色权限管理也可以通过数据驱动来完成。事实上，如果过程是数据驱动的，你就可以把相当大的责任推给用户，由用户来维护自己的工作流过程。<br><br>　　3) 考虑各种变化<br>　　在设计数据库的时候考虑到哪些数据字段将来可能会发生变更。<br>　　举例，姓氏就是如此（注意是西方人的姓氏，比如女性结婚后从夫姓等）。所以，在建立系统存储客户信息时，在单独的一个数据表里存储姓氏字段，而且还附加起始日和终止日等字段，这样就可以跟踪这一数据条目的变化。</p>
<p><br>　　<strong>字段设计原则</strong><br><br>　　4) 每个表中都应该添加的3 个有用的字段<br>dRecordCreationDate，在VB 下默认是Now()，而在<a href="http://www.itisedu.com/phrase/200604040933575.html" target=_new>SQL Server</a> 　　&#8226; 下默认为GETDATE()<br>sRecordCreator，在SQL Server 下默认为NOT NULL DEFAULT 　　&#8226; USER<br>nRecordVersion，记录的版本标记；有助于准确说明记录中出现null 数据或者丢失数据的原因 　　&#8226;<br><br>　　5) 对地址和电话采用多个字段<br>　　描述街道地址就短短一行记录是不够的。Address_Line1、Address_Line2 和Address_Line3 可以提供更大的灵活性。还有，电话号码和邮件地址最好拥有自己的数据表，其间具有自身的<a href="http://www.itisedu.com/phrase/200603051002565.html" target=_new>类型</a>和标记类别。<br><br>　　6) 使用角色实体定义属于某类别的列<br>　　在需要对属于特定类别或者具有特定角色的事物做定义时，可以用角色实体来创建特定的时间关联关系，从而可以实现自我文档化。<br>　　举例：用PERSON 实体和PERSON_<a href="http://www.itisedu.com/phrase/200604231258125.html" target=_new>TYPE</a> 实体来描述人员。比方说，当John Smith, Engineer 提升为John Smith, Director 乃至最后爬到John Smith, CIO 的高位，而所有你要做的不过是改变两个表PERSON 和PERSON_TYPE 之间关系的键值，同时增加一个日期/时间字段来知道变化是何时发生的。这样，你的PERSON_TYPE 表就包含了所有PERSON 的可能类型，比如Associate、Engineer、Director、CIO 或者CEO 等。还有个替代办法就是改变PERSON 记录来反映新头衔的变化，不过这样一来在时间上无法跟踪个人所处位置的具体时间。<br><br>　　7) 选择数字类型和文本类型尽量充足<br>　　在SQL 中使用smallint 和tinyint 类型要特别小心。比如，假如想看看月销售总额，总额字段类型是smallint，那么，如果总额超过了$32,767 就不能进行计算操作了。<br>　　而ID 类型的文本字段，比如客户ID 或定单号等等都应该设置得比一般想象更大。假设客户ID 为10 位数长。那你应该把数据库表字段的长度设为12 或者13 个字符长。但这额外占据的空间却无需将来<a href="http://www.itisedu.com/phrase/200603121222205.html" target=_new>重构</a>整个数据库就可以实现数据库规模的增长了。<br><br>　　8) 增加删除标记字段<br>　　在表中包含一个&#8220;删除标记&#8221;字段，这样就可以把行标记为删除。在关系数据库里不要单独删除某一行；最好采用清除数据程序而且要仔细维护索引整体性。 </p>
<p><strong>　　3. 选择键和索引（数据库逻辑设计）<br><br><br></strong>　　键选择原则：<br><br>　　1) 键设计4 原则<br><br>为关联字段创建外键。 　　&#8226;<br>所有的键都必须唯一。 　　&#8226;<br>避免使用复合键。 　　&#8226;<br>外键总是关联唯一的键字段。 　　&#8226;<br><br>　　2) 使用系统生成的主键<br>　　设计数据库的时候采用系统生成的键作为主键，那么实际控制了数据库的索引完整性。这样，数据库和非人工机制就有效地控制了对存储数据中每一行的访问。采用系统生成键作为主键还有一个优点：当拥有一致的键结构时，找到逻辑缺陷很容易。<br><br>　　3) 不要用用户的键(不让主键具有可更新性)<br>　　在确定采用什么字段作为表的键的时候，可一定要小心用户将要编辑的字段。通常的情况下不要选择用户可编辑的字段作为键。<br><br>　　4) 可选键有时可做主键<br>　　把可选键进一步用做主键，可以拥有建立强大索引的能力。</p>
<p><br><strong>　　索引使用原则：<br></strong><br>　　索引是从数据库中获取数据的最高效方式之一。95%的数据库性能问题都可以采用索引技术得到解决。<br>　　1) 逻辑主键使用唯一的成组索引，对系统键（作为存储过程）采用唯一的非成组索引，对任何外键列采用非成组索引。考虑数据库的空间有多大，表如何进行访问，还有这些访问是否主要用作读写。<br>　　2) 大多数数据库都索引自动创建的主键字段，但是可别忘了索引外键，它们也是经常使用的键，比如运行查询显示主表和所有关联表的某条记录就用得上。<br>　　3) 不要索引memo/note 字段，不要索引大型字段（有很多字符），这样作会让索引占用太多的存储空间。<br>　　4) 不要索引常用的小型表<br>　　不要为小型数据表设置任何键，假如它们经常有插入和删除操作就更别这样作了。对这些插入和删除操作的索引维护可能比扫描表空间消耗更多的时间。</p>
<p>　<strong>　4. 数据完整性设计（数据库逻辑设计）<br><br></strong>　　1) 完整性实现机制：<br><br>　　实体完整性：主键<br>　　参照完整性：<br>　　父表中删除数据：级联删除；受限删除；置空值<br>　　父表中插入数据：受限插入；递归插入<br>　　父表中更新数据：级联更新；受限更新；置空值<br>　　DBMS对参照完整性可以有两种方法实现：外键实现机制（约束规则）和触发器实现机制<br><br>　　用户定义完整性：<br>　　NOT NULL；CHECK；触发器<br><br>　　2) 用约束而非商务规则强制数据完整性<br><br>　　采用数据库系统实现数据的完整性。这不但包括通过标准化实现的完整性而且还包括数据的功能性。在写数据的时候还可以增加触发器来保证数据的正确性。不要依赖于商务层保证数据完整性；它不能保证表之间（外键）的完整性所以不能强加于其他完整性规则之上。<br><br>　　3) 强制指示完整性<br>　　在有害数据进入数据库之前将其剔除。激活数据库系统的指示完整性特性。这样可以保持数据的清洁而能迫使开发人员投入更多的时间处理错误条件。<br><br>　　4) 使用查找控制数据完整性<br>　　控制数据完整性的最佳方式就是限制用户的选择。只要有可能都应该提供给用户一个清晰的价值列表供其选择。这样将减少键入代码的错误和误解同时提供数据的一致性。某些公共数据特别适合查找：国家代码、状态代码等。<br><br>　　5) 采用视图<br>　　为了在数据库和应用程序代码之间提供另一层抽象，可以为应用程序建立专门的视图而不必非要应用程序直接访问数据表。这样做还等于在处理数据库变更时给你提供了更多的自由。</p>
<p><strong>　　5. 其他设计技巧<br></strong><br>　　1) 避免使用触发器<br><br>　　触发器的功能通常可以用其他方式实现。在调试程序时触发器可能成为干扰。假如你确实需要采用触发器，你最好集中对它文档化。<br><br>　　2) 使用常用英语（或者其他任何语言）而不要使用编码<br><br>　　在创建下拉菜单、列表、报表时最好按照英语名排序。假如需要编码，可以在编码旁附上用户知道的英语。<br><br>　　3) 保存常用信息<br><br>　　让一个表专门存放一般数据库信息非常有用。在这个表里存放数据库当前版本、最近检查/修复（对Access）、关联设计文档的名称、客户等信息。这样可以实现一种简单机制跟踪数据库，当客户抱怨他们的数据库没有达到希望的要求而与你联系时，这样做对非客户机/服务器环境特别有用。<br><br>　　4) 包含版本机制<br><br>　　在数据库中引入<a href="http://www.itisedu.com/phrase/200603292355295.html" target=_new>版本控制</a>机制来确定使用中的数据库的版本。时间一长，用户的需求总是会改变的。最终可能会要求修改数据库结构。把版本信息直接存放到数据库中更为方便。 <br><br>　　5) 编制文档<br><br>　　对所有的快捷方式、命名规范、限制和函数都要编制文档。<br>　　采用给表、列、触发器等加注释的数据库工具。对开发、支持和跟踪修改非常有用。<br>　　对数据库文档化，或者在数据库自身的内部或者单独建立文档。这样，当过了一年多时间后再回过头来做第2 个版本，犯错的机会将大大减少。<br><br>　　6) 测试、测试、反复测试<br>　　建立或者修订数据库之后，必须用用户新输入的数据测试数据字段。最重要的是，让用户进行测试并且同用户一道保证选择的数据类型满足商业要求。测试需要在把新数据库投入实际服务之前完成。<br><br>　　7) 检查设计<br>　　在开发期间检查数据库设计的常用技术是通过其所支持的应用程序原型检查数据库。换句话说，针对每一种最终表达数据的原型应用，保证你检查了数据模型并且查看如何取出数据。</p>
<p><br>&nbsp;</p>
<img src ="http://www.cnitblog.com/sunnywang/aggbug/37705.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sunnywang/" target="_blank">sunnywang   </a> 2007-12-14 17:09 <a href="http://www.cnitblog.com/sunnywang/archive/2007/12/14/37705.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>My  collection   ----- about my interesting field(may be you can call it DW dictionary)</title><link>http://www.cnitblog.com/sunnywang/archive/2007/12/11/37575.html</link><dc:creator>sunnywang   </dc:creator><author>sunnywang   </author><pubDate>Tue, 11 Dec 2007 06:21:00 GMT</pubDate><guid>http://www.cnitblog.com/sunnywang/archive/2007/12/11/37575.html</guid><wfw:comment>http://www.cnitblog.com/sunnywang/comments/37575.html</wfw:comment><comments>http://www.cnitblog.com/sunnywang/archive/2007/12/11/37575.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/sunnywang/comments/commentRss/37575.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/sunnywang/services/trackbacks/37575.html</trackback:ping><description><![CDATA[<h2>&nbsp;</h2>
<p>BI&nbsp; &nbsp; <br><br>Business Intelligence <br>商业智能，也看到有些媒体里写作商务智能 <br>综合企业所有沉淀下来的信息，用科学的分析方法，为企业领导提供科学决策信息的过程<br>。&nbsp;&nbsp;<br><br><br>BOSS <br><br>业务运营支撑系统:Business Operations Support Systems,简称BOSS <br><br><br>BPM&nbsp; &nbsp; <br><br>企业绩效管理 <br><br><br>BPR&nbsp; &nbsp;<br><br>业务流程重整（Business Process Reengineering）,指利用数据仓库技术，发现并纠正企<br>业业务流程中的弊端的一项工作。数据仓库的重要作用之一。 <br><br><br>CRM&nbsp; &nbsp; <br><br>Customer Relationship Management <br>客户关系管理。CRM是选择和管理有价值客户及其关系的一种商业策略，CRM要求以客户为<br>中心的商业哲学和企业文化来支持有效的市场营销、销售与服务流程。 <br><br><br><span style="COLOR: red">Data mart</span>&nbsp; &nbsp;<br><br>即数据集市，或者叫做&#8220;小数据仓库&#8221;。如果说数据仓库是建立在企业级的数据模型之上<br>的话。那么数据集市就是企业级数据仓库的一个子集，他主要面向部门级业务，并且只面<br>向某个特定的主题。数据集市可以在一定程度上缓解访问数据仓库的瓶颈。 <br><br><br>DM <br><br>DM （Data Mine）数据挖掘. <br>数据挖掘是一个从大型数据库中提取以前未知的，可理解的，可执行的信息并用它来进行<br>关键的商业决策的过程。 <br><br><br><span style="COLOR: red">DSS</span>&nbsp; &nbsp;<br><br>决策支持系统（Decision Support system），相当于基于数据仓库的应用。决策支持就是<br>在收集所有有关数据和信息，经过加工整理，来为企业决策管理层提供信息，为决策者的<br>决策提供依据。 <br><br><br>DW&nbsp; &nbsp;<br><br>Data warehouse <br>本世纪80年代中期，&#8220;数据仓库之父&#8221;William H.Inmon先生在其《建立数据仓库》一书中<br>定义了数据仓库的概念，随后又给出了更为精确的定义：数据仓库是在企业管理和决策中<br>面向主题的、集成的、与时间相关的、不可修改的数据集合。与其他数据库应用不同的是<br>，数据仓库更像一种过程，对分布在企业内部各处的业务数据的整合、加工和分析的过程<br>。而不是一种可以购买的产品。 <br><br><br>EAI&nbsp; &nbsp;<br><br>Enterprise Application Integration <br>企业应用整合,即通过信息技术将企业内部各种应用整合起来 <br>。 <br><br><br>EDM&nbsp; &nbsp; <br><br>Enterprise Data Model <br>企业数据模型 <br><br><br>EIP&nbsp; &nbsp; <br><br>Enterprise Information Portal <br>企业信息门户 <br>EAI(企业业务程序综合)+BPI(业务处理过程综合) <br><br><br>EIS&nbsp; &nbsp; <br><br>领导信息系统（Executive Information System）,指为了满足无法专注于计算机技术的领<br>导人员的信息查询需求，而特意制定的以简单的图形界面访问数据仓库的一种应用。 <br><br><br>EIS&nbsp; &nbsp; <br><br>企业信息系统 <br><br><br>ERP <br><br>Enterprise Resourse Planning <br>企业资源规划。它是一个以管理会计为核心的信息系统，识别和规划企业资源，从而获取<br>客户订单，完成加工和交付，最后得到客户付款。 <br>&nbsp;&nbsp;换言之，ERP将企业内部所有资源整合在一起，对采购、生产、成本、库存、分销、运输<br>、财务、人力资源进行规划，从而达到最佳资源组合，取得最佳效益。 <br><br><br><br><span style="COLOR: red">ETL</span>&nbsp; &nbsp;<br><br>数据抽取（Extract）、转换（Transform）、清洗（Cleansing）、装载（Load）的过程。<br>构建数据仓库的重要一环，用户从数据源抽取出所需的数据，经过数据清洗,最终按照预先<br>定义好的数据仓库模型，将数据加载到数据仓库中去。 <br><br><br>KDD&nbsp; &nbsp;<br><br>KDD（Knowledge Discovery in Database）数据库中知识发现。是基于数据库的知识发现<br>，指的是从大型数据库或数据仓库中提取人们感兴趣的知识，这些知识是隐含的、事先未<br>知的、潜在有用的、易被理解的模式。 <br><br><br>KPI&nbsp;&nbsp;<br>企业关键业绩指标(KPI：Key Process Indication)是通过对组织内部流程的输入端、输出<br>端的关键参数进行设置、取样、计算、分析，衡量流程绩效的一种目标式量化管理指标，<br>是把企业的战略目标分解为可操作的工作目标的工具，是企业绩效管理的基础。 <br><br><br>LDM&nbsp;&nbsp;<br>逻辑数据模型 <br><br><br><span style="COLOR: red">mdd</span>&nbsp;&nbsp;<br>多维数据库（MultiDimesional Database,MDD）可以简单地理解为：将数据存放在一个<br>n维数组中，而不是像关系数据库那样以记录的形式存放。因此它存在大量稀疏矩阵，人们<br>可以通过多维视图来观察数据。多维数据库增加了一个时间维，与关系数据库相比，它的<br>优势在于可以提高数据处理速度，加快反应时间，提高查询效率。 <br><br><br>Metadata <br><br>Metadata(元数据)，它是&#8220;关于数据的数据&#8221;在地理空间信息中用于描述地理数据集的内<br>容、质量、表示方式、空间参考、管理方式以及数据集的其他特征，它是实 现地理空间信<br>息共享的核心标准之一。目前，国际上对空间元数据标准内容进行研究的组织 主要有三个<br>，分别是欧洲标准化委员会(CEN/TC 287)、美国联邦地理数据委员会(FGDC)和国 际标准化<br>组织地理信息/地球信息技术委员会(ISO/TC 211)。 <br><br><br>MOLAP&nbsp; &nbsp;<br><br>严格遵照Codd的定义，自行建立了多维数据库，来存放联机分析系统数据的Arbor Softwa<br>re,开创了多维数据存储的先河，后来的很多家公司纷纷采用<span style="COLOR: red">多维数据存储</span>。被人们称为M<br>uiltDimension OLAP,简称MOLAP，代表产品有Hyperion(原Arbor software) Essbase、Sh<br>owcase STRATEGY等。 <br><br><br><span style="COLOR: red">ODS</span> <br><br>(oprational Data Store)操作型数据存储，对于一些准实时的业务数据库当中的数据的暂<br>时存储，支持一些同时关连到历史数据与实时数据分析的数据暂时存储区域 <br><br><br><span style="COLOR: red">OLAP&nbsp; &nbsp;<br></span><br>OLAP(online analytical processing)概念最早是由关系数据库之父E.F.Codd于1993年提<br>出的。当时,Codd认为联机事务处理(OLTP)已不能满足终端用户对数据库查询分析的需要,<br>SQL对大数据库进行的简单查询也不能满足用户分析的需求。用户的决策分析需要对关系数<br>据库进行大量计算才能得到结果,而查询的结果并不能满足决策者提出的需求。因此Codd提<br>出了多维数据库和多维分析的概念,即OLAP。Codd提出OLAP的12条准则来描述OLAP系统： <br><br><br>准则1 OLAP模型必须提供多维概念视图 <br>准则2 透明性准则 <br>准则3 存取能力推测 <br>准则4 稳定的报表能力 <br>准则5 客户/服务器体系结构 <br>准则6 维的等同性准则 <br>准则7 动态的稀疏矩阵处理准则 <br>准则8 多用户支持能力准则 <br>准则9 非受限的跨维操作 <br>准则10 直观的数据操纵 <br>准则11 灵活的报表生成 <br>准则12 不受限的维与聚集层次 <br><br><br><br>PDM <br><br>物理数据模型 <br><br><br>ROLAP&nbsp;&nbsp;<br><br>基于Codd的12条准则，各个软件开发厂家见仁见智，其中一个流派，认为可以沿用关系型<br>数据库来存储多维数据，于是，基于稀疏矩阵表示方法的星型结构（starschema）就出现<br>了。后来又演化出雪花结构。为了与多维数据库相区别，则把基于关系型数据库的OLAP称<br>为Relational OLAP，简称ROLAP。代表产品有Informix Metacube、Microsoft SQL Serve<br>r。&nbsp;&nbsp;<br><br><br>SCM&nbsp;&nbsp;<br>Supply Chain Management <br>供应链管理。SCM就是对企业供应链的管理，是对供应、需求、原材料采购、市场、生产、<br>库存、定单、分销发货等的管理，包括了从生产到发货、从供应商的供应商到顾客的顾客<br>的每一个环节。 <br><br><br><br>Spiral Development&nbsp;&nbsp;<br>螺旋式开发 <br><br><br>Waterfall Development&nbsp;&nbsp;<br>瀑布式开发<br><br><br>前端工具：主要包括各种报表工具、查询工具、数据分析工具、数据挖掘工具以及各种基于数据仓库或数据集市<br>的应用开发工具。其中数据分析工具主要针对OLAP服务器，报表工具， 数据挖掘工具主要针对数据仓库。</p>
<p><br>比较流行的BI平台：IBM&nbsp;&nbsp; DB2II(Inforamtion Integrator,信息集成器)<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 微软的BI平台<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BO(Business Object)<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; Brio<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>目前提供的DM产品的厂商非常多：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SAS Enterprise Miner<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NCR Teradata Warehouse Miner<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SPSS Clementine 7.0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IBM&nbsp; DB2 Intelligent Mine<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQL Server 2000数据挖掘组件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Oracle9i Data Mining<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CA CleverPath Predictive Analysis Server<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 德门软件DMiner等。<br><br><br><br>NGBOSS是对业务支撑系统的重构，有3个特点：</p>
<p>（1 ）从流程和业务能力着手，整合营销流程和服务流程，构建CRM 体系；</p>
<p>（2）对智能业务和传统业务、话音和数据业务的支撑进行统一的规划，实现3G业务运营能力的飞跃；</p>
<p>（3）重新规划和设计BOSS 系统的体系架构，进一步提升业务支撑网的先进性、易用性、可扩展性和标准化程度。</p>
<p>&nbsp;</p>
<p>CRM 体系：<br>什么叫CRM？CRM最原始的定义是销售自动化，是怎么把销售人员的销售过程通过一个软件管理起来，<br>这是CRM原始的定义。随着发展，CRM的面逐渐扩大了。现在提CRM是从一个广义角度来说，讲的是以客户为核心的管理系统。<br>是怎样保证信息系统以客户为核心，这部分叫CRM。 </p>
<p>网友问电信级的CRM市场，可能是针对一些广义的CRM的概念，就是以客户为核心的CRM系统。它的范围大一些，包括销售的管理，服务的过程，整个营销过程都会在这个范围之内。我感觉电信级CRM市场应该是有一个广阔的发展空间。为什么呢？到今年年底，按照WTO的规定整个电信市场是要开放的，这样电信必须把信息化系统整合成以客户为核心的理念才能迎接未来的挑战。2006年对电信运营商来说，如何建立一个CRM体系是很关键的，我相信今年或者明年会有一个长足的发</p>
<p>&nbsp;</p>
<p>sap&nbsp; 是一家公司， <a href="http://www.sap.com/">www.sap.com</a><br>&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.tcp.org/">www.tcp.org</a>----看什么那些数据仓库厂家的数据仓库是最好的， 提供了一些性能的比较<br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp; 几家做的比较好的CRM系统： 1.&nbsp; sap&nbsp; 的crm<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.&nbsp;&nbsp; peoplesoft CRM , 仁科， ORACLE收购的一个公司<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3. siebel 的CEM</p>
<br><br>EIG(Electronics Information Group)&nbsp; 电子信息组织<br>OMG(Object&nbsp; Management Group ) 对象管理组织<br>MDC (Meta Data Coalition) 元数据联盟<br>CIF 公共信息工厂<br>ODS联机数据存储<br><br>CWM(&nbsp;&nbsp; common warehouse metadatadel): an introduction to the standard for data warehouse integration&nbsp; 公共仓库元模型 ：数据仓&nbsp;&nbsp;&nbsp; 库&nbsp;集成标准导论 
<img src ="http://www.cnitblog.com/sunnywang/aggbug/37575.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sunnywang/" target="_blank">sunnywang   </a> 2007-12-11 14:21 <a href="http://www.cnitblog.com/sunnywang/archive/2007/12/11/37575.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>业务建模和数据建模</title><link>http://www.cnitblog.com/sunnywang/archive/2007/12/11/37571.html</link><dc:creator>sunnywang   </dc:creator><author>sunnywang   </author><pubDate>Tue, 11 Dec 2007 05:05:00 GMT</pubDate><guid>http://www.cnitblog.com/sunnywang/archive/2007/12/11/37571.html</guid><wfw:comment>http://www.cnitblog.com/sunnywang/comments/37571.html</wfw:comment><comments>http://www.cnitblog.com/sunnywang/archive/2007/12/11/37571.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/sunnywang/comments/commentRss/37571.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/sunnywang/services/trackbacks/37571.html</trackback:ping><description><![CDATA[<p><font face=Arial>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 大家在讨论业务建模和数据建模，我也一直做这个方向，很感兴趣。我把业务建模和数据建模的关系理一下，这样争论也有个基础。当然其中肯定也有不当之处，请多多指点。</font></p>
<p><font face=Arial>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 先说业务建模，业务建模一般分两类。</font><font face=Arial>第一类是为了解决某个业务问题而建立一个业务模型或者数据模型。第二类是将企业的业务状况、业务流程及用户对业务的分析视角等信息用计算机的语言表示出来。这两类建模从方法到目的都是不同的。</font></p>
<p><font face=Arial>&nbsp;&nbsp;&nbsp;&nbsp; 第一类，举例来说，对客户信用状况的评价，这需要从业务的角度来考虑反映客户信用状况的因素各占多少比重等等内容，这些是业务人员需要完成的工作，有大量的领域知识在里面。这部分建模的结果有些会反映到信息系统中，有些就只是咨询，反映到用户的日常工作中。</font></p>
<p><font face=Arial>&nbsp;&nbsp;&nbsp;&nbsp; 第二类，是对企业业务状况的描述，如贷款和抵押品之间是什么关系，与抵押品相关的信息都有那些、产品内部的层级关系，用户分析问题的业务视角等等，这些内容需要业务人员和信息人员共同参与完成，最终体现在信息系统之中也就是开发人员使用的数据表。</font></p>
<p><font face=Arial>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对于KPI的建模是属于第一类业务建模，它的重点在于哪些因素会影响KPI，影响的比重有多大。但是计算KPI需要的因素以及对这些因素的数据需求都属于第二类业务建模。</font></p>
<p><font face=Arial>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 再说数据建模，数据建模也分为两个步骤，第一类是逻辑模型，第二类是物理模型。这两类模型的差别并不是很大。</font></p>
<p><font face=Arial>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第一类，逻辑模型，也称为实体关系模型（维度建模可以认为是实体关系建模中的一种），是用计算机术语表示出来的业务状况以及业务分析视角。事实上，逻辑模型就是前面提到的第二类业务模型。我们是做信息系统的，所作的东西最终都是要体现在计算机里，所以，第二类业务模型和数据模型之间的距离并不大。</font></p>
<p><font face=Arial>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第二类，物理模型，是将逻辑模型转化成的物理表，这里会出于性能、效率和易用性等考虑对逻辑模型做一些处理。这些处理在逻辑模型中也存在。将逻辑模型转化为物理模型需要DBA的参与。</font></p>
<p><font face=Arial>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 而我们在日常工作中提到的业务建模一般是指第一类业务建模，即从业务的角度来设计KPI等内容。我们在日常工作中提到的数据建模一般是指第二类业务建模，也是第一类数据建模。这两类原本就是同一份工作。也许有很牛的公司会将这两部分分开，请完全不懂技术的业务专家来设计这部分。但大部分情况下这部分是需要业务和技术都懂的人来完成。我理解innovate511提到的数据建模应该是这类和业务也直接相关的建模，而不是纯数据的建模。（请innovate511确认。）</font></p>
<p><font face=Arial>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们再看DW和BI，一般DW里不会有第一类业务模型，但是一定会有第一类业务模型需要的数据，也可能有第一类业务模型分析的结果。而BI里可能有第一类业务模型，也可能没有第一类业务模型，例如对数据进行OLAP分析就不一定有第一类业务模型。但是勿庸置疑的是，无论是DW还是BI，它的目的都是为业务服务的。所以说业务驱动BI、DW或者说需求驱动BI、DW都是一定的。但是归根到底，DW和BI都是用来辅助分析的，真正提高企业效益的是使用DW和BI的分析人员。从非技术层面来促进BI成功我的感觉更像是借助BI来提出的管理咨询，而不是信息技术咨询。</font></p>
<img src ="http://www.cnitblog.com/sunnywang/aggbug/37571.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sunnywang/" target="_blank">sunnywang   </a> 2007-12-11 13:05 <a href="http://www.cnitblog.com/sunnywang/archive/2007/12/11/37571.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>lex &amp; yacc 讲义</title><link>http://www.cnitblog.com/sunnywang/archive/2007/12/10/37558.html</link><dc:creator>sunnywang   </dc:creator><author>sunnywang   </author><pubDate>Mon, 10 Dec 2007 13:50:00 GMT</pubDate><guid>http://www.cnitblog.com/sunnywang/archive/2007/12/10/37558.html</guid><wfw:comment>http://www.cnitblog.com/sunnywang/comments/37558.html</wfw:comment><comments>http://www.cnitblog.com/sunnywang/archive/2007/12/10/37558.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/sunnywang/comments/commentRss/37558.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/sunnywang/services/trackbacks/37558.html</trackback:ping><description><![CDATA[<br>&nbsp;&nbsp;&nbsp;&nbsp; Lex&nbsp;和&nbsp;Yacc&nbsp;是&nbsp;UNIX&nbsp;的两种非常重要的、功能强大的工具。事实上，如果你熟练掌握&nbsp;Lex&nbsp;和&nbsp;Yacc&nbsp;的话，它们的强大功能使创建&nbsp;FORTRAN&nbsp;和&nbsp;C&nbsp;的编译器如同儿戏。&nbsp;Ashish&nbsp;Bansal&nbsp;为您详细的讨论了编写自己的语言和编译器所用到的这两种工具，包括常规表达式、声明、匹配模式、变量、Yacc&nbsp;语法和解析器代码。最后，他解释了怎样将&nbsp;Lex&nbsp;和&nbsp;Yacc&nbsp;结合起来。<br><br><br><br>Lex&nbsp;代表&nbsp;Lexical&nbsp;Analyzar。Yacc&nbsp;代表&nbsp;Yet&nbsp;Another&nbsp;Compiler&nbsp;Compiler。&nbsp;让我们从&nbsp;Lex&nbsp;开始吧。<br><br>Lex<br>Lex&nbsp;是一种生成扫描器的工具。扫描器是一种识别文本中的词汇模式的程序。这些词汇模式（或者常规表达式）在一种特殊的句子结构中定义，这个我们一会儿就要讨论。<br><br>一种匹配的常规表达式可能会包含相关的动作。这一动作可能还包括返回一个标记。当&nbsp;Lex&nbsp;接收到文件或文本形式的输入时，它试图将文本与常规表达式进行匹配。它一次读入一个输入字符，直到找到一个匹配的模式。如果能够找到一个匹配的模式，Lex&nbsp;就执行相关的动作（可能包括返回一个标记）。另一方面，如果没有可以匹配的常规表达式，将会停<br>止进一步的处理，Lex&nbsp;将显示一个错误消息。<br><br>Lex&nbsp;和&nbsp;C&nbsp;是强耦合的。一个&nbsp;.lex&nbsp;文件（Lex&nbsp;文件具有&nbsp;.lex&nbsp;的扩展名）通过&nbsp;lex&nbsp;公用程序来传递，并生成&nbsp;C&nbsp;的输出文件。这些文件被编译为词法分析器的可执行版本。<br><br>Lex&nbsp;的常规表达式<br>常规表达式是一种使用元语言的模式描述。表达式由符号组成。符号一般是字符和数字，但是&nbsp;Lex&nbsp;中还有一些具有特殊含义的其他标记。&nbsp;下面两个表格定义了&nbsp;Lex&nbsp;中使用的一些标记并给出了几个典型的例子。<br><br>用&nbsp;Lex&nbsp;定义常规表达式<br><br><br>字符&nbsp;含义&nbsp;<br>A-Z,&nbsp;0-9,&nbsp;a-z<br>&nbsp;构成了部分模式的字符和数字。&nbsp;<br>.<br>&nbsp;匹配任意字符，除了&nbsp;\n。&nbsp;<br>-<br>&nbsp;用来指定范围。例如：A-Z&nbsp;指从&nbsp;A&nbsp;到&nbsp;Z&nbsp;之间的所有字符。&nbsp;<br>[&nbsp;]<br>&nbsp;一个字符集合。匹配括号内的任意&nbsp;字符。如果第一个字符是&nbsp;^&nbsp;那么它表示否定模式。例<br>如:&nbsp;[abC]&nbsp;匹配&nbsp;a,&nbsp;b,&nbsp;和&nbsp;C中的任何一个。&nbsp;<br>*<br>&nbsp;匹配0个或者多个上述的模式。&nbsp;<br>+<br>&nbsp;匹配1个或者多个上述模式。&nbsp;<br>?<br>&nbsp;匹配0个或1个上述模式。&nbsp;<br>$<br>&nbsp;作为模式的最后一个字符匹配一行的结尾。&nbsp;<br>{&nbsp;}<br>&nbsp;指出一个模式可能出现的次数。&nbsp;例如:&nbsp;A{1,3}&nbsp;表示&nbsp;A&nbsp;可能出现1次或3次。&nbsp;<br>\<br>&nbsp;用来转义元字符。同样用来覆盖字符在此表中定义的特殊意义，只取字符的本意。&nbsp;<br>^<br>&nbsp;否定。&nbsp;<br>|<br>&nbsp;表达式间的逻辑或。&nbsp;<br>"&lt;一些符号&gt;"<br>&nbsp;字符的字面含义。元字符具有。&nbsp;<br>/<br>&nbsp;向前匹配。如果在匹配的模版中的&#8220;/&#8221;后跟有后续表达式，只匹配模版中&#8220;/&#8221;前面的部<br>分。如：如果输入&nbsp;A01，那么在模版&nbsp;A0/1&nbsp;中的&nbsp;A0&nbsp;是匹配的。&nbsp;<br>(&nbsp;)<br>&nbsp;将一系列常规表达式分组。&nbsp;<br><br><br><br>常规表达式举例<br><br><br>常规表达式&nbsp;含义&nbsp;<br>joke[rs]<br>&nbsp;匹配&nbsp;jokes&nbsp;或&nbsp;joker。&nbsp;<br>A{1,2}shis+<br>&nbsp;匹配&nbsp;AAshis,&nbsp;Ashis,&nbsp;AAshi,&nbsp;Ashi。&nbsp;<br>(A[b-e])+<br>&nbsp;匹配在&nbsp;A&nbsp;出现位置后跟随的从&nbsp;b&nbsp;到&nbsp;e&nbsp;的所有字符中的&nbsp;0&nbsp;个或&nbsp;1个。&nbsp;<br><br>Lex&nbsp;中的标记声明类似&nbsp;C&nbsp;中的变量名。每个标记都有一个相关的表达式。（下表中给出了标记和表达式的例子。）使用这个表中的例子，我们就可以编一个字数统计的程序了。我们的第一个任务就是说明如何声明标记。<br><br>标记声明举例<br><br><br>标记&nbsp;相关表达式&nbsp;含义&nbsp;<br>数字(number)&nbsp;([0-9])+&nbsp;1个或多个数字&nbsp;<br>字符(chars)&nbsp;[A-Za-z]&nbsp;任意字符&nbsp;<br>空格(blank)&nbsp;"&nbsp;"&nbsp;一个空格&nbsp;<br>字(word)&nbsp;(chars)+&nbsp;1个或多个&nbsp;chars&nbsp;<br>变量(variable)&nbsp;(字符)+(数字)*(字符)*(数字)*&nbsp;&nbsp;<br><br>Lex&nbsp;编程<br>Lex&nbsp;编程可以分为三步：<br><br>以&nbsp;Lex&nbsp;可以理解的格式指定模式相关的动作。&nbsp;<br>在这一文件上运行&nbsp;Lex，生成扫描器的&nbsp;C&nbsp;代码。&nbsp;<br>编译和链接&nbsp;C&nbsp;代码，生成可执行的扫描器。&nbsp;<br>注意:&nbsp;如果扫描器是用&nbsp;Yacc&nbsp;开发的解析器的一部分，只需要进行第一步和第二步。关于<br>这一特殊问题的帮助请阅读&nbsp;Yacc&nbsp;和&nbsp;将&nbsp;Lex&nbsp;和&nbsp;Yacc&nbsp;结合起来部分。<br><br>现在让我们来看一看&nbsp;Lex&nbsp;可以理解的程序格式。一个&nbsp;Lex&nbsp;程序分为三个段：第一段是&nbsp;C和&nbsp;Lex&nbsp;的全局声明，第二段包括模式（C&nbsp;代码），第三段是补充的&nbsp;C&nbsp;函数。&nbsp;例如,&nbsp;第三段中一般都有&nbsp;main()&nbsp;函数。这些段以%%来分界。&nbsp;那么，回到字数统计的&nbsp;Lex&nbsp;程序，让我们看一下程序不同段的构成。<br><br>C&nbsp;和&nbsp;Lex&nbsp;的全局声明<br>这一段中我们可以增加&nbsp;C&nbsp;变量声明。这里我们将为字数统计程序声明一个整型变量，来保存程序统计出来的字数。我们还将进行&nbsp;Lex&nbsp;的标记声明。<br><br>字数统计程序的声明<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;wordCount&nbsp;=&nbsp;0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chars&nbsp;[A-za-z\抃'\.\"]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;numbers&nbsp;([0-9])+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delim&nbsp;["&nbsp;"\n\t]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;whitespace&nbsp;{delim}+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;words&nbsp;{chars}+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%%<br><br><br>&nbsp;<br><br>两个百分号标记指出了&nbsp;Lex&nbsp;程序中这一段的结束和三段中第二段的开始。<br><br>Lex&nbsp;的模式匹配规则<br>让我们看一下&nbsp;Lex&nbsp;描述我们所要匹配的标记的规则。（我们将使用&nbsp;C&nbsp;来定义标记匹配后的动作。）继续看我们的字数统计程序，下面是标记匹配的规则。<br><br>字数统计程序中的&nbsp;Lex&nbsp;规则<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{words}&nbsp;{&nbsp;wordCount++;&nbsp;/*<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;increase&nbsp;the&nbsp;word&nbsp;count&nbsp;by&nbsp;one*/&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{whitespace}&nbsp;{&nbsp;/*&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nothing*/&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{numbers}&nbsp;{&nbsp;/*&nbsp;one&nbsp;may<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;want&nbsp;to&nbsp;add&nbsp;some&nbsp;processing&nbsp;here*/&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%%<br><br>&nbsp;<br><br><br><br>C&nbsp;代码<br>Lex&nbsp;编程的第三段，也就是最后一段覆盖了&nbsp;C&nbsp;的函数声明（有时是主函数）。注意这一段必须包括&nbsp;yywrap()&nbsp;函数。&nbsp;Lex&nbsp;有一套可供使用的函数和变量。&nbsp;其中之一就是&nbsp;yywrap。一般来说，yywrap()&nbsp;的定义如下例。我们将在&nbsp;高级&nbsp;Lex&nbsp;中探讨这一问题。<br><br>字数统计程序的&nbsp;C&nbsp;代码段<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;main()<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yylex();&nbsp;/*&nbsp;start&nbsp;the<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;analysis*/<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("&nbsp;No&nbsp;of&nbsp;words:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%d\n",&nbsp;wordCount);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;yywrap()<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;1;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;<br><br><br><br>上一节我们讨论了&nbsp;Lex&nbsp;编程的基本元素，它将帮助你编写简单的词法分析程序。&nbsp;在高级&nbsp;Lex&nbsp;这一节中我们将讨论&nbsp;Lex&nbsp;提供的函数，这样你就能编写更加复杂的程序了。<br><br>将它们全部结合起来<br>.lex&nbsp;文件是&nbsp;Lex&nbsp;的扫描器。它在&nbsp;Lex&nbsp;程序中如下表示：<br><br>&nbsp;&nbsp;&nbsp;$&nbsp;lex&nbsp;&lt;file&nbsp;name.lex&gt;<br><br>&nbsp;<br><br>这生成了&nbsp;lex.yy.c&nbsp;文件，它可以用&nbsp;C&nbsp;编译器来进行编译。它还可以用解析器来生成可执行程序，或者在链接步骤中通过选项杔l&nbsp;包含&nbsp;Lex&nbsp;库。<br><br>这里是一些&nbsp;Lex&nbsp;的标志：<br><br><br>-c&nbsp;表示&nbsp;C&nbsp;动作，它是缺省的。&nbsp;<br>-t&nbsp;写入&nbsp;lex.yy.c&nbsp;程序来代替标准输出。&nbsp;<br>-v&nbsp;提供一个两行的统计汇总。&nbsp;<br>-n&nbsp;不打印&nbsp;-v&nbsp;的汇总。&nbsp;<br>高级&nbsp;Lex<br>Lex&nbsp;有几个函数和变量提供了不同的信息，可以用来编译实现复杂函数的程序。下表中列出了一些变量和函数，以及它们的使用。&nbsp;详尽的列表请参考&nbsp;Lex&nbsp;或&nbsp;Flex&nbsp;手册（见后文的&nbsp;资源&nbsp;）。<br><br>Lex&nbsp;变量<br><br><br>yyin&nbsp;FILE*&nbsp;类型。&nbsp;它指向&nbsp;lexer&nbsp;正在解析的当前文件。&nbsp;<br>yyout&nbsp;FILE*&nbsp;类型。&nbsp;它指向记录&nbsp;lexer&nbsp;输出的位置。&nbsp;缺省情况下，yyin&nbsp;和&nbsp;yyout&nbsp;都指向标准输入和输出。&nbsp;<br>yytext&nbsp;匹配模式的文本存储在这一变量中（char*）。&nbsp;<br>yyleng&nbsp;给出匹配模式的长度。&nbsp;<br>yylineno&nbsp;提供当前的行数信息。（lexer不一定支持。）&nbsp;<br><br>Lex&nbsp;函数<br><br><br>yylex()&nbsp;这一函数开始分析。&nbsp;它由&nbsp;Lex&nbsp;自动生成。&nbsp;<br>yywrap()&nbsp;这一函数在文件（或输入）的末尾调用。如果函数的返回值是1，就停止解析。<br>&nbsp;因此它可以用来解析多个文件。代码可以写在第三段，这就能够解析多个文件。&nbsp;方法是使用&nbsp;yyin&nbsp;文件指针（见上表）指向不同的文件，直到所有的文件都被解析。最后，yywrap()&nbsp;可以返回&nbsp;1&nbsp;来表示解析的结束。&nbsp;<br>yyless(int&nbsp;n)&nbsp;这一函数可以用来送回除了前憂?&nbsp;个字符外的所有读出标记。&nbsp;<br>yymore()&nbsp;这一函数告诉&nbsp;Lexer&nbsp;将下一个标记附加到当前标记后。&nbsp;<br><br>对&nbsp;Lex&nbsp;的讨论就到这里。下面我们来讨论&nbsp;Yacc...<br><br>Yacc<br>Yacc&nbsp;代表&nbsp;Yet&nbsp;Another&nbsp;Compiler&nbsp;Compiler。&nbsp;Yacc&nbsp;的&nbsp;GNU&nbsp;版叫做&nbsp;Bison。它是一种工具，将任何一种编程语言的所有语法翻译成针对此种语言的&nbsp;Yacc&nbsp;语&nbsp;法解析器。它用巴科斯范式(BNF,&nbsp;Backus&nbsp;Naur&nbsp;Form)来书写。按照惯例，Yacc&nbsp;文件有&nbsp;.y&nbsp;后缀。编译行如下<br>调用&nbsp;Yacc&nbsp;编译器：<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$&nbsp;yacc&nbsp;&lt;options&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;filename&nbsp;ending&nbsp;with&nbsp;.y&gt;<br><br>&nbsp;<br><br>在进一步阐述以前，让我们复习一下什么是语法。在上一节中，我们看到&nbsp;Lex&nbsp;从输入序列中识别标记。如果你在查看标记序列，你可能想在这一序列出现时执行某一动作。这种情况下有效序列的规范称为语法。Yacc&nbsp;语法文件包括这一语法规范。它还包含了序列匹配时你想要做的事。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了更加说清这一概念，让我们以英语为例。&nbsp;这一套标记可能是：名词,&nbsp;动词,&nbsp;形容词等等。为了使用这些标记造一个语法正确的句子，你的结构必须符合一定的规则。一个简单的句子可能是名词+动词或者名词+动词+名词。(如&nbsp;I&nbsp;care.&nbsp;See&nbsp;spot&nbsp;run.)<br><br>所以在我们这里，标记本身来自语言（Lex），并且标记序列允许用&nbsp;Yacc&nbsp;来指定这些标记标记序列也叫语法)。<br><br>终端和非终端符号<br><br>终端符号:&nbsp;代表一类在语法结构上等效的标记。终端符号有三种类型：<br><br>命名标记:&nbsp;这些由&nbsp;%token&nbsp;标识符来定义。按照惯例，它们都是大写。<br><br>字符标记:&nbsp;字符常量的写法与&nbsp;C&nbsp;相同。例如,&nbsp;??&nbsp;就是一个字符标记。<br><br>字符串标记&nbsp;:&nbsp;写法与&nbsp;C&nbsp;的字符串常量相同。例如，"&lt;&lt;"&nbsp;就是一个字符串标记。<br><br>lexer&nbsp;返回命名标记。<br><br>非终端符号:&nbsp;是一组非终端符号和终端符号组成的符号。按照惯例，它们都是小写。&nbsp;在例子中，file&nbsp;是一个非终端标记而&nbsp;NAME&nbsp;是一个终端标记。<br>&nbsp;<br><br><br><br>用&nbsp;Yacc&nbsp;来创建一个编译器包括四个步骤：<br><br>通过在语法文件上运行&nbsp;Yacc&nbsp;生成一个解析器。&nbsp;<br>说明语法：&nbsp;<br><br>编写一个&nbsp;.y&nbsp;的语法文件（同时说明&nbsp;C&nbsp;在这里要进行的动作）。&nbsp;<br>编写一个词法分析器来处理输入并将标记传递给解析器。&nbsp;这可以使用&nbsp;Lex&nbsp;来完成。&nbsp;<br>编写一个函数，通过调用&nbsp;yyparse()&nbsp;来开始解析。&nbsp;<br>编写错误处理例程（如&nbsp;yyerror()）。&nbsp;<br>编译&nbsp;Yacc&nbsp;生成的代码以及其他相关的源文件。&nbsp;<br>将目标文件链接到适当的可执行解析器库。&nbsp;<br>用&nbsp;Yacc&nbsp;编写语法<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如同&nbsp;Lex&nbsp;一样,&nbsp;一个&nbsp;Yacc&nbsp;程序也用双百分号分为三段。它们是：声明、语法规则和&nbsp;C&nbsp;代码。&nbsp;我们将解析一个格式为&nbsp;姓名&nbsp;=&nbsp;年龄的文件作为例子，来说明语法规则。我们假设文件有多个姓名和年龄，它们以空格分隔。&nbsp;在看&nbsp;Yacc&nbsp;程序的每一段时，我们将为我们的例子编写一个语法文件。<br><br>C&nbsp;与&nbsp;Yacc&nbsp;的声明<br>&nbsp;&nbsp;&nbsp;&nbsp; C&nbsp;声明可能会定义动作中使用的类型和变量，以及宏。还可以包含头文件。每个&nbsp;Yacc&nbsp;声明段声明了终端符号和非终端符号（标记）的名称，还可能描述操作符优先级和针对不同符号的数据类型。&nbsp;lexer&nbsp;(Lex)&nbsp;一般返回这些标记。所有这些标记都必须在&nbsp;Yacc&nbsp;声明中进行说明。<br><br>&nbsp;&nbsp;&nbsp;&nbsp; 在文件解析的例子中我们感兴趣的是这些标记：name,&nbsp;equal&nbsp;sign,&nbsp;和&nbsp;age。Name&nbsp;是一个完全由字符组成的值。&nbsp;Age&nbsp;是数字。于是声明段就会像这样：<br><br>文件解析例子的声明<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#typedef&nbsp;char*&nbsp;string;&nbsp;/*<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to&nbsp;specify&nbsp;token&nbsp;types&nbsp;as&nbsp;char*&nbsp;*/<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#define&nbsp;YYSTYPE&nbsp;string&nbsp;/*<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;Yacc&nbsp;variable&nbsp;which&nbsp;has&nbsp;the&nbsp;value&nbsp;of&nbsp;returned&nbsp;token&nbsp;*/<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%token&nbsp;NAME&nbsp;EQ&nbsp;AGE<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%%<br><br>你可能会觉得&nbsp;YYSTYPE&nbsp;有点奇怪。但是类似&nbsp;Lex,&nbsp;Yacc&nbsp;也有一套变量和函数可供用户来进行功能扩展。&nbsp;YYSTYPE&nbsp;定义了用来将值从&nbsp;lexer&nbsp;拷贝到解析器或者&nbsp;Yacc&nbsp;的&nbsp;yylval&nbsp;（另一个&nbsp;Yacc&nbsp;变量）的类型。默认的类型是&nbsp;int。&nbsp;由于字符串可以从&nbsp;lexer&nbsp;拷贝，类型被重定义为&nbsp;char*。&nbsp;关于&nbsp;Yacc&nbsp;变量的详细讨论，请参考&nbsp;Yacc&nbsp;手册（见&nbsp;资源）。<br><br><br>Yacc&nbsp;语法规则<br>Yacc&nbsp;语法规则具有以下一般格式：<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result:&nbsp;components&nbsp;{&nbsp;/*<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;action&nbsp;to&nbsp;be&nbsp;taken&nbsp;in&nbsp;C&nbsp;*/&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;<br><br>&nbsp;<br><br>在这个例子中，result&nbsp;是规则描述的非终端符号。Components&nbsp;是根据规则放在一起的不同的终端和非终端符号。&nbsp;如果匹配特定序列的话&nbsp;Components&nbsp;后面可以跟随要执行的动作。&nbsp;考虑如下的例子：<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;param&nbsp;:&nbsp;NAME&nbsp;EQ&nbsp;NAME&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("\tName:%s\tValue(name):%s\n",&nbsp;$1,$3);}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;NAME&nbsp;EQ&nbsp;VALUE{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("\tName:%s\tValue(value):%s\n",$1,$3);}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;<br><br>&nbsp;<br><br>如果上例中序列&nbsp;NAME&nbsp;EQ&nbsp;NAME&nbsp;被匹配，将执行相应的&nbsp;{&nbsp;}&nbsp;括号中的动作。&nbsp;这里另一个有用的就是&nbsp;$1&nbsp;和&nbsp;$3&nbsp;的使用,&nbsp;它们引用了标记&nbsp;NAME&nbsp;和&nbsp;NAME（或者第二行的&nbsp;VALUE）的值。&nbsp;lexer&nbsp;通过&nbsp;Yacc&nbsp;的变量&nbsp;yylval&nbsp;返回这些值记&nbsp;NAME&nbsp;的&nbsp;Lex&nbsp;代码是这样的：<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;[A-Za-z]<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name&nbsp;{char}+<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%%<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{name}&nbsp;{&nbsp;yylval&nbsp;=&nbsp;strdup(yytext);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;NAME;&nbsp;}<br><br>&nbsp;<br><br>文件解析例子的规则段是这样的：<br><br>文件解析的语法<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file&nbsp;:&nbsp;record&nbsp;file<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;record<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;record:&nbsp;NAME&nbsp;EQ&nbsp;AGE&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%s&nbsp;is&nbsp;now&nbsp;%s&nbsp;years&nbsp;old!!!",&nbsp;$1,&nbsp;$3);}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%%<br><br>&nbsp;<br><br><br><br>附加&nbsp;C&nbsp;代码<br>现在让我们看一下语法文件的最后一段，附加&nbsp;C&nbsp;代码。（这一段是可选的，如果有人想要略过它的话：）一个函数如&nbsp;main()&nbsp;调用&nbsp;yyparse()&nbsp;函数（Yacc&nbsp;中&nbsp;Lex&nbsp;的&nbsp;yylex()&nbsp;等效函数）。&nbsp;一般来说，Yacc&nbsp;最好提供&nbsp;yyerror(char&nbsp;msg)&nbsp;函数的代码。&nbsp;当解析器遇到错误时调用&nbsp;yyerror(char&nbsp;msg)。错误消息作为参数来传递。&nbsp;一个简单的&nbsp;yyerror(&nbsp;char*&nbsp;)&nbsp;可能是这样的：<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;yyerror(char*&nbsp;msg)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("Error:&nbsp;%s<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;encountered&nbsp;at&nbsp;line&nbsp;number:%d\n",&nbsp;msg,&nbsp;yylineno);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;<br><br>yylineno&nbsp;提供了行数信息。<br><br>这一段还包括文件解析例子的主函数：<br><br>附加&nbsp;C&nbsp;代码<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;main()<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yyparse();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;yyerror(char*&nbsp;msg)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("Error:&nbsp;%s<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;encountered&nbsp;\n",&nbsp;msg);<br><br>&nbsp;<br><br>要生成代码，可能用到以下命令：<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$&nbsp;yacc&nbsp;杁&nbsp;&lt;filename.y&gt;<br><br>&nbsp;<br><br>这生成了输出文件&nbsp;y.tab.h&nbsp;和&nbsp;y.tab.c，它们可以用&nbsp;UNIX&nbsp;上的任何标准&nbsp;C&nbsp;编译器来编译（如&nbsp;gcc）。<br><br>命令行的其他常用选项<br><br>'-d'&nbsp;,'--defines'&nbsp;:&nbsp;编写额外的输出文件，它们包含这些宏定义：语法中定义的标记类型名称，语义的取值类型&nbsp;YYSTYPE,&nbsp;以及一些外部变量声明。如果解析器输出文件名叫&nbsp;'name.c',&nbsp;那么&nbsp;'-d'&nbsp;文件就叫做&nbsp;'name.h'。&nbsp;如果你想将&nbsp;yylex&nbsp;定义放到独立的源文件中，你需要&nbsp;'name.h',&nbsp;因为&nbsp;yylex&nbsp;必须能够引用标记类型代码和&nbsp;yylval&nbsp;变量。&nbsp;'-b&nbsp;file-prefix'&nbsp;,'--file-prefix=prefix'&nbsp;:&nbsp;指定一个所有Yacc输出文件名都可以使用的前缀。选择一个名字，就如输入文件名叫&nbsp;'prefix.c'.&nbsp;<br>'-o&nbsp;outfile'&nbsp;,'--output-file=outfile'&nbsp;:&nbsp;指定解析器文件的输出文件名。其他输出文件根据&nbsp;'-d'&nbsp;选项描述的输出文件来命名。&nbsp;<br>Yacc&nbsp;库通常在编译步骤中自动被包括。但是它也能被显式的包括，以便在编译步骤中指定杔y&nbsp;选项。这种情况下的编译命令行是：<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$&nbsp;cc&nbsp;&lt;source&nbsp;file<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;names&gt;&nbsp;-ly<br><br>&nbsp;<br><br><br><br>将&nbsp;Lex&nbsp;与&nbsp;Yacc&nbsp;结合起来<br>到目前为止我们已经分别讨论了&nbsp;Lex&nbsp;和&nbsp;Yacc。现在让我们来看一下他们是怎样结合使用的。<br><br>一个程序通常在每次返回一个标记时都要调用&nbsp;yylex()&nbsp;函数。只有在文件结束或者出现错误标记时才会终止。<br><br>一个由&nbsp;Yacc&nbsp;生成的解析器调用&nbsp;yylex()&nbsp;函数来获得标记。yylex()&nbsp;可以由&nbsp;Lex&nbsp;来生成或完全由自己来编写。&nbsp;对于由&nbsp;Lex&nbsp;生成的&nbsp;lexer&nbsp;来说，要和&nbsp;Yacc&nbsp;结合使用，每当&nbsp;Lex&nbsp;中匹配一个模式时都必须返回一个标记。&nbsp;因此&nbsp;Lex&nbsp;中匹配模式时的动作一般格式为：<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{pattern}&nbsp;{&nbsp;/*&nbsp;do&nbsp;smthg*/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;TOKEN_NAME;&nbsp;}<br><br>&nbsp;<br><br><br><br>于是&nbsp;Yacc&nbsp;就会获得返回的标记。当&nbsp;Yacc&nbsp;编译一个带有&nbsp;杁&nbsp;标记的&nbsp;.y&nbsp;文件时，会生成一个头文件，它对每个标记都有&nbsp;#define&nbsp;的定义。&nbsp;如果&nbsp;Lex&nbsp;和&nbsp;Yacc&nbsp;一起使用的话，头文件必须在相应的&nbsp;Lex&nbsp;文件&nbsp;.lex&nbsp;中的&nbsp;C&nbsp;声明段中包括。<br><br>&nbsp;&nbsp; 让我们回到名字和年龄的文件解析例子中，看一看&nbsp;Lex&nbsp;和&nbsp;Yacc&nbsp;文件的代码。<br><br>Name.y&nbsp;-&nbsp;语法文件<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;char*&nbsp;string;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#define&nbsp;YYSTYPE&nbsp;string<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%token&nbsp;NAME&nbsp;EQ&nbsp;AGE<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%%<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file&nbsp;:&nbsp;record&nbsp;file<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;record<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;record&nbsp;:&nbsp;NAME&nbsp;EQ&nbsp;AGE&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%s&nbsp;is&nbsp;%s&nbsp;years&nbsp;old!!!\n",&nbsp;$1,&nbsp;$3);&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%%<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;main()<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yyparse();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;yyerror(char&nbsp;*msg)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("Error<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;encountered:&nbsp;%s&nbsp;\n",&nbsp;msg);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;<br><br>Name.lex&nbsp;-&nbsp;Lex&nbsp;的解析器文件<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#include&nbsp;"y.tab.h"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#include&nbsp;&lt;stdio.h&gt;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#include&nbsp;&lt;string.h&gt;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extern&nbsp;char*&nbsp;yylval;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;[A-Za-z]<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num&nbsp;[0-9]<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eq&nbsp;[=]<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name&nbsp;{char}+<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;age&nbsp;{num}+<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%%<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{name}&nbsp;{&nbsp;yylval&nbsp;=&nbsp;strdup(yytext);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;NAME;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{eq}&nbsp;{&nbsp;return&nbsp;EQ;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{age}&nbsp;{&nbsp;yylval&nbsp;=&nbsp;strdup(yytext);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;AGE;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%%<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;yywrap()<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;1;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;作为一个参考，我们列出了&nbsp;y.tab.h,&nbsp;Yacc&nbsp;生成的头文件。<br><br>y.tab.h&nbsp;-&nbsp;Yacc&nbsp;生成的头文件<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;define&nbsp;NAME&nbsp;257<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;define&nbsp;EQ&nbsp;258<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;define&nbsp;AGE&nbsp;259<br><br>
<img src ="http://www.cnitblog.com/sunnywang/aggbug/37558.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sunnywang/" target="_blank">sunnywang   </a> 2007-12-10 21:50 <a href="http://www.cnitblog.com/sunnywang/archive/2007/12/10/37558.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 数据库的建模和具体设计</title><link>http://www.cnitblog.com/sunnywang/archive/2007/12/10/37548.html</link><dc:creator>sunnywang   </dc:creator><author>sunnywang   </author><pubDate>Mon, 10 Dec 2007 07:52:00 GMT</pubDate><guid>http://www.cnitblog.com/sunnywang/archive/2007/12/10/37548.html</guid><wfw:comment>http://www.cnitblog.com/sunnywang/comments/37548.html</wfw:comment><comments>http://www.cnitblog.com/sunnywang/archive/2007/12/10/37548.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/sunnywang/comments/commentRss/37548.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/sunnywang/services/trackbacks/37548.html</trackback:ping><description><![CDATA[<span class=a14c id=zoom>&nbsp;
<p><span class=a14c id=zoom></p>
<p>&nbsp;&nbsp;&nbsp; 要开发一个基于数据库的应用系统，其中最关键的一步就是整个系统所依据的数据库的建模设计，从逻辑的到物理的，一个环节疏于设计，整个的应用系统便似建立在危房之上，随着开发过程的不断深入，它要随时面临着各种难以预料的风险，开发者要为修改或重新设计没有设计好的数据库系统而付出难以预料的代价。所以，一个良好的数据库设计是高效率的系统所必须的。
<p><strong>一、逻辑建模 </strong>
<p>数据库设计的方法因具体数据库而异，但是建模阶段的相同的，所以可以用一些通用的工具来进行，如Rational rose,PowerDesigner等，这一阶段主要是依据系统的需求，获取与分析要实现的应用系统信息,进行数据内部以及外在关系的分析，从而有效地建立整个系统的数据结构（在关系数据库中通常称为表结构），在此基础上对数据库的数据量、数据流量、及响应速度的估算分析，这样数据模型就产生了。具体的操作准则是数据库的几个范式、用户的具体需求和分析者的经验，从数据库的性能、安全、方便管理、易于开发等方面出发，具体方法因分析员的喜好和习惯而异，可以不用工具，最好使用工具，能让分析过程简便，最主要是能生成一些图，如E-R图，让分析过程一目了然。
<p><strong>二、物理设计 </strong>
<p>此步设计和系统将具体使用的数据库有关，也和数据库所运行的硬、软件平台有关，目的是尽量合理地给数据库分配物理空间，这一步在数据库设计中很重要，关系到数据库数据的安全和数据库的性能，具体的来说，这一步包括相应表空间的数据文件在磁盘上的分配，还要根据数据量的大小确定redolog文件、rollback段的大小，然后进行分配，这些文件的分配要遵循一些原则，本着利于备份，利于性能优化的原则，原则如下（以ORACLE数据库为例）：
<p>1、为表和索引建立不同的表空间，禁止在系统表空间中放入非核心oracle系统成分的对象，确保数据表空间和索引表空间位于不同的磁盘磁盘驱动器上。
<p>2、了解终端用户怎样访问数据，如果可能，将经常同时查询和频繁查询的对象放在不同的物理磁盘上。
<p>3、当数据库包含允许用户并行访问不同数据元素的大对象时，将对象分割存放在多个磁盘上是有好处的。可以采用分区。在某个操作系统平台上定义拥有数百万行的表时，则更需小心，因为数据库文件的大小受到限止，这种限制是由操作系统而不是由oracle引起的。
<p>4、在独立的各盘上至少创建两个用户定义的rollback表空间，以存放用户自己的rollback段。在初始化文件中安排rollback段的次序，使它们在多个磁盘之间进行切换。
<p>5、将redo log文件放在一个读写较少的盘上。对于每个oracle 实例要建立两个以上的redo log 组，同组的两个成员放在不同的设备上。
<p>6、确立表和索引的大小，这决定了保存它们所需的表空间的尺寸，也决定了哪些表空间物理地装在哪些盘上和哪些表空间可以结合在一起。具体的估算方法可以按照oracle 一些公式，这里还要按照各个表的具体特性，用途，定义它的存贮参数如（pctfree,pctused）。
<p><strong>三、关于数据库参数的设计 </strong>
<p>每个数据库在建立时，都有缺省的参数设置，但是对于具体的应用要求参数设置可能不同，缺省的参数设置往往需要根据应用系统的特点而需要改动，如每个数据库的操作系统平台、instance 数目、各种内存大小的设置、采取的线程方式、备份方式等不同，具体的参数就一定要进行最为恰当的修改，这个步骤对数据库性能很重要，也是保证应用系统所要求的数据库功能得以实现重要一步。
<p><strong>四、与开发软件的接口问题 </strong>
<p>数据库设计最后要考虑的是与要选择的开发软件之间的接口问题，要准备好接口程序，有些是第三方软件已经备好的，有些是数据库本身要具备的，如jdbc,bde,ado,等与数据库的接口，主要是考虑接口的可用性、效率问题。这一步主要从经验出发，因为这种产品不断出台，而且都是经过各商家的吹捧，要在实践中决定哪个是最适合。
<p>以上是数据库建模设计的几个重要步骤的大致分析，整个设计过程是不断地改进的，是数据库管理员、设计人员、开发人员共同完成的，只是各有侧重点不同，数据库管理员侧重于是2、3步的设计，设计人员侧重于1步的设计，而开发人员侧重于4步的设计，由于有些应用系统的编程环境和实际应用环境不同，所以要做两套设计，并注意两套设计的兼容性可移植性。
<p>下面结合一个实际开发的劳资管理系统中的数据库设计，对以上几个步骤做进一步解释。
<p>该系统应用于大型企业集团，包括几十个分厂，基本数据均来源于各分厂，各分厂有一套access数据库，存贮着自己的人才档案信息，由各厂自己维护，定期传到总的数据库里，供劳资处各室查询、统计用,。这是一个分部式的数据库。<br><br>一<strong>、逻辑建模 </strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 首先是对数据库的数据量、数据流量、及响应速度的估算分析，这一步对物理设计也是必须的，劳资系统的主要数据是人员档案，大概有100兆左右，还有人员配备等信息加上工种序列、工资等级、厂矿车间等各种编码，总的数据量大约在某些方面300兆左右。数据的输入、维护大部分在各厂矿进行，然后到处里集中，所以数据流量很大，对响应速度要求一般。
<p>&nbsp;&nbsp;&nbsp; 在逻辑建模上的工具上，采用Rantional rose 2000，根据用户的需求，设计各种use case view， 在 logic view中生成数据库的实体，及实体之间的E-R图，然后生成Data modeler,确定以后，用Schema generation在建好的数据库中的对应的用户下生成表。
<p>&nbsp;&nbsp;&nbsp; 详细的图很繁琐，在这里就不展示了。
<p><strong>二、物理设计 </strong>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 1、因为职工档案信息库很大，还有照片，所以把它分成两个表，把照片单独地放在一个表中，并且采用分区技术，在档案表、照片表上建立分区，不同的分区分别放在不同的表空间。
<p>&nbsp;&nbsp;&nbsp;&nbsp; 2、因为职工档案信息库里有许多编码，查询的时候要和编码库一起进行read操作，所以不把职工档案信息表和编码库放在一个表空间。
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、建立二个rollback 表空间，十个rollback段，分区放在二个表空间里，建立一个比较大的rollback段，因为职工档案信息表经常会有批量的修改与添加。
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、将redo log文件放在一个读写较少的盘上。建立三个redo log 组，同组的两个成员放在两个盘上。因为选用的是ARCHIVELOG的备份方式。
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5、根据每个表的性质，确定其存贮的参数，如职工档案信息表的修改、删除、插入都比较多，所以把它的Pctfree 10,Pctused 80定大小，估算出它大致需要的block数，算出存放这些表的表空间的数据文件的大小。
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6、根据用户的需求，建立一套数据库的安全体系。也就是总结出几种权限级别的用户，建立这些用户，并给这些用户赋上相应的仅限，供开发人员编程时使用。
<p><strong>三、参数的设置 </strong>
<p>缺省的初始化参数文件中，选择large。因为用户数很多，100个左右。
<p>SHARED_POOL_SIZE, 与数据库大小有关，也与应用软件有关。这里设成缺省值的1.5倍。
<p>DB_BLOCK_BUFFERS 根据所用服务器的内存与交易数的大小，设为25兆。
<p>SORT_AREA_SIZE 根据所用服务器的内存，设为10兆
<p>LOG_BUFFER 用缺省值的1.5倍。
<p>DBWR_IO_SLAVES 设为1
<p>ROLLBACK_SEGMENTS 根据交易量的大小，定为10个。分别放在两个磁盘上。
<p>
<center><ccid_nobr>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
    <tbody>
        <tr>
            <td class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6>
            <pre><ccid_code>　　
            　　PROCESS 80
            　　
            　　MTS_SERVERS 3
            　　
            　　MTS_DISPATCHERS tcp,3</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr></center>　　
<p>ARCHIVE_LOG_START TRUE 采用ARCHIVE方式备份。
<p>&nbsp;&nbsp;&nbsp; 这些参数的确定是暂时的，没有一个系统可以运行之前把参数确定得正好，需要在应用程序运行之后进行调整。
<p><strong>四、与开发软件的接口问题 </strong>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 因为我们这个系统的开发软件用的是Borland c++builder 5,所以采用的是比较成熟的BDE的接口，它是Borland公司提供的，性能比较好。
<p>&nbsp;&nbsp;&nbsp;&nbsp; 以上是根据多年数据库管理、开发的实践总结而出的数据库建模与设计的大致思路，希望能对大家有所帮助。 </p>
</span></span>
<img src ="http://www.cnitblog.com/sunnywang/aggbug/37548.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sunnywang/" target="_blank">sunnywang   </a> 2007-12-10 15:52 <a href="http://www.cnitblog.com/sunnywang/archive/2007/12/10/37548.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>浅谈数据模式设计技巧</title><link>http://www.cnitblog.com/sunnywang/archive/2007/12/10/37544.html</link><dc:creator>sunnywang   </dc:creator><author>sunnywang   </author><pubDate>Mon, 10 Dec 2007 03:59:00 GMT</pubDate><guid>http://www.cnitblog.com/sunnywang/archive/2007/12/10/37544.html</guid><wfw:comment>http://www.cnitblog.com/sunnywang/comments/37544.html</wfw:comment><comments>http://www.cnitblog.com/sunnywang/archive/2007/12/10/37544.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/sunnywang/comments/commentRss/37544.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/sunnywang/services/trackbacks/37544.html</trackback:ping><description><![CDATA[<p>　说到数据库，我认为不能不先谈数据结构。1996年，在我初入大学学习计算机编程时，当时的老师就告诉我们说：计算机程序＝数据结构＋算法。尽管现在的程序开发已由面向过程为主逐步过渡到面向对象为主，但我还是深深赞同8年前老师的告诉我们的公式：计算机程序＝数据结构＋算法。面向对象的程序开发，要做的第一件事就是，先分析整个程序中需处理的数据，从中提取出抽象模板，以这个抽象模板设计类，再在其中逐步添加处理其数据的函数(即算法)，最后，再给类中的数据成员和函数划分访问权限，从而实现封装。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　　数据库的最初雏形据说源自美国一个奶牛场的记账薄(纸质的，由此可见，数据库并不一定是存储在电脑里的数据^_^)，里面记录的是该奶牛场的收支账目，程序员在将其整理、录入到电脑中时从中受到启发。当按照规定好的数据结构所采集到的数据量大到一定程度后，出于程序执行效率的考虑，程序员将其中的检索、更新维护等功能分离出来，做成单独调用的模块，这个模块后来就慢慢发展、演变成现在我们所接触到的数据库管理系统(DBMS)——程序开发中的一个重要分支。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　　下面进入正题，首先按我个人所接触过的程序给数据库设计人员的功底分一下类：<br>　　１、没有系统学习过数据结构的程序员。这类程序员的作品往往只是他们的即兴玩具，他们往往习惯只设计有限的几个表，实现某类功能的数据全部塞在一个表中，各表之间几乎毫无关联。网上不少的免费管理软件都是这样的东西，当程序功能有限，数据量不多的时候，其程序运行起来没有什么问题，但是如果用其管理比较重要的数据，风险性非常大。<br>　　２、系统学习过数据结构，但是还没有开发过对程序效率要求比较高的管理软件的程序员。这类人多半刚从学校毕业不久，他们在设计数据库表结构时，严格按照教科书上的规定，死扣E-R图和3NF(别灰心，所有的数据库设计高手都是从这一步开始的)。他们的作品，对于一般的access型轻量级的管理软件，已经够用。但是一旦该系统需要添加新功能，原有的数据库表差不多得进行大换血。<br>　　３、第二类程序员，在经历过数次程序效率的提升，以及功能升级的折腾后，终于升级成为数据库设计的老鸟，第一类程序员眼中的高人。这类程序员可以胜任二十个表以上的中型商业数据管理系统的开发工作。他们知道该在什么样的情况下保留一定的冗余数据来提高程序效率，而且其设计的数据库可拓展性较好，当用户需要添加新功能时，原有数据库表只需做少量修改即可。<br>　　４、在经历过上十个类似数据库管理软件的重复设计后，第三类程序员中坚持下来没有转行，而是希望从中找出&#8220;偷懒&#8221;窍门的有心人会慢慢觉悟，从而完成量变到质变的转换。他们所设计的数据库表结构有一定的远见，能够预测到未来功能升级所需要的数据，从而预先留下伏笔。这类程序员目前大多晋级成数据挖掘方面的高级软件开发人员。<br>　　５、第三类程序员或第四类程序员，在对现有的各家数据库管理系统的原理和开发都有一定的钻研后，要么在其基础上进行二次开发，要么自行开发一套有自主版权的通用数据库管理系统。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　　我个人正处于第三类的末期，所以下面所列出的一些设计技巧只适合第二类和部分第三类数据库设计人员。同时，由于我很少碰到有兴趣在这方面深钻下去的同行，所以文中难免出现错误和遗漏，在此先行声明，欢迎大家指正，不要藏私哦8)</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　　一、树型关系的数据表<br>　　不少程序员在进行数据库设计的时候都遇到过树型关系的数据，例如常见的类别表，即一个大类，下面有若干个子类，某些子类又有子类这样的情况。当类别不确定，用户希望可以在任意类别下添加新的子类，或者删除某个类别和其下的所有子类，而且预计以后其数量会逐步增长，此时我们就会考虑用一个数据表来保存这些数据。按照教科书上的教导，第二类程序员大概会设计出类似这样的数据表结构：</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>类别表_1(Type_table_1)<br>名称　　　　　类型　　　　约束条件　　　说明<br>type_id 　 int 　 无重复　　 类别标识，主键<br>type_name　　 char(50) 不允许为空 类型名称，不允许重复<br>type_father int 不允许为空 该类别的父类别标识，如果是顶节点的话设定为某个唯一值</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　　这样的设计短小精悍，完全满足3NF，而且可以满足用户的所有要求。是不是这样就行呢？答案是NO！Why？</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　　我们来估计一下用户希望如何罗列出这个表的数据的。对用户而言，他当然期望按他所设定的层次关系一次罗列出所有的类别，例如这样：<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>　　&#8230;&#8230;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　　看看为了实现这样的列表显示(树的先序遍历)，要对上面的表进行多少次检索？注意，尽管类别1.1.1可能是在类别3.2之后添加的记录，答案仍然是N次。这样的效率对于少量的数据没什么影响，但是日后类型扩充到数十条甚至上百条记录后，单单列一次类型就要检索数十次该表，整个程序的运行效率就不敢恭维了。或许第二类程序员会说，那我再建一个临时数组或临时表，专门保存类型表的先序遍历结果，这样只在第一次运行时检索数十次，再次罗列所有的类型关系时就直接读那个临时数组或临时表就行了。其实，用不着再去分配一块新的内存来保存这些数据，只要对数据表进行一定的扩充，再对添加类型的数量进行一下约束就行了，要完成上面的列表只需一次检索就行了。下面是扩充后的数据表结构：</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>类别表_2(Type_table_2)<br>名称　　　　　类型　　　　约束条件　　　 说明<br>type_id 　 int 　 无重复　　 类别标识，主键<br>type_name　　 char(50) 不允许为空 类型名称，不允许重复<br>type_father int 不允许为空 该类别的父类别标识，如果是顶节点的话设定为某个唯一值<br>type_layer char(6) 限定3层,初始值为000000 类别的先序遍历，主要为减少检索数据库的次数</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　　按照这样的表结构，我们来看看上面例子记录在表中的数据是怎样的：</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>type_id type_name type_father type_layer<br>1 总类别 0 000000<br>2 类别1 1 010000<br>3 类别1.1 2 010100<br>4 类别1.2 2 010200<br>5 类别2 1 020000<br>6 类别2.1 5 020100<br>7 类别3 1 030000<br>8 类别3.1 7 030100<br>9 类别3.2 7 030200<br>10 类别1.1.1 3 010101<br>&#8230;&#8230;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　　现在按type_layer的大小来检索一下：SELECT * FROM Type_table_2 ORDER BY type_layer</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>列出记录集如下：</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>type_id type_name type_father type_layer<br>1 总类别 0 000000<br>2 类别1 1 010000<br>3 类别1.1 2 010100<br>10 类别1.1.1 3 010101<br>4 类别1.2 2 010200<br>5 类别2 1 020000<br>6 类别2.1 5 020100<br>7 类别3 1 030000<br>8 类别3.1 7 030100<br>9 类别3.2 7 030200<br>&#8230;&#8230;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　　现在列出的记录顺序正好是先序遍历的结果。在控制显示类别的层次时，只要对type_layer字段中的数值进行判断，每2位一组，如大于0则向右移2个空格。当然，我这个例子中设定的限制条件是最多3层，每层最多可设99个子类别，只要按用户的需求情况修改一下type_layer的长度和位数，即可更改限制层数和子类别数。其实，上面的设计不单单只在类别表中用到，网上某些可按树型列表显示的论坛程序大多采用类似的设计。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　　或许有人认为，Type_table_2中的type_father字段是冗余数据，可以除去。如果这样，在插入、删除某个类别的时候，就得对type_layer 的内容进行比较繁琐的判定，所以我并没有消去type_father字段，这也正符合数据库设计中适当保留冗余数据的来降低程序复杂度的原则，后面我会举一个故意增加数据冗余的案例。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　　<br>　　二、商品信息表的设计<br>　　假设你是一家百货公司电脑部的开发人员，某天老板要求你为公司开发一套网上电子商务平台，该百货公司有数千种商品出售，不过目前仅打算先在网上销售数十种方便运输的商品，当然，以后可能会陆续在该电子商务平台上增加新的商品出售。现在开始进行该平台数据库的商品信息表的设计。每种出售的商品都会有相同的属性，如商品编号，商品名称，商品所属类别，相关信息，供货厂商，内含件数，库存，进货价，销售价，优惠价。你很快就设计出4个表：商品类型表(Wares_type)，供货厂商表(Wares_provider)，商品信息表(Wares_info)：</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>商品类型表(Wares_type)<br>名称　　　　　类型　　　　约束条件　　　 说明<br>type_id 　 int 　 无重复　　 类别标识，主键<br>type_name　　 char(50) 不允许为空 类型名称，不允许重复<br>type_father int 不允许为空 该类别的父类别标识，如果是顶节点的话设定为某个唯一值<br>type_layer char(6) 限定3层,初始值为000000 类别的先序遍历，主要为减少检索数据库的次数</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>供货厂商表(Wares_provider)<br>名称　　　　　类型　　　　约束条件　　　 说明<br>provider_id int 　 无重复　　 供货商标识，主键<br>provider_name char(100) 不允许为空 供货商名称</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>商品信息表(Wares_info)<br>名称　　　　 类型　　　　约束条件　　　 说明<br>wares_id int 　 无重复　　 商品标识，主键<br>wares_name char(100) 不允许为空 商品名称<br>wares_type　　 int 不允许为空　　　　　　　　　　 商品类型标识，和Wares_type.type_id关联<br>wares_info char(200) 允许为空 相关信息<br>provider int 不允许为空 供货厂商标识，和Wares_provider.provider_id关联<br>setnum int 初始值为1 内含件数，默认为1<br>stock int 初始值为0 库存，默认为0<br>buy_price money 不允许为空 进货价<br>sell_price money 不允许为空 销售价<br>discount money 不允许为空 优惠价</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　　你拿着这3个表给老板检查，老板希望能够再添加一个商品图片的字段，不过只有一部分商品有图片。OK，你在商品信息表(Wares_info)中增加了一个haspic的BOOL型字段，然后再建了一个新表——商品图片表(Wares_pic)：</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>商品图片表(Wares_pic)<br>名称　　　　 类型　　　　约束条件　　　 说明<br>pic_id int 　 无重复　　 商品图片标识，主键<br>wares_id int 不允许为空 所属商品标识，和Wares_info.wares_id关联<br>pic_address　 char(200) 不允许为空　　　　　　　　　　 图片存放路径</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　　程序开发完成后，完全满足老板目前的要求，于是正式启用。一段时间后，老板打算在这套平台上推出新的商品销售，其中，某类商品全部都需添加&#8220;长度&#8221;的属性。第一轮折腾来了&#8230;&#8230;当然，你按照添加商品图片表的老方法，在商品信息表(Wares_info)中增加了一个haslength的BOOL型字段，又建了一个新表——商品长度表(Wares_length)：</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>商品长度表(Wares_length)<br>名称　　　　 类型　　　　约束条件　　　 说明<br>length_id int 　 无重复　　 商品图片标识，主键<br>wares_id int 不允许为空 所属商品标识，和Wares_info.wares_id关联<br>length　 char(20) 不允许为空　　　　　　　　　　 商品长度说明</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　　刚刚改完没多久，老板又打算上一批新的商品，这次某类商品全部需要添加&#8220;宽度&#8221;的属性。你咬了咬牙，又照方抓药，添加了商品宽度表(Wares_width)。又过了一段时间，老板新上的商品中有一些需要添加&#8220;高度&#8221;的属性，你是不是开始觉得你所设计的数据库按照这种方式增长下去，很快就能变成一个迷宫呢？那么，有没有什么办法遏制这种不可预见性，但却类似重复的数据库膨胀呢？我在阅读《敏捷软件开发：原则、模式与实践》中发现作者举过类似的例子：7.3　&#8220;Copy&#8221;程序。其中，我非常赞同敏捷软件开发这个观点：在最初几乎不进行预先设计，但是一旦需求发生变化，此时作为一名追求卓越的程序员，应该从头审查整个架构设计，在此次修改中设计出能够满足日后类似修改的系统架构。下面是我在需要添加&#8220;长度&#8221;的属性时所提供的修改方案：</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　　去掉商品信息表(Wares_info)中的haspic字段，添加商品额外属性表(Wares_ex_property)和商品额外信息表(Wares_ex_info)2个表来完成添加新属性的功能。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>商品额外属性表(Wares_ex_property)<br>名称　　　　 类型　　　　约束条件　　　 说明<br>ex_pid int 　 无重复　　 商品额外属性标识，主键<br>p_name char(20) 不允许为空 额外属性名称</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>商品额外信息表(Wares_ex_info)<br>名称　　　　 类型　　　　约束条件　　　 说明<br>ex_iid int 　 无重复　　 商品额外信息标识，主键<br>wares_id int 不允许为空 所属商品标识，和Wares_info.wares_id关联<br>property_id　 int 不允许为空　　　　　　　　　　 商品额外属性标识，和Wares_ex_property.ex_pid关联<br>property_value char(200) 不允许为空 商品额外属性值</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　　在商品额外属性表(Wares_ex_property)中添加2条记录：<br>ex_pid p_name<br>1 商品图片<br>2 商品长度</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　　再在整个电子商务平台的后台管理功能中追加一项商品额外属性管理的功能，以后添加新的商品时出现新的属性，只需利用该功能往商品额外属性表(Wares_ex_property)中添加一条记录即可。不要害怕变化，被第一颗子弹击中并不是坏事，坏的是被相同轨道飞来的第二颗、第三颗子弹击中。第一颗子弹来得越早，所受的伤越重，之后的抵抗力也越强8)</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><br>　　三、多用户及其权限管理的设计<br>　　开发数据库管理类的软件，不可能不考虑多用户和用户权限设置的问题。尽管目前市面上的大、中型的后台数据库系统软件都提供了多用户，以及细至某个数据库内某张表的权限设置的功能，我个人建议：一套成熟的数据库管理软件，还是应该自行设计用户管理这块功能，原因有二：<br>　　1.那些大、中型后台数据库系统软件所提供的多用户及其权限设置都是针对数据库的共有属性，并不一定能完全满足某些特例的需求；<br>　　2.不要过多的依赖后台数据库系统软件的某些特殊功能，多种大、中型后台数据库系统软件之间并不完全兼容。否则一旦日后需要转换数据库平台或后台数据库系统软件版本升级，之前的架构设计很可能无法重用。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　　下面看看如何自行设计一套比较灵活的多用户管理模块，即该数据库管理软件的系统管理员可以自行添加新用户，修改已有用户的权限，删除已有用户。首先，分析用户需求，列出该数据库管理软件所有需要实现的功能；然后，根据一定的联系对这些功能进行分类，即把某类用户需使用的功能归为一类；最后开始建表：<br>　　<br>功能表(Function_table)<br>名称　　类型　 约束条件　　　说明<br>f_id int 　 无重复　　 功能标识，主键<br>f_name char(20) 不允许为空 功能名称，不允许重复<br>f_desc char(50) 允许为空 功能描述</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>用户组表(User_group)<br>名称　　 类型　 约束条件　　　说明<br>group_id int 无重复 用户组标识，主键<br>group_name char(20) 不允许为空 用户组名称<br>group_power char(100) 允许为空 用户组权限表，内容为功能表f_id的集合</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>用户表(User_table)<br>名称　　　　类型　　　　约束条件　　　说明<br>user_id int 无重复 用户标识，主键<br>user_name char(20) 无重复 用户名<br>user_pwd char(20) 不允许为空 用户密码<br>user_type int 不允许为空 所属用户组标识，和User_group.group_id关联</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　　采用这种用户组的架构设计，当需要添加新用户时，只需指定新用户所属的用户组；当以后系统需要添加新功能或对旧有功能权限进行修改时，只用操作功能表和用户组表的记录，原有用户的功能即可相应随之变化。当然，这种架构设计把数据库管理软件的功能判定移到了前台，使得前台开发相对复杂一些。但是，当用户数较大(10人以上)，或日后软件升级的概率较大时，这个代价是值得的。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><br>　　四、简洁的批量m:n设计<br>　　碰到m:n的关系，一般都是建立3个表，m一个，n一个，m:n一个。但是，m:n有时会遇到批量处理的情况，例如到图书馆借书，一般都是允许用户同时借阅n本书，如果要求按批查询借阅记录，即列出某个用户某次借阅的所有书籍，该如何设计呢？让我们建好必须的3个表先：</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>书籍表(Book_table)<br>名称　　　类型　　　　约束条件　　　说明<br>book_id int 无重复 书籍标识，主键<br>book_no char(20) 无重复 书籍编号<br>book_name char(100) 不允许为空 书籍名称<br>&#8230;&#8230;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>借阅用户表(Renter_table)<br>名称　　　　类型　　　　约束条件　　　说明<br>renter_id int 无重复 用户标识，主键<br>renter_name char(20) 不允许为空 用户姓名<br>&#8230;&#8230;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>借阅记录表(Rent_log)<br>名称　　　类型　　　　约束条件　　　说明<br>rent_id int 无重复 借阅记录标识，主键<br>r_id int 不允许为空 用户标识，和Renter_table.renter_id关联<br>b_id int 不允许为空 书籍标识，和Book_table.book_id关联<br>rent_date datetime 不允许为空 借阅时间<br>&#8230;&#8230;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　　为了实现按批查询借阅记录，我们可以再建一个表来保存批量借阅的信息，例如：</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>批量借阅表(Batch_rent)<br>名称　　　类型　　　约束条件　　　说明<br>batch_id int 无重复 批量借阅标识，主键<br>batch_no int 不允许为空 批量借阅编号，同一批借阅的batch_no相同<br>rent_id int 不允许为空 借阅记录标识，和Rent_log.rent_id关联<br>batch_date datetime 不允许为空 批量借阅时间</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　　这样的设计好吗？我们来看看为了列出某个用户某次借阅的所有书籍，需要如何查询？首先检索批量借阅表(Batch_rent)，把符合条件的的所有记录的rent_id字段的数据保存起来，再用这些数据作为查询条件带入到借阅记录表(Rent_log)中去查询。那么，有没有什么办法改进呢？下面给出一种简洁的批量设计方案，不需添加新表，只需修改一下借阅记录表(Rent_log)即可。修改后的记录表(Rent_log)如下：</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>借阅记录表(Rent_log)<br>名称　　　类型　　　约束条件　　　说明<br>rent_id int 无重复 借阅记录标识，主键<br>r_id int 不允许为空 用户标识，和Renter_table.renter_id关联<br>b_id int 不允许为空 书籍标识，和Book_table.book_id关联<br>batch_no int 不允许为空 批量借阅编号，同一批借阅的batch_no相同<br>rent_date datetime 不允许为空 借阅时间<br>&#8230;&#8230;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　　其中，同一次借阅的batch_no和该批第一条入库的rent_id相同。举例：假设当前最大rent_id是64，接着某用户一次借阅了3本书，则批量插入的3条借阅记录的batch_no都是65。之后另外一个用户租了一套碟，再插入出租记录的rent_id是68。采用这种设计，查询批量借阅的信息时，只需使用一条标准T_SQL的嵌套查询即可。当然，这种设计不符合3NF，但是和上面标准的3NF设计比起来，哪一种更好呢？答案就不用我说了吧。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><br>　　五、冗余数据的取舍<br>　　上篇的&#8220;树型关系的数据表&#8221;中保留了一个冗余字段，这里的例子更进一步——添加了一个冗余表。先看看例子：我原先所在的公司为了解决员工的工作餐，和附近的一家小餐馆联系，每天吃饭记账，费用按人数平摊，月底由公司现金结算，每个人每个月的工作餐费从工资中扣除。当然，每天吃饭的人员和人数都不是固定的，而且，由于每顿工作餐的所点的菜色不同，每顿的花费也不相同。例如，星期一中餐5人花费40元，晚餐2人花费20，星期二中餐6人花费36元，晚餐3人花费18元。为了方便计算每个人每个月的工作餐费，我写了一个简陋的就餐记账管理程序，数据库里有3个表：</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>员工表(Clerk_table)<br>名称　　　　类型　　　　约束条件　　　说明<br>clerk_id int 无重复 员工标识，主键<br>clerk_name char(10) 不允许为空 员工姓名</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>每餐总表(Eatdata1)<br>名称　　　 类型　　　　约束条件　　　说明<br>totle_id int 无重复 每餐总表标识，主键<br>persons char(100) 不允许为空 就餐员工的员工标识集合<br>eat_date datetime 不允许为空 就餐日期<br>eat_type char(1) 不允许为空 就餐类型，用来区分中、晚餐<br>totle_price money 不允许为空 每餐总花费<br>persons_num int 不允许为空 就餐人数</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>就餐计费细表(Eatdata2)<br>名称　　类型　　约束条件　　　说明<br>id int 无重复 就餐计费细表标识，主键<br>t_id int 不允许为空 每餐总表标识，和Eatdata1.totle_id关联<br>c_id int 不允许为空 员工标识标识，和Clerk_table.clerk_id关联<br>price money 不允许为空 每人每餐花费</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　　其中，就餐计费细表(Eatdata2)的记录就是把每餐总表(Eatdata1)的一条记录按就餐员工平摊拆开，是个不折不扣的冗余表。当然，也可以把每餐总表(Eatdata1)的部分字段合并到就餐计费细表(Eatdata2)中，这样每餐总表(Eatdata1)就成了冗余表，不过这样所设计出来的就餐计费细表重复数据更多，相比来说还是上面的方案好些。但是，就是就餐计费细表(Eatdata2)这个冗余表，在做每月每人餐费统计的时候，大大简化了编程的复杂度，只用类似这么一条查询语句即可统计出每人每月的寄餐次数和餐费总帐：</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>SELECT clerk_name AS personname,COUNT(c_id) as eattimes,SUM(price) AS ptprice FROM Eatdata2 JOIN Clerk_tabsle ON (c_id=clerk_id) JOIN eatdata1 ON (totleid=tid) WHERE eat_date&gt;=CONVERT(datetime,'"&amp;the_date&amp;"') AND eat_date </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　　想象一下，如果不用这个冗余表，每次统计每人每月的餐费总帐时会多麻烦，程序效率也够呛。那么，到底什么时候可以增加一定的冗余数据呢？我认为有2个原则：</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　　１、用户的整体需求。当用户更多的关注于，对数据库的规范记录按一定的算法进行处理后，再列出的数据。如果该算法可以直接利用后台数据库系统的内嵌函数来完成，此时可以适当的增加冗余字段，甚至冗余表来保存这些经过算法处理后的数据。要知道，对于大批量数据的查询，修改或删除，后台数据库系统的效率远远高于我们自己编写的代码。<br>　　２、简化开发的复杂度。现代软件开发，实现同样的功能，方法有很多。尽管不必要求程序员精通绝大部分的开发工具和平台，但是还是需要了解哪种方法搭配哪种开发工具的程序更简洁，效率更高一些。冗余数据的本质就是用空间换时间，尤其是目前硬件的发展远远高于软件，所以适当的冗余是可以接受的。不过我还是在最后再强调一下：不要过多的依赖平台和开发工具的特性来简化开发，这个度要是没把握好的话，后期维护升级会栽大跟头的。</p>
<p><br>&nbsp;</p>
<img src ="http://www.cnitblog.com/sunnywang/aggbug/37544.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sunnywang/" target="_blank">sunnywang   </a> 2007-12-10 11:59 <a href="http://www.cnitblog.com/sunnywang/archive/2007/12/10/37544.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DW 方面的好书</title><link>http://www.cnitblog.com/sunnywang/archive/2007/12/06/37415.html</link><dc:creator>sunnywang   </dc:creator><author>sunnywang   </author><pubDate>Thu, 06 Dec 2007 08:50:00 GMT</pubDate><guid>http://www.cnitblog.com/sunnywang/archive/2007/12/06/37415.html</guid><wfw:comment>http://www.cnitblog.com/sunnywang/comments/37415.html</wfw:comment><comments>http://www.cnitblog.com/sunnywang/archive/2007/12/06/37415.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/sunnywang/comments/commentRss/37415.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/sunnywang/services/trackbacks/37415.html</trackback:ping><description><![CDATA[<table class=tablebody2 style="TABLE-LAYOUT: fixed; WORD-BREAK: break-all" width="90%" border=0>
    <tbody>
        <tr>
            <td style="FONT-SIZE: 9pt; LINE-HEIGHT: 12pt" width="100%"><!-- google_ad_section_start --><img alt=发贴心情 src="http://www.bipub.org/bipub/Skins/Default/topicface/face1.gif" align=absMiddle border=0>&nbsp;<strong>推荐几本数据仓库的好书</strong><br>
            <ol>
                <li>数据仓库工具箱（第二版）
                <li>数据仓库生命周期工具箱
                <li>The Data Warehouse ETL Toolkit
                <li>Wiley.Mastering.Data.Warehouse.Aggregates.Solutions.for.Star.Schema.Performance.Jul.2006 </li>
            </ol>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.cnitblog.com/sunnywang/aggbug/37415.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sunnywang/" target="_blank">sunnywang   </a> 2007-12-06 16:50 <a href="http://www.cnitblog.com/sunnywang/archive/2007/12/06/37415.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pentaho  的发音：  pen （盆）    ta (他)   hou（吼） </title><link>http://www.cnitblog.com/sunnywang/archive/2007/12/06/37413.html</link><dc:creator>sunnywang   </dc:creator><author>sunnywang   </author><pubDate>Thu, 06 Dec 2007 08:21:00 GMT</pubDate><guid>http://www.cnitblog.com/sunnywang/archive/2007/12/06/37413.html</guid><wfw:comment>http://www.cnitblog.com/sunnywang/comments/37413.html</wfw:comment><comments>http://www.cnitblog.com/sunnywang/archive/2007/12/06/37413.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/sunnywang/comments/commentRss/37413.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/sunnywang/services/trackbacks/37413.html</trackback:ping><description><![CDATA[<p>我从pentaho那里听来的发音是pen 念pen， ta念ta（他） ，ho念hou （吼）。这是美式发音。<br>就像读拼音一样哦~~~~ </p>
<br><br><br><!-- google_ad_section_end -->
<table class=tablebody2 style="TABLE-LAYOUT: fixed; WORD-BREAK: break-all" width="90%" border=0>
    <tbody>
        <tr>
            <td style="FONT-SIZE: 9pt; LINE-HEIGHT: 12pt" width="100%"><!-- google_ad_section_start --><img alt=发贴心情 src="http://www.bipub.org/bipub/Skins/Default/topicface/face1.gif" align=absMiddle border=0>&nbsp;<strong></strong><br>看你想先用什么内容了。如果需要多维分析，可以先学习mondrian和jpiovt。如果需要报表，可以先学习jfreereport。pentaho的整体架构过于复杂，不要想一下子都掌握。 </td>
        </tr>
    </tbody>
</table>
<br><br>如果只想做多维分析和报表， 应该怎么做？pentaho 实在是太大了。<br>
<table class=tablebody2 style="TABLE-LAYOUT: fixed; WORD-BREAK: break-all" width="90%" border=0>
    <tbody>
        <tr>
            <td style="FONT-SIZE: 9pt; LINE-HEIGHT: 12pt" width="100%"><!-- google_ad_section_start --><img alt=发贴心情 src="http://www.bipub.org/bipub/Skins/Default/topicface/face1.gif" align=absMiddle border=0>&nbsp;<strong></strong><br>pentaho的demo其实是一个包含BI基础框架和演示例子的平台。xaction是构成业务流程的基本单位。Pentaho Design Stduio很重要，它是xaction的设计工具。它可以调用Kettle，Report Designer等工具的生成结果，来完成多维分析和报表的展示。另外，如果仅仅是做多维分析和报表并且对pentaho不了解，可以考虑只使用mondrian和jpivot，再加上其它的报表工具就可以了。 <!-- google_ad_section_end --></td>
        </tr>
    </tbody>
</table>
<br><br><br><a href="http://www.bipub.org/bipub/dispbbs.asp?boardID=18&amp;ID=66&amp;page=2">http://www.bipub.org/bipub/dispbbs.asp?boardID=18&amp;ID=66&amp;page=2</a><br><br><br><br>http://en.wikipedia.org<br>http://zh.wikipedia.org<br>真正的百科全书，不妨看看OLAP是什么东东<br>http://en.wikipedia.org/wiki/Olap
<p>或者闲来无聊看看号称当前最尖端的科学 统一场论！——我也不知道是说啥的<br>http://en.wikipedia.org/wiki/Unified_Field_Theory<br></p>
<br><br><br><br>
<table class=tablebody2 style="TABLE-LAYOUT: fixed; WORD-BREAK: break-all" width="90%" border=0>
    <tbody>
        <tr>
            <td style="FONT-SIZE: 9pt; LINE-HEIGHT: 12pt" width="100%"><!-- google_ad_section_start --><img alt=发贴心情 src="http://www.bipub.org/bipub/Skins/Default/topicface/face1.gif" align=absMiddle border=0>&nbsp;<strong>Pentaho合作伙伴商业问题FAQ</strong><br>Pentaho合作伙伴商业问题FAQ文档地址：<a href="http://www.pentaho.org/images/stories/pentahopartnerfaq.pdf" target=_blank><font color=#000000>http://www.pentaho.org/images/stories/pentahopartnerfaq.pdf</font></a> </td>
        </tr>
    </tbody>
</table>
<br>
<img src ="http://www.cnitblog.com/sunnywang/aggbug/37413.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sunnywang/" target="_blank">sunnywang   </a> 2007-12-06 16:21 <a href="http://www.cnitblog.com/sunnywang/archive/2007/12/06/37413.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何构建银行数据仓库</title><link>http://www.cnitblog.com/sunnywang/archive/2007/12/05/37370.html</link><dc:creator>sunnywang   </dc:creator><author>sunnywang   </author><pubDate>Wed, 05 Dec 2007 11:17:00 GMT</pubDate><guid>http://www.cnitblog.com/sunnywang/archive/2007/12/05/37370.html</guid><wfw:comment>http://www.cnitblog.com/sunnywang/comments/37370.html</wfw:comment><comments>http://www.cnitblog.com/sunnywang/archive/2007/12/05/37370.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/sunnywang/comments/commentRss/37370.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/sunnywang/services/trackbacks/37370.html</trackback:ping><description><![CDATA[<p><br>&nbsp;&nbsp;&nbsp;&nbsp; 数据仓库技术作为一项数据管理领域的新技术，其精髓在于针对联机分析处理(OLAP)提出了一种综合的解决方案，与以往很多技术不同的是，它主要是一种概念，在此概念指导下完成系统的构造。既没有可以直接购买到的现成产品，也没有具体的分析规范和实现方法，也就是说没有成熟、可靠且被广泛接受的数据仓库标准。在以往关系数据库的设计和实现中，不仅有详细的理论推导，还有无数的设计实例，无论你使用的是什么公司的数据库产品、开发工具，只要按照规范做，那么实现同一业务需求的方案都会很相似。而现有数据仓库的实现中，出现了MOLAP方案和ROLAP方案的区别，出现了形形色色的数据仓库建模工具、表现工具，而设计人员的个人经验和素质也会在其中扮演很重要的角色。</p>
<p>&nbsp;&nbsp; 数据仓库技术的实现方式</p>
<p>目前在数据仓库技术的实际应用中主要包括如下几种具体实现方式。<br>1、在关系数据库上建立数据仓库(ROLAP)<br><br>2、在多维数据库上建立数据仓库(MOLAP)<br><br>&nbsp;&nbsp;&nbsp; MOLAP方案是以多维方式来组织数据，以多维方式来存储数据；ROLAP方案则以二维关系表为核心表达多维概念，通过将多维结构划分为两类表:维表和事实表，使关系型结构能较好地适应多维数据的表示和存储。在多维数据模型的表达方面，多维矩阵比关系表更清晰且占用的存储更少，而通过关系表间的连接来查询数据的ROLAP系统，系统性能成为最大问题。MOLAP方案比ROLAP方案要简明，索引及数据聚合可以自动进行并自动管理，但同时丧失了一定的灵活性。<br>&nbsp;&nbsp;&nbsp; ROLAP方案的实现较为复杂，但灵活性较好，用户可以动态定义统计和计算方式，另外能保护在已有关系数据库上的投资。<br>&nbsp;&nbsp;&nbsp; 由于两种方案各有优劣，因此在实际应用中，往往将MOLAP和ROLAP结合使用，即所谓的混合模型。利用关系数据库存储历史数据、细节数据或非数值型数据，发挥关系数据库技术成熟的优势，减少花费，而在多维数据库中存储当前数据和常用统计数据，以提高操作性能。<br><br>3、在原有关系库上建立逻辑上的数据仓库<br>&nbsp;&nbsp;&nbsp; 由于目前正在运行的OLTP系统中已经积累了海量数据，如何从中提取出决策所需的有用信息就成为用户最迫切的需要。新建数据仓库固然能从功能、性能各方面给出一个完整的解决方案，但需要投入大量的人力、物力，并且数据仓库的建设和分析数据的积累需要一段时间，无法及时满足用户对信息分析的迫切需要。因此在筹建数据仓库的前期，可以采用一些合适的表现工具，在原有OLTP系统上建立起一个逻辑的数据仓库系统。尽管由于原有OLTP系统设计上的局限性，这样的系统可能无法实现很多分析功能，但这样一个系统中数据结构固定、信息分析需求相对稳定成熟，因此数据仓库的建模、实现过程会相对容易、便捷；同时，这样的系统也会成为将来真正数据仓库建设的原型。<br></p>
<p>信息系统与数据仓库的关系</p>
<p>&nbsp;&nbsp;&nbsp; 由于数据量大、数据来源多样化，在商业银行构建管理信息系统时，不可避免地会遇上如何管理这些浩如烟海的数据，以及如何从中提取有用的信息的问题；而数据仓库的最大优点在于它能把企业网络中不同信息岛上的商业数据集中到一起，存储在一个单一的集成的数据库中，并提供各种手段对数据进行统计、分析。因此可以说，在银行使用数据仓库构建管理信息系统，既有压力，又有数据基础，它们之间的联系是必然的，难以割舍的。<br>数据仓库在商业银行的应用范围包括存款分析、贷款分析、客户市场分析、相关金融业分析决策(证券、外汇买卖)、风险预测、效益分析等。<br><br>&nbsp;&nbsp; 在银行信息系统构建时，由于历史情况和现实需求的不同，存在两种途径:<br><br>1、建设新系统<br><br>&nbsp;&nbsp; 由于目前国内商业银行对银行内部运营的监管，缺乏很好的数据搜集机制，因此可以在构建管理信息系统时，分数据收集录入和数据汇总分析两部分来考虑。这样的系统中由于不需考虑大量历史数据的处理问题，同时考虑到搜集过程中可能存在多个数据来源，因此可以在系统建设的同时构建数据仓库，将搜集来的各种数据通过数据抽取整合到数据仓库中。<br><br>2、完善原有系统<br>&nbsp; 而对于已经存在OLTP系统，其中沉淀了大量历史数据，则可以先在原有系统上建立逻辑数据仓库，即使用数据分析的表现工具，在关系模型上构建一个虚拟的多维模型。当系统需求稳定后，再建立物理数据仓库，这样既节省投资，又缩短开发工期。<br><br></p>
<p>实现中需要注意的问题<br></p>
<p>一、模型设计中的问题<br><br>&nbsp;&nbsp;&nbsp; 模型设计(包括逻辑模型设计和物理模型设计)是系统的基础和成败的关键，在实际操作中，视实现技术的不同应分别对下列问题引起注意。<br><br>1、直接构建数据仓库<br><br>&nbsp;&nbsp; 直接构建数据仓库时，必须按业务分析的要求重组OLTP系统中的数据，并要按不同侧重点分别组织，使之便于使用。<br><br>*主题的确定<br><br>&nbsp;&nbsp; 主题是一个逻辑概念，它应该能够完整、统一地刻画出分析对象所涉及的各项数据以及相互联系。划分主题的根据主要来源于两方面:对原有固定报表的分析和对业务人员的访谈。原有固定报表能较好地反映出以往工作对数据分析的需求，而且数据含义和格式相对成熟、稳定，在模型设计中需要大量借鉴。但仅仅满足于替代目前的手工报表还远远不应是构建管理信息系统的目标，还应该通过业务访谈，进一步挖掘出日常工作中潜在的更广、更深的分析需求。只有这样，才能真正了解构建数据仓库模型所需的主题划分。<br><br>*分析内容的细化<br><br>&nbsp;&nbsp; 主题的划分实际上是与分析内容的范围直接相关的，一旦主题划分清楚了，下一步就是细化分析的具体内容以及根据分析内容的性质确定它在数据仓库中的位置。通常维元素对应的是分析角度，而度量对应的是分析关心的具体指标。一个指标究竟是作为维元素、度量还是维属性，取决于具体的业务需求，但从实际操作中可以总结出如下的概念性经验:作为维元素或维属性的通常是离散型的数据，只允许有限的取值；作为度量的是连续型数据，取值无限。如果一定要用连续型数据作为维元素，则必须对其按取值进行分段，以分段值作为实际的维元素。判断分析指标是作为维元素还是维属性时，则需要综合考虑这个指标占用的存储空间与相关查询的使用频度。<br>&nbsp;&nbsp; 需要特别强调的是，在细化分析内容的过程中，务必解决指标的歧义问题。在不同报表中以及在业务访谈中同一名称的指标，是否是在同样条件限定下，通过同样方法提取或计算得到的，它们之间的相互关系是什么，这些问题都必须从熟悉业务的分析人员那里得到准确、清晰的答案，否则将会影响到模型设计、数据提取、数据展现等多个方面。<br><br>*粒度的设计<br><br>&nbsp;&nbsp; 数据仓库模型中所存储的数据的粒度将对信息系统的多方面产生影响。事实表中以各种维度的什么层次作为最细粒度，将决定存储的数据能否满足信息分析的功能需求，而粒度的层次划分、以及聚合表中粒度的选择将直接影响查询的响应时间。<br>&nbsp;&nbsp; 如果同一个信息系统要在大范围、多层次上同时运行，如部门级和企业级，还应考虑不同层次的数据仓库采用不同的粒度。<br><br>*模型设计中的技巧<br><br>&nbsp;&nbsp; 复合指标尤其是比率类指标的定义，必须注意累加时是先加减后乘除，还是反之。户数、笔数的计算，这类指标在分析或报表中经常出现，但不需要作为单独的指标物理存在于数据库中，但定义分析模型时一定应该准备。度量的时间特性，针对分析指标在时间维上的不同表现，可分为可累加指标、半可累加指标和不可累加指标。<br><br>2、在原有数据基础上构建逻辑数据仓库<br><br>&nbsp;&nbsp;&nbsp; 如果直接使用OLTP系统中的数据进行数据分析处理，会遇到许多麻烦，有时甚至是不可能实现的。这并不是说关系数据库不好，而是因为其设计思路不适应较大规模数据分析。因此在使用这种方法时，需要注意下列问题的处理:<br><br><span style="COLOR: red">*不同的时间单位</span></p>
<p><br>&nbsp;&nbsp;&nbsp; 这是实现过程中最常遇到的问题，也往往是最难解决的问题。OLTP系统中存储的时间往往采用与实际业务发生相同的时间单位，如帐务数据单位为日期，财务报表单位为月或半年。而面向分析时，往往要将不同时间单位的数据统一到同一个结果中，这样就必须存在适当的转换机制才能实现。<br><br><br>*冗余信息<br><br>&nbsp;&nbsp; 所谓冗余信息，就是指不同关系表中存在的同一含义的字段，而同一含义不仅指这些字段的取得或计算方式一样，还指它们成立的条件一样，例如截止某一时间同一地区的同一贷种的贷款余额。在OLTP系统中，这样的字段往往是基于性能考虑而设计的，而在面向分析设计模型时，为了保证结果的唯一性和准确性，就必须用且只用其中之一的数据产生分析结果。<br><br>*表间连接<br><br>&nbsp;&nbsp; 由于OLTP系统中表的设计面向业务处理，既要保证数据的完整性、一致性，又要考虑响应时间，因此表与表之间既相对独立，又相互依赖。在设计数据仓库逻辑模型时，对表间的连接必须做出相应取舍，既要保证分析数据能通过连接取得或计算出，又要避免出现环路，造成分析数据的歧义。另外，不同的连接途径还会出现不同的查询速度，影响数据分析的响应性能。<br><br>*统计表的设计<br><br>&nbsp; 如果上述问题不能在原有数据库基础上得到很好的解决，那么权益之计就是构建统计表，即简单化的数据仓库，形式类似数据仓库的事实表，定时计算统计数据放入，将时间、冗余、连接等问题摈除，进行简单分析。<br><br>二、数据抽取中的问题<br><br>&nbsp; 数据抽取是一件技术含量不高，但非常烦琐的工作，必须有专人负责数据抽取的工作。在对其进行设计时，要注意的问题有:<br><br>1、数据抽取的规则要作为元数据进行规范和管理，抽取过程中的源表、源字段、目的表、目的字段、转换规则以及转换条件都要作好详细记录。这样不仅便于编程人员实现，而且在抽取规则或逻辑模型发生变化时也便于修改。<br><br>2、如何记录业务数据库中的变动情况是数据抽取中一个重要的环节。由于数据仓库中按时间保存数据，因此不同时间点之间数据的差异就成为一个关键性因素。通常可以利用数据库管理系统提供的手段在数据库级产生数据变动日志，根据日志再判断数据的变动情况完成抽取，这样是一个从性能、可操作性以及对原业务系统的影响等多方面综合考虑都比较理想的方法。<br><br>3、当数据仓库中同一表中的数据来自于原有系统中不同的表，甚至不同的库时，抽取时务必保证这些数据单位一致，而且都满足同一时间条件。<br><br>4、数据抽取不仅要考虑数据的提取，还要考虑抽取的时间安排和执行方式，这样才是一个完整的数据抽取方案，也才能保证抽取出来的数据准确、可用。<br><br><br>三、后期维护、优化中的问题<br><br><br>数据仓库的建设是一个长期工作，它同其他系统一样需要在运行的过程中不断进行调整、完善。这其中包括两方面的工作:<br><br>1、性能<br>&nbsp;&nbsp; 数据仓库涉及海量数据的查询，数据的大量写入读出，不仅对数据库系统的要求很高，而且与OLTP系统的要求极为不同，因此在系统设计、实施和维护的过程中，数据仓库系统的性能都是一个不可忽视的问题。尤其是在运行期间，要密切关注应用对系统资源的消耗情况，针对应用的特点及时对系统进行调整，包括调整数据库参数、数据分片放置、创建特殊索引乃至提高系统配置等。<br><br>2、模型<br>&nbsp;&nbsp; 应用与需求是相互促进、不断发展的，随着信息系统建成运行，用户在对系统了解不断加深的过程中，也会对系统提出更新更高的要求。如何在最小投入的前提下满足用户的需求，也是一个值得注意和潜心研究的问题。首先要尽可能挖掘现有系统的潜力，其次考虑，对主题的增加或可在现有系统上增加少量指标就可解决的需求，对系统进行适当调整，最后才考虑对系统进行重构，尽可能减小系统建设中的投入。<br></p>
<p>数据仓库应用的深化<br><br><br>&nbsp;&nbsp; 按照上述方法实现的应用中，主要完成了报表的生成和日常业务的分析，这并不能给企业带来真正的效益，也远远没有发挥出数据仓库的应用价值。随着应用的深入，可以由企业的技术人员与业务人员紧密配合，规划出对企业有实际价值的应用模型，并根据实际业务的发展不断调整模型自身的参数，以期找出企业运作过程中的规律，即在数据仓库上进行数据挖掘，构建DSS系统，这样才能充分体现构建数据仓库的意义，从而最终为企业带来效益。<br><br>&nbsp; &nbsp;尽管数据仓库技术还需要不断发展、完善，但只要企业能认识到信息分析的重要性，业务人员和技术人员能真正配合起来，相信不久的将来会有更多的实用成果出现。<br><br></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<img src ="http://www.cnitblog.com/sunnywang/aggbug/37370.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sunnywang/" target="_blank">sunnywang   </a> 2007-12-05 19:17 <a href="http://www.cnitblog.com/sunnywang/archive/2007/12/05/37370.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库主键和外键设计的原则</title><link>http://www.cnitblog.com/sunnywang/archive/2007/12/03/37266.html</link><dc:creator>sunnywang   </dc:creator><author>sunnywang   </author><pubDate>Mon, 03 Dec 2007 04:01:00 GMT</pubDate><guid>http://www.cnitblog.com/sunnywang/archive/2007/12/03/37266.html</guid><wfw:comment>http://www.cnitblog.com/sunnywang/comments/37266.html</wfw:comment><comments>http://www.cnitblog.com/sunnywang/archive/2007/12/03/37266.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/sunnywang/comments/commentRss/37266.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/sunnywang/services/trackbacks/37266.html</trackback:ping><description><![CDATA[在我们的数据库设计中，不可逃避的就是数据库表的主键，可能有很多朋友没有深入思考过，主键的设计对整个数据库的设计影响很大，因此我们不得不要重视起来。&nbsp; <br>　　主键的必要性:&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;　有些朋友可能不提倡数据库表必须要主键，但在我的思考中，觉得每个表都应该具有主键，不管是单主键还是双主键，主键的存在就代表着表结构的完整性，表的记录必须得有唯一区分的字段，主键主要是用于其他表的外键关联，本记录的修改与删除，当我们没有主键时，这些操作会变的非常麻烦。&nbsp; <br>　　主键的无意义性： <br>&nbsp;&nbsp;&nbsp;&nbsp;　我强调主键不应该具有实际的意义，这可能对于一些朋友来说不太认同，比如订单表吧，会有&#8220;订单编号&#8221;字段，而这个字段呢在业务实际中本身就是应该具有唯一性，具有唯一标识记录的功能，但我是不推荐采用订单编号字段作为主键的，因为具有实际意义的字段，具有&#8220;意义更改&#8221;的可能性，比如订单编号在刚开始的时候我们一切顺利，后来客户说&#8220;订单可以作废，并重新生成订单，而且订单号要保持原订单号一致&#8221;，这样原来的主键就面临危险了。因此，具有唯一性的实际字段也代表可以作为主键。因此，我推荐是新设一个字段专门用为主键，此主键本身在业务逻辑上不体现，不具有实际意义。而这种主键在一定程序增加了复杂度，所以要视实际系统的规模大小而定，对于小项目，以后扩展不会很大的话，也查允许用实际唯一的字段作主键的。&nbsp; <br>　　主键的选择 <br>&nbsp;&nbsp;&nbsp;&nbsp;　我们现在在思考一下，应该采用什么来作表的主键比较合理，申明一下，主键的设计没有一个定论，各人有各人的方法，哪怕同一个，在不同的项目中，也会采用不同的主键设计原则。&nbsp;<br><br>&nbsp;第一：编号作主键&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;　此方法就是采用实际业务中的唯一字段的&#8220;编号&#8221;作为主键设计，这在小型的项目中是推荐这样做的，因为这可以使项目比较简单化，但在使用中却可能带来一些麻烦，比如要进行&#8220;编号修改&#8221;时，可能要涉及到很多相关联的其他表，就象黎叔说的&#8220;后果很严重&#8221;;还有就是上面提到的&#8220;业务要求允许编号重复时&#8221;，我们再那么先知，都无法知道业务将会修改成什么?&nbsp; <br><br>第二：自动编号主键&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;　这种方法也是很多朋友在使用的，就是新建一个id字段，自动增长，非常方便也满足主键的原则，优点是：数据库自动编号，速度快，而且是增量增长，聚集型主键按顺序存放，对于检索非常有利;数字型的，占用空间小，易排序，在程序中传递也方便;如果通过非系统增加记录（比如手动录入，或是用其他工具直接在表里插入新记录，或老系统数据导入）时，非常方便，不用担心主键重复问题。&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;　缺点：其实缺点也就是来自其优点，就是因为自动增长，在手动要插入指定id的记录时会显得麻烦，尤其是当系统与其他系统集成时，需要数据导入时，很难保证原系统的id不发生主键冲突（前提是老系统也是数字型的）;如果其他系统主键不是数字型那就麻烦更大了，会导致修改主键数据类型了，这也会导致其他相关表的修改，后果同样很严重;就算其他系统也是数字型的，在导入时，为了区分新老数据，可能想在老数据主键前统一加一个&#8220;o&#8221;(old)来表示这是老数据，那么自动增长的数字型又面临一个挑战。&nbsp; <br><br>第三：max加一&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;　由于自动编号存在那些问题，所以有些朋友就采用自己生成，同样是数字型的，只是把自动增长去掉了，采用在insert时，读取max值后加一，这种方法可以避免自动编号的问题，但也存在一个效率问题，如果记录非常大的话，那么max()也会影响效率的;更严重的是并发性问题，如果同时有两人读到相同的max后，加一后插入的id值会重复，这已经是有经验教训的了。&nbsp; <br><br>第四：自制加一&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;　考虑max加一的效率后，有人采用自制加一，也就是建一个特别的表，字段为：表名，当前序列值。这样在往表中插入值时，先从此表中找到相应表的最大值后加一，进行插入，有人可能发现，也可能会存在并发处理，这个并发处理，我们可以采用lock线程的方式来避免，在生成此值的时，先lock，取到值以后，再unlock出来，这样不会有两人同时生成了。这比max加一的速度要快多了。但同样存在一个问题：在与其他系统集成时，脱离了系统中的生成方法后，很麻烦保证自制表中的最大值与导入后的保持一致，而且数字型都存在上面讲到的&#8220;o&#8221;老数据的导入问题。因此在&#8220;自制加一&#8221;中可以把主键设为字符型的。字符型的自制加一我倒是蛮推荐的，应该字符型主键可以应付很多我们意想不到的情况。&nbsp;&nbsp;<br><br>&nbsp;第五：guid主键&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;　目前一个比较好的主键是采用guid，当然我是推荐主键还是字符型的，但值由guid生成，guid是可以自动生成，也可以程序生成，而且键值不可能重复，可以解决系统集成问题，几个系统的guid值导到一起时，也不会发生重复，就算有&#8220;o&#8221;老数据也可以区分，而且效率很高，在.net里可以直接使用system.guid.newguid()进行生成，在sql里也可以使用&nbsp;newid()生成。优点是：&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;　同&nbsp;identity&nbsp;列相比，uniqueidentifier&nbsp;列可以通过&nbsp;newid()&nbsp;函数提前得知新增加的行&nbsp;id，为应用程序的后续处理提供了很大方便。&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;　便于数据库移植，其它数据库中并不一定具有&nbsp;identity&nbsp;列，而&nbsp;guid&nbsp;列可以作为字符型列转换到其它数据库中，同时将应用程序中产生的&nbsp;guid&nbsp;值存入数据库，它不会对原有数据带来影响。&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;　便于数据库初始化，如果应用程序要加载一些初始数据，&nbsp;identity&nbsp;列的处理方式就比较麻烦，而&nbsp;uniqueidentifier&nbsp;列则无需任何处理，直接用&nbsp;t-sql&nbsp;加载即可。&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;　便于对某些对象或常量进行永久标识，如类的&nbsp;classid，对象的实例标识，uddi&nbsp;中的联系人、服务接口、tmodel标识定义等。&nbsp; <br>缺点是：&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;　guid&nbsp;值较长，不容易记忆和输入，而且这个值是随机、无顺序的。 <br>&nbsp;&nbsp;&nbsp;&nbsp;　guid&nbsp;的值有&nbsp;16&nbsp;个字节，与其它那些诸如&nbsp;4&nbsp;字节的整数相比要相对大一些。这意味着如果在数据库中使用&nbsp;uniqueidentifier&nbsp;键，可能会带来两方面的消极影响：存储空间增大；索引时间较慢。&nbsp;
<hr align=left width="25%" SIZE=1>
只要努力就有收获，只有努力才能收获。<!-- End: CommunityServer.Discussions.Controls.PostDisplay.TextPost --> 
<img src ="http://www.cnitblog.com/sunnywang/aggbug/37266.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sunnywang/" target="_blank">sunnywang   </a> 2007-12-03 12:01 <a href="http://www.cnitblog.com/sunnywang/archive/2007/12/03/37266.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据仓库和元数据管理</title><link>http://www.cnitblog.com/sunnywang/archive/2007/12/03/37264.html</link><dc:creator>sunnywang   </dc:creator><author>sunnywang   </author><pubDate>Mon, 03 Dec 2007 02:50:00 GMT</pubDate><guid>http://www.cnitblog.com/sunnywang/archive/2007/12/03/37264.html</guid><description><![CDATA[<div class=item-content>
<p><em>　</em>　在事务处理系统中的数据，主要用于记录和查询业务情况。随着数据仓库（DW）技术的不断成熟，企业的数据逐渐变成了决策的主要依据。数据仓库是一种面向决策主题、由多数据源集成、拥有当前及历史总结数据、以读为主的数据库系统，其目的是支持决策。数据仓库要根据决策的需要收集来自企业内外的有关数据，并加以适当的组织处理，使其能有效地为决策过程提供信息。数据仓库中的数据是从许多业务处理系统中抽取、转换而来，对于这样一个复杂的企业数据环境，如何以安全、高效的方式来对它们进行管理和访问就变得尤为重要。解决这一问题的关键是对元数据进行科学有效的管理。元数据是关于数据、操纵数据的进程和应用程序的结构和意义的描述信息，其主要目标是提供数据资源的全面指南。元数据不仅定义了数据仓库中数据的模式、来源以及抽取和转换规则等，而且整个数据仓库系统的运行都是基于元数据的，是元数据把数据仓库系统中的各个松散的组件联系起来，组成了一个有机的整体。</p>
<p><em><img style="DISPLAY: block; MARGIN: 0px auto 10px; TEXT-ALIGN: center" alt="" src="http://122.img.pp.sohu.com/images/blog/2007/11/27/11/2/1171b0b3dc7.jpg" border=0><br></em><br>　　<strong>一、元数据<br></strong>　　1、元数据的概念<br>　　按照传统的定义，元数据（Metadata）是关于数据的数据。在数据仓库系统中，元数据可以帮助数据仓库管理员和数据仓库的开发人员非常方便地找到他们所关心的数据；元数据是描述数据仓库内数据的结构和建立方法的数据，可将其按用途的不同分为两类：技术元数据（Technical Metadata）和业务元数据（Business Metadata）。<br>　　<strong>技术元数据</strong>是存储关于数据仓库系统技术细节的数据，是用于开发和管理数据仓库使用的数据，它主要包括以下信息：<br>　　数据仓库结构的描述，包括仓库模式、视图、维、层次结构和导出数据的定义，以及数据集市的位置和内容；<br>　　业务系统、数据仓库和数据集市的体系结构和模式；<br>　　汇总用的算法，包括度量和维定义算法，数据粒度、主题领域、聚集、汇总、预定义的查询与报告；<br>　　由操作环境到数据仓库环境的映射，包括源数据和它们的内容、数据分割、数据提取、清理、转换规则和数据刷新规则、安全（用户授权和存取控制）。<br><br>　　<strong>业务元数据</strong>从业务角度描述了数据仓库中的数据，它提供了介于使用者和实际系统之间的语义层，使得不懂计算机技术的业务人员也能够&#8220;读懂&#8221;数据仓库中的数据。业务元数据主要包括以下信息：使用者的业务术语所表达的数据模型、对象名和属性名；访问数据的原则和数据的来源；系统所提供的分析方法以及公式和报表的信息；具体包括以下信息：<br>　　企业概念模型：这是业务元数据所应提供的重要的信息，它表示企业数据模型的高层信息、整个企业的业务概念和相互关系。以这个企业模型为基础，不懂数据库技术和SQL语句的业务人员对数据仓库中的数据也能做到心中有数。<br>　　多维数据模型：这是企业概念模型的重要组成部分，它告诉业务分析人员在数据集市当中有哪些维、维的类别、数据立方体以及数据集市中的聚合规则。这里的数据立方体表示某主题领域业务事实表和维表的多维组织形式。<br>　　业务概念模型和物理数据之间的依赖：以上提到的业务元数据只是表示出了数据的业务视图，这些业务视图与实际的数据仓库或数据库、多维数据库中的表、字段、维、层次等之间的对应关系也应该在元数据知识库中有所体现。</p>
<p>　　2、元数据的作用<br>　　在数据仓库系统中，元数据机制主要支持以下五类系统管理功能：（１）描述哪些数据在数据仓库中；（２）定义要进入数据仓库中的数据和从数据仓库中产生的数据；（３）记录根据业务事件发生而随之进行的数据抽取工作时间安排；（４）记录并检测系统数据一致性的要求和执行情况；（５）衡量数据质量。<br>　　与其说数据仓库是软件开发项目，还不如说是系统集成项目，因为它的主要工作是把所需的数据仓库工具集成在一起，完成数据的抽取、转换和加载，OLAP分析和数据挖掘等。它的典型结构由操作环境层、数据仓库层和业务层等组成。<br>　　其中，第一层（操作环境层）是指整个企业内有关业务的OLTP系统和一些外部数据源；第二层是通过把第一层的相关数据抽取到一个中心区而组成的数据仓库层；第三层是为了完成对业务数据的分析而由各种工具组成的业务层。图中左边的部分是元数据管理，它起到了承上启下的作用，具体体现在以下几个方面：<br>　　便于集成<br>　　提高系统的灵活性<br>　　保证数据的质量<br>　　帮助用户理解数据的意义</p>
<p><strong>　　二、数据仓库元数据管理现状</strong><br>　　元数据管理的主要任务有两个方面：一是负责存储和维护元数据库中的元数据；二是负责数据仓库建模工具、数据获取工具、前端工具等之间的消息传递，协调各模块和工具之间的工作。<br>　　由以上几节我们了解到元数据几乎可以被称为是数据仓库乃至商业智能（BI）系统的&#8220;灵魂&#8221;，正是由于元数据在整个数据仓库生命周期中有着重要的地位，各个厂商的数据仓库解决方案都提到了关于对元数据的管理。但遗憾的是对于元数据的管理，各个解决方案都没有明确提出一个完整的管理模式；它们提供的仅仅是对特定的局部元数据的管理。当前市场上与元数据相关的数据仓库工具大致可分为四类：<br>　　1. <strong>数据抽取工具</strong>：把业务系统中的数据抽取、转换、集成到数据仓库中，如Ardent的DataStage、CA（原Platinum）的Decision Base和ETI的Extract等。这些工具仅提供了技术元数据，几乎没有提供对业务元数据的支持。<br>　　2. <strong>前端展现工具</strong>：包括OLAP分析、报表和商业智能工具等，如MicroStrategy的DSS Agent、Cognos的PowerPlay、Business Objects的BO，以及Brio等。它们通过把关系表映射成与业务相关的事实表和维表来支持多维业务视图，进而对数据仓库中的数据进行多维分析。这些工具都提供了业务元数据与技术元数据相对应的语义层。<br>　　3. <strong>建模工具</strong>：为非技术人员准备的业务建模工具，这些工具可以提供更高层的与特定业务相关的语义。如CA的ERwin、Sysbase的PowerDesigner以及Rational的Rose等。<br>　　4. <strong>元数据存储工具</strong>：元数据通常存储在专用的数据库中，该数据库就如同一个&#8220;黑盒子&#8221;，外部无法知道这些工具所用到和产生的元数据是如何存储的。还有一类被称为元数据知识库（Metadata Repository）的工具，它们独立于其它工具，为元数据提供一个集中的存储空间。包括微软的Repository，CA的Repository，Ardent的MetaStage和Sybase的WCC等。</p>
<p><strong>　　三、元数据管理的标准化</strong><br>　　没有规矩不成方圆。元数据管理之所以困难，一个很重要的原因就是缺乏统一的标准。在这种情况下，各公司的元数据管理解决方案各不相同。近几年，随着元数据联盟MDC（Meta Data Coalition）的开放信息模型<strong>OIM</strong>（Open Information Model）和OMG组织的公共仓库模型<strong>CWM</strong>（Common Warehouse Model）标准的逐渐完善，以及MDC和OMG组织的合并，为数据仓库厂商提供了统一的标准，从而为元数据管理铺平了道路。<br>　　从元数据的发展历史不难看出，元数据管理主要有两种方法：<br>　　(1) 对于相对简单的环境，按照通用的元数据管理标准建立一个集中式的元数据知识库。<br>　　(2) 对于比较复杂的环境，分别建立各部分的元数据管理系统，形成分布式元数据知识库，然后，通过建立标准的元数据交换格式，实现元数据的集成管理。<br>　　下面我们分别介绍数据仓库领域中两个最主要的元数据标准：MDC的OIM标准和OMG的CWM标准。<br><strong>　　</strong>1、MDC的OIM存储模型<br>　　MDC成立于1995年，是一个致力于建立与厂商无关的、不依赖于具体技术的企业元数据管理标准的非赢利技术联盟，该联盟有150多个会员，其中包括微软和IBM等著名软件厂商。1999年7月MDC接受了微软的建议，将OIM作为元数据标准。<br>　　OIM的目的是通过公共的元数据信息来支持不同工具和系统之间数据的共享和重用。它涉及了信息系统（从设计到发布）的各个阶段，通过对元数据类型的标准描述来达到工具和知识库之间的数据共享。OIM所声明的元数据类型都采用统一建模语言UML（Universal Modeling Language）进行描述，并被组织成易于使用、易于扩展的多个主题范围（Subject Areas），这些主题范围包括：<br>　　分析与设计（Analysis and Design）：主要用于软件分析、设计和建模。该主题范围又进一步划分为：UML包（Package）、UML扩展包、通用元素（Generic Elements）包、公共数据类型（Common Data Types）包和实体关系建模（Entity Relationship Modeling）包等。<br>　　对象与组件（Object and Component）：涉及面向对象开发技术的方方面面。该主题范围只包含组件描述建模（Component Description Modeling）包。<br>　　数据库与数据仓库（Database and Warehousing）：为数据库模式管理、复用和建立数据仓库提供元数据概念支持。该主题范围进一步划分为：关系数据库模式（Relational Database Schema）包、OLAP模式（OLAP Schema）包、数据转换（Data Transformations）包、面向记录的数据库模式（Record-Oriented Database Schema）包、XML模式（XML Schema）包和报表定义（Report Definitions）包等。<br>　　业务工程（Business Engineering）：为企业运作提供一个蓝图。该主题范围进一步划分为：业务目标（Business Goal）包、组织元素（Organizational Elements）包、业务规则（Business Rules）包、商业流程（Business Processes）包等。<br>　　知识管理（Knowledge Management）：涉及企业的信息结构。该主题范围进一步划分为：知识描述（Knowledge Descriptions）包和语义定义（Semantic Definitions）包。<br>上述主题范围中的包都是采用UML定义的，可以说UML语言是整个OIM标准的基础。虽然OIM标准并不是专门针对数据仓库的，但数据仓库是它的主要应用领域之一。目前市场上基于该标准的元数据管理工具已经比较成熟，例如微软的Repositry和CA的Repositry均采用了OIM标准。</p>
<p>　　2、OMG组织的CWM模型<br>　　OMG是一个拥有500多会员的国际标准化组织，著名的CORBA标准即出自该组织。公共仓库元模型（Common Warehouse Metamodel）的主要目的是在异构环境下，帮助不同的数据仓库工具、平台和元数据知识库进行元数据交换。2001年3月，OMG颁布了CWM 1.0标准。CWM模型既包括元数据存储，也包括元数据交换，它是基于以下三个工业标准制定的：<br>　　(1) <strong>UML</strong>：它对CWM模型进行建模。<br>　　(2) <strong>MOF</strong>（元对象设施）：它是OMG元模型和元数据的存储标准，提供在异构环境下对元数据知识库的访问接口。<br>　　(3) <strong>XMI</strong>（XML元数据交换）：它可以使元数据以XML文件流的方式进行交换。<br>　　<br>　　CWM为数据仓库和商业智能（BI）工具之间共享元数据，制定了一整套关于语法和语义的规范。它主要包含以下四个方面的规范：<br>　　(1) CWM元模型（Metamodel）：描述数据仓库系统的模型；<br>　　(2) CWM XML：CWM元模型的XML表示；<br>　　(3) CWM DTD：DW/BI共享元数据的交换格式<br>　　(4) CWM IDL：DW/BI共享元数据的应用程序访问接口（API）<br>　　下面重点讨论CWM元模型的组成，它与OIM规范一样，也是由很多包组成的。组成CWM元模型的包结构如图4所示。<br>　　(1) <strong>元模型（MetaModel）包</strong>：构造和描述其它CWM包中的元模型类的基础。它是UML的一个子集，由以下四个子包组成：<br>　　a) 核心（Core）包：它的类和关联是该模型的核心，其它所有的包都以它为基础。<br>　　b) 行为（Behavioral）包：包括描述CWM对象行为的类与关联，并且它为描述所定义的行为提供了基础。<br>　　c) 关系（Relationships）包：包括描述CWM对象之间关系的类与关联。<br>　　d) 实例（Instance）包：包括表示CWM分类器（Classfier）的类与关联。　　<br>　　(2) <strong>基础包（Foundation）</strong>：它包括表示CWM概念和结构的模型元素，这些模型元素又可被其他CWM包所共享，它由以下六个子包组成：<br>　　a) 业务信息（Business Information）包：包括表示模型元素业务信息的类与关联。<br>　　b) 数据类型（Data Types）包：包括表示建模者可以用来创建所需数据类型的结构的类与关联。<br>　　c) 表达式（Expressions）包：包括表示表达式树的类与关联。<br>　　d) 关键字和索引（Keys and Indexes）包：包括表示键和索引的类与关联。<br>　　e) 软件发布（Software Deployment）包：包括软件如何在数据仓库中发布的类与关联。<br>　　f) 类型映射（Type Mapping）包：包括表示不同系统之间数据类型映射的类与关联。<br>　　(3)<strong> 资源包（Resource）</strong>：用于描述数据资源的包，它包括以下四个子包：<br>　　a) 关系（Relational）包：包括表示关系型数据资源的元数据的类与关联。<br>　　b) 记录（Record）包：包括表示记录型数据资源的元数据的类与关联。<br>　　c) 多维（Multidimensional）包：包括表示多维数据资源的元数据的类与关联。<br>　　d) XML包：包括表示XML数据资源的元数据的类与关联。<br>　　(4) <strong>分析（Analysis）包</strong>：它由以下五个子包组成：<br>　　a) 转换（Transformation）包：包括表示数据抽取和转换工具的元数据的类与关联。<br>　　b) OLAP包：包括表示OLAP工具的元数据的类与关联。<br>　　c) 数据挖掘（Data Mining）包：包括表示数据挖掘工具的元数据的类与关联。<br>　　d) 信息可视化（Information Visualization）包：包括表示信息可视化工具的元数据的类与关联。<br>　　e) 业务术语（Business Nomenclature）包：包括表示分类业务的元数据的类与关联。<br>　　(5) <strong>管理（Management）包</strong>：用于描述数据仓库管理的包，它包括以下两个子包：<br>　　a) 仓库过程（Warehouse Process）包：包括表示仓库过程的元数据的类与关联。<br>　　b) 仓库操作（Warehouse Operation）包：包括表示仓库操作结果的元数据的类与关联。<br>　　在数据抽取过程中，数据从各个业务系统中被统一转换存储到中央数据仓库中。CWM中的转换模型定义了数据在源和目的之间移动的过程，其中不仅包括源和目标之间的参数，还包括转换中的业务逻辑。这些业务逻辑可能包括一些商业规则、类库甚至是用户脚本。数据仓库如果有一个规范的转换模型将给工具软件厂商和专业服务提供商带来极大的好处，例如，按照统一的规范厂商可以设计一个通用的模型从标准ERP包中抽取数据。工具厂商甚至可以随软件提供成熟的模型，集成商也可以将一个模型应用到多个项目中。<br>　　最终用户同样也能从CWM中受益，在使用商业智能分析软件进行多维分析的时候，用户往往会对数据的含义和来源产生疑问。CWM能够提供这些信息，用户可以清楚地看到数据来自哪个系统，并且是如何组成的。<br><br>　　3、CWM与OIM之间的关系<br>　　上两节分别介绍了与数据仓库相关的两个主要标准，CWM实际上是专门为数据仓库元数据而制定的一套标准，而OIM并不是针对数据仓库元数据的。OIM所关注的元数据的范围比CWM要广，CWM只限定于数据仓库领域，而OIM模型包括有：分析与设计模型、对象与组件、数据库与数据仓库、商业工程、知识管理等五个领域。OIM与CWM在建模语言的选择（都选择UML当做自己的描述语言）、数据库模型的支持、OLAP分析模型的支持、数据转换模型的支持方面都比较一致；但是OIM并不是基于元对象设施（MOF）的，这意味着用OIM所描述的元数据需要通过其它的接口才能访问，而CWM所描述的元数据可以通过CORBA IDL来访问；在数据交换方面，OIM必须通过特定的转换形成XML文件来交换元数据，而CWM可以用XMI来进行交换。尽管如此，由于OMG与MDC两个组织的合并，CWM也会与OIM相互兼容以保护厂商已有的投资。<br>　　需要说明的是，MDC与OMG组织已经合并，今后所有的工具都将遵循统一的CWM标准，不过支持CWM的工具才刚刚出现，而支持OIM标准的工具已经相对成熟。</p>
<p><strong>　　四、元数据管理系统的设计与实现</strong><br>　　1、设计原则<br>　　数据仓库环境下的元数据管理系统的建设是十分困难的。但是在实际项目的实施过程中，这个环节又是非常重要的。当前情况下，OMG组织的CWM标准将会成为数据仓库元数据领域事实上的标准，在元数据管理系统的建立过程中应尽量参考这个标准，这样使系统的可扩展性增强。可是在与之相关的工具成熟之前，我们完全可以采用OIM中的元模型（因CWM对OIM是兼容的）以及支持它的元数据管理工具进行元数据管理系统的建设，而且元数据所包含的范围很广。我们在建立元数据管理系统的时候，绝对不能盲目追求大而全，要坚持目标驱动的原则，在实施的时候要采取增量式、渐进式的建设原则。具体的建设步骤如下：<br>　　（1） 如果是在建设数据仓库系统的初期，那么首先要确定系统的边界范围，系统范围确定的原则是首先保障重点，不求大，只求精。<br>　　（2） 系统边界确定以后，把现有系统的元数据整理出来，加入语义层的对应。然后存到一个数据库中，这个数据库可以采用专用的元数据知识库，也可以采用一般的关系型数据库。<br>　　（3） 确定元数据管理的范围。比如，我们只想通过元数据来管理数据仓库中数据的转换过程，以及有关数据的抽取路线，以使数据仓库开发和使用人员明白仓库中数据的整个历史过程。<br>　　（4） 确定元数据管理的工具，采用一定的工具可以完成相应的工作。当前相关工具有微软的Repositry，它带有相应的编程接口，可以借助于它来完成元模型出入库的功能；与之相似的还有Platinum的OEE；另外还有Sybase的Wcc，它可以通过MDC以前的一个老标准――MDIS来集成抽取工具与转换工具，在一个窗口中就可以表示数据抽取与转换，并且可以把语义层以MDIS的格式导出到一个前端工具当中（比如Cognos的Improptu）。</p>
<p>　　2、元数据存储模式<br>　　元数据存在的状况是有差异的，系统层元数据应随数据库存在，且由建立在分布式网络数据库管理系统统一管理；数据集层次元数据可以随数据库存在也可随数据集存在；数据特征层次的元数据只能随数据集存在。<br>　　简单地，元数据存贮有两种形式：<strong>其一是以数据集为基础</strong>，即每一个数据集有一个对应的元数据文档，每一个元数据文件中包含对相应数据集的元数据内容。<strong>另一种存在方式是以数据库为基础</strong>（即元数据库），给一个数据库有一个元数据文件，该文件为一表格数据，它由若干项组成，每一项表示元数据的一个要素，其记录为每一个数据集的元数据内容。<br>　　两种存贮方式各有优缺点，对于第一种存储模式，其好处是调用数据时其相应的元数据也作为一个独立的文件被传输，相对数据库有较强的独立性，在对元数据进行检索时可以利用数据库的功能实现，也可以将元数据文件调到其它数据库系统中进行操作；其问题是：每一数据集都有一个元数据文档，那么在规模巨大的数据库中则会有大量的元数据文件，管理上极为不便。在第二中存在模式中，由于库中只有一个元数据文件，管理极为方便，添加或删除数据集只把该文件中添加或删除相应的记录项即可；但如果想获取某数据集的元数据时，实际得到的只是关系表格数据的一个记录，则要求数据用户使用的系统中可以接受这种特定形式的数据。因此推荐使用元数据库的方式。<br>　　元数据库是用于存储元数据的地方，元数据库最好选用主流的关系数据库管理系统，支持CWM标准。一个元数据库还包含那些用于操作和查询元数据的机制；建立元数据库的主要好处是提供了统一的关键数据结构和业务规则，易于将企业内部的多个数据集市有机的结合起来；特别是，现在一些客户倾向建立多个数据集市，而不是一个庞大无比的数据仓库。可以考虑在建立数据仓库（或数据集市）之前，先建立一个用于描述数据的、用于应用集成的元数据库，做好数据仓库实施的初期支持工作，对后续开发和维护有很大的帮助。在拥有不同厂商、不同功能和不同元数据库的环境下，要实现两种产品之间的元数据同步是非常富有挑战性的工作。因为必须从一种产品中获得足够详细的元数据，将其映射到另一种产品中，再指出两者意义或编码的差别；通常系统有数百、数千个元数据，必须对每个元数据重复这一过程。<br>　　在整个数据仓库环境中，元数据管理工具可以从各个数据仓库组件中收集元数据，存储到元数据库中，然后向业务用户传递和展示正确的信息。采集、集成和描述元数据可以扩展到十分广泛的范围，可以在设计和建模的过程中，可以在数据转换、清洗和过滤的过程中，也可以在数据移植的过程中；可以从数据库/数据存储软件，和前端展示工具中得到元数据。<br>　　元数据库为整个企业的宝贵信息提供了详细的记录，保存数据存储位置和商业含义、生成和维护数据的主体、数据驱动的应用处理、与其它数据的关系以及数据的转换过程等。元数据库保证了数据仓库数据的一致性和准确性，为企业进行数据质量管理提供数据依据。<br>另外，元数据库还支持强大的查询和报表生成工具，用户使用报表工具可以查询元数据库，从元数据库获得重要的决策支持信息。</p>
<p>　　3、元数据管理模式<br>　　元数据管理涉及到各个层次的元数据，管理的内容包括元数据的获取、元数据的更新、使用和面向应用项目的元数据使用处理等多个方面。元数据的管理涉及数据库、数据处理软件、数据使用系统、面向应用的数据分析等各个环节。下面给出了一种普通意义的以元数据信息系统为基础的元数据管理模式。<br>　　通常意义上的元数据管理是指元数据通过各种途径形成后，对其内容的添加、删除、更新等涉及内容改变的操作和元数据内容检索、查询、放置、组织等常规性元数据操作，从这种意义上元数据的管理可以通过两种方式实现，即系统管理模式和用户管理模式。系统管理模式是面向数据库的，由数据库管理系统专业人员完成，数据用户只有使用权，没有元数据的操作权，数据应用项目中新生成的数据集的元数据也有应用系统传递给数据库管理员，然后由数据库管理员统一管理。这种方式中，数据在处理过程中形成的动态元数据很难及时记录下来。另一种管理方式是用户管理模式，它是面向应用项目的，即允许某些数据用户在数据应用元数据的变动信息直接反馈给元数据库，这样则能保证元数据的动态更新和新生成数据集元数据的及时捕获及写入元数据文件。但这种模式中数据用户的权限要适当的控制，以避免数据库的破坏。通常对元数据的管理是采用两者结合的模式。<br>　　总之，建立元数据管理系统一定要坚持关注标准，又不被标准所束缚的原则，建立符合自身目标的元数据管理系统。<br><br>&nbsp;</p>
</div>
<img src ="http://www.cnitblog.com/sunnywang/aggbug/37264.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sunnywang/" target="_blank">sunnywang   </a> 2007-12-03 10:50 <a href="http://www.cnitblog.com/sunnywang/archive/2007/12/03/37264.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>