??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲一卡2卡三卡4卡有限公司,亚洲国产成人精品电影,亚洲综合国产精品第一页http://www.tkk7.com/huyi2006/category/30474.html 做一个有思想的h,期待与每一位热爱思考的Z?您的x是对我最大的支持?/description>zh-cnWed, 12 Jan 2011 07:32:46 GMTWed, 12 Jan 2011 07:32:46 GMT60开源NoSQL构徏大型分布式架?/title><link>http://www.tkk7.com/huyi2006/articles/342813.html</link><dc:creator>allic</dc:creator><author>allic</author><pubDate>Wed, 12 Jan 2011 01:17:00 GMT</pubDate><guid>http://www.tkk7.com/huyi2006/articles/342813.html</guid><wfw:comment>http://www.tkk7.com/huyi2006/comments/342813.html</wfw:comment><comments>http://www.tkk7.com/huyi2006/articles/342813.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/huyi2006/comments/commentRss/342813.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/huyi2006/services/trackbacks/342813.html</trackback:ping><description><![CDATA[2009q开始掀L“NoSQL革命”在Web领域造成了极大的反响QTwitter也在2010q对其Tweets数据cd引进新生的NoSQL数据库。近日,国外知名|站readwriteweb.com企业频道作者Klint Finley撰写了一有关“Twitter攑ּMySQL转而用NoSQL~由”的文章? infoQ在今q早些时候发布了一个演讲视频,在该视频中,Kevin Weil谈到了公司应如何使用NoSQL。Weil指出Twitter严重依赖于MySQL。然而,当MYSQL在许多用途上表现的ƈ不理想的时?Twitter使用了NoSQL解决Ҏ。据威尔介绍Q在2009q里QTwitter用户C1月䆾的每天约 200万hQ激增至12月䆾的每天近5000万h。每天登陆Twitter的用h量增长已l超q了20倍。目前Twitter每天产生的用h据在 12TB左右Q而每q约产生4PB的数据?   Scribe   Twitter的系l日志在一D|间后停止q行压羃Q所以Facebook使用Scribe来替代它。日志的攉创徏在Facebook开源框架上QTwitter已经发布了一些Scribe的补丁。Twitter使用Scribe来记录Hadoop的日志。Scribe使Twitter记录日志数据变得单。Scribeq可以比以前记录更多的数据,现在数据日志已经分成?0个不同的cd?   Hadoop   Twitter每天都需要将更多的数据可靠的写入C个硬盘驱动器上,然后q是不现实的Q所以像Twitterq样每天都生大量数据的机构需要把数据存储在集之中才能满_业务需求。Twitter使用了Cloudera的Hadoop为其分配集群。Weil指出能够QMySQL不能满 Twitter在大规模做需求分析时所要求的效率,Z满需求,Twitter使用了Hadoop及自己拥有的开源项目,他们UC为FlockDB?Hadoop可以q行分析q找到在FlockBD中相似的C交图数据集合?   Pig      q种Pig脚本可以帮您扑ֈ其网站年龄在18?5岁访问者中讉K量排名前五位的网?   Weil说Hadoop是通过Java语言实现的,但是Java是复杂的Q这使得它很隑ֿ速的重复执行。相反,Twitter使用Pig脚本的语aQ这个高U语aq行在Hadoop之上?   Yahoo创造了Pig脚本语言q其快速发展,Weil表示QPig非常易学q且Ҏ理解。他_你将受益于Pig的方便,q且它羃短了执行旉Q但q是值得的?   HBase   HBase是徏立在Hadoop的之上的Qƈ且具有低延时和数据可变性的设计?Twitter的用它来增Zh们的搜烦?   FlockDB   FlockDB是一个实时的、分布式的数据库。如上所qͼ它的建立和开源由来自Twitter。该公司使用它的C交囑ֈ析。它仍然在MySQL的下面,但是它的速度非常快?   Weil用一个在FlockDB的应用程序D例,昄哪些用户昄@表示回复。D个例子。如果Ashton Kutcher发送tweet到@foursquare。它不应该显C在Kutcher?156915_丝之中Q他应该仅在xKutcher的用户和 Foursquare中显C?   Cassandra   Twitter至今仍然在尝试ƈ使用CasandraQ这个开源的数据库由Facebook创徏。Weil_Twitter当前的原子计实验用的是Cassandra。但对Twitter而言QCassandra也非万能Q首先在于Cassandra代码或许q存在不问题,Twitter如果投入大量的精力来改进Cassandra和比较优化MySQL 的投入来看有点得不偿失。在QCon Beijing上@nk也提到Cassandra在Twitter的内部测试中曄暴露Z严重的问题?   Twitter拿所有的q些数据都用来做什?   Twitter的用它攉的所有数据有各种用途。有些只是简单的计数问题Q如计算出有多少h它的服务Q每天有多少搜烦服务Q每天来处理q些交易的^均时_{等?   其他用途更为复杂。例如,不同cd用户的运行比较。Twitter的分析数据,以确定是否移动用P用户谁用了W三方客L或“超U用户”与普通用户用Twitter的不同?   韦伊最后指出,Twitter的其他问题包括:定转推的话题中哪些cd是h们最感兴,最成功的网l需要什么样的社会效果图l构Q以及如何区分不同类型的人或机器人?img src ="http://www.tkk7.com/huyi2006/aggbug/342813.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/huyi2006/" target="_blank">allic</a> 2011-01-12 09:17 <a href="http://www.tkk7.com/huyi2006/articles/342813.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL修改root密码的各U方法整?/title><link>http://www.tkk7.com/huyi2006/articles/247943.html</link><dc:creator>allic</dc:creator><author>allic</author><pubDate>Tue, 23 Dec 2008 09:12:00 GMT</pubDate><guid>http://www.tkk7.com/huyi2006/articles/247943.html</guid><wfw:comment>http://www.tkk7.com/huyi2006/comments/247943.html</wfw:comment><comments>http://www.tkk7.com/huyi2006/articles/247943.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/huyi2006/comments/commentRss/247943.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/huyi2006/services/trackbacks/247943.html</trackback:ping><description><![CDATA[ <p>整理了以下四U在MySQL中修改root密码的方?可能对大家有所帮助!</p> <p>Ҏ1Q?用SET PASSWORD命o</p> <p>  mysql -u root</p> <p>  mysql> SET PASSWORD FOR <a href="mailto:'root'@'localhost'">'root'@'localhost'</a> = PASSWORD('newpass');</p> <p>Ҏ2Q用mysqladmin</p> <p> </p> <p>  mysqladmin -u root password "newpass"</p> <p>  如果root已经讄q密码,采用如下Ҏ</p> <p>  mysqladmin -u root password oldpass "newpass"</p> <p>Ҏ3Q?用UPDATE直接~辑user?/p> <p>  mysql -u root</p> <p>  mysql> use mysql;</p> <p>  mysql> UPDATE user SET Password = PASSWORD('newpass') WHERE user = 'root';</p> <p>  mysql> FLUSH PRIVILEGES;</p> <p>在丢失root密码的时候,可以q样</p> <p>  mysqld_safe --skip-grant-tables&</p> <p>  mysql -u root mysql</p> <p>  mysql> UPDATE user SET password=PASSWORD("new password") WHERE user='root';</p> <p>  mysql> FLUSH PRIVILEGES;</p> <p> </p> <img src ="http://www.tkk7.com/huyi2006/aggbug/247943.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/huyi2006/" target="_blank">allic</a> 2008-12-23 17:12 <a href="http://www.tkk7.com/huyi2006/articles/247943.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux下两个不同版本Mysql的安装实战(Mysql5和mysql4Q?/title><link>http://www.tkk7.com/huyi2006/articles/247941.html</link><dc:creator>allic</dc:creator><author>allic</author><pubDate>Tue, 23 Dec 2008 09:05:00 GMT</pubDate><guid>http://www.tkk7.com/huyi2006/articles/247941.html</guid><wfw:comment>http://www.tkk7.com/huyi2006/comments/247941.html</wfw:comment><comments>http://www.tkk7.com/huyi2006/articles/247941.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/huyi2006/comments/commentRss/247941.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/huyi2006/services/trackbacks/247941.html</trackback:ping><description><![CDATA[问题的生:在已有的Red Hat Enterprise Linux AS 3.0pȝ上已l运行了一套webE序Q用Mysql4, tomcat41, 现在又要求安装一套新E序Q依旧用该tomcat41, 但数据库变ؓ<span id="eieoqcm" class="hilite1"><font style="BACKGROUND-COLOR: #ffff00">mysql5</font></span>?<br /><br />注意事项Q?<br />新的E序需要注意字W集的问题, <br />1)具体数据库的权限和分l问题, <br />2)<span id="mqsomeg" class="hilite1"><font style="BACKGROUND-COLOR: #ffff00">mysql5</font></span>下的具体数据库从windows直接拯到Linux下不好的问题, <br />3)以及<span id="cygkgqa" class="hilite1"><font style="BACKGROUND-COLOR: #ffff00">mysql5</font></span>需要设|密码的问题Q?<br />4)<span id="kmoimca" class="hilite1"><font style="BACKGROUND-COLOR: #ffff00">mysql5</font></span>在linux下对数据库区分大写的问题?<br />5) mysql在终端进?<br />   mysql> <br />   时的用户名和密码问题 <br /><br />此外Q在具体安装<span id="qauyiiy" class="hilite1"><font style="BACKGROUND-COLOR: #ffff00">mysql5</font></span>的过E中Q要注意?span class="hilite1"><font style="BACKGROUND-COLOR: #ffff00">mysql5</font></span>的安装位|(baseDirQ,数据库的具体存放位置QdataDirQ,端口P改ؓ3307Q?q行修改Q这h能保证两个不同版本的数据库的同时q行?<br /><br />版本P <br />MySQL v4.0.24 <br />(1)MySQL-server-4.0.24-0.i386.rpm <br />(2)MySQL-client-4.0.24-0.i386.rpm <br />(3)MySQL-devel-4.0.24-0.i386.rpm <br />MySQL 5.0.51a <br />mysql-5.0.51a.tar.gz <br />下蝲地址Qhttp://ftp.ntu.edu.tw/pub/MySQL/Downloads/MySQL-5.0/mysql-5.0.51a.tar.gz <br /><br />安装MySQL v4.0.24 <br />#rpm -qa | grep sql <br />查询pȝ是否默认安装了mysql服务?<br />然后卸蝲pȝ默认安装的mysql <br />卸蝲mysql命o如下Q?<br />#rpm -e --nodeps mysql-3.23.58-1 <br /><br />安装MySQL服务端: <br />#rpm -ivh MySQL-server-4.0.24-0.i386.rpm <br />试服务端是否安装成功: <br />#netstat -nat <br />查看端口3306是否打开 <br />然后安装MySQL客户?<br />#rpm -ivh MySQL-client-4.0.24-0.i386.rpm <br />安装MySQLq接包: <br />#rpm -ivh MySQL-devel-4.0.24-0.i386.rpm <br />此时Mysql4的各个安装\径如下: <br />以我们在Redhat下安装的MySQl4.0.26数据库ؓ例: <br />(注意事项Qrpm包用的都是默认的设|,不能更改Q以下均为默认设|? <br />1.配置文gQ?etc/my.cnf <br />2.数据库目录:/var/lib/mysql <br />3.启动脚本Q?etc/rc.d/init.d/mysql <br />4.端口3306 <br />5..socket文g/tmp/mysql.socket <br />—————————————————————————————————————?<br /><br />下面安装MySQL 5.0.51a <br /><br />׃我们安装的MySQL4.0.26的安装包cd是rpm包,所以,需要大家注意的是, <br />它用的都是默认的设|,安装后生成的配置文g和数据库目录{等一pd的配|都是我们不能改变的?<br />因此Q如果要在同一开发环境下安装两个数据库的话,我们必d理以下这些问题: <br />1.配置文g安装路径不能相同 <br />2.数据库目录不能相?<br />3.启动脚本不能同名 <br />4.端口不能相同 <br />5..socket文g的生成\径不能相?<br />依据上面的各U要求:<span id="icmwaoo" class="hilite1"><font style="BACKGROUND-COLOR: #ffff00">mysql5</font></span>.0.51a.tar.gz的源码包安装做出以下调整Q?<br />--prefix=/usr/local/<span id="kcewsow" class="hilite1"><font style="BACKGROUND-COLOR: #ffff00">mysql5</font></span>  ### 数据库安装目?<br />--localstatedir=/var/lib/<span id="iscoqyo" class="hilite1"><font style="BACKGROUND-COLOR: #ffff00">mysql5</font></span>  ### 数据库存攄?<br />--with-charset=gbk --with-collation=gbk_chinese_ci --with-extra-charsets=all ### 字符集gbk加蝲和gbk_chinese_ci加蝲Q可处理中文q问题 <br />其他的设|是Ҏ据库的一下优化,在此׃再赘q?<br /><br />参考了一些msyql5的安装文档,在这里感谢各位前?<br />mysql-5.0.51a.tar.gz解压后的安装详解Q?<br /><br />1# cd mysql-5.0.51a <br />2# mkdir /usr/local/<span id="eeicmks" class="hilite1"><font style="BACKGROUND-COLOR: #ffff00">mysql5</font></span><br /><br />(q步骤中的诸多参CQ关键的参数已经在前面介l了Q如有不懂,请参看前面的介绍? <br />3# ./configure <br />--prefix=/usr/local/<span id="skmgiqy" class="hilite1"><font style="BACKGROUND-COLOR: #ffff00">mysql5</font></span><br />--localstatedir=/var/lib/<span id="yakwyge" class="hilite1"><font style="BACKGROUND-COLOR: #ffff00">mysql5</font></span> --with-comment=Source   <br />--with-server-suffix=-Community <br />--with-mysqld-user=mysql <br />--without-debug <br />--with-big-tables <br />--with-charset=gbk --with-collation=gbk_chinese_ci --with-extra-charsets=all <br />--with-pthread <br />--enable-static <br />--enable-thread-safe-client <br />--with-client-ldflags=-all-static <br />--with-mysqld-ldflags=-all-static <br />--enable-assembler <br />--without-innodb <br />--without-ndb-debug <br />4# make <br />5# make install <br /><br />6.# useradd mysql //d mysql 用户 <br />7# cd /usr/local/<span id="ksoqiiy" class="hilite1"><font style="BACKGROUND-COLOR: #ffff00">mysql5</font></span><br />(注意Q!Q!在安装第二个数据库时候,虽然?/configure后加上了--localstatedir=/var/lib/<span id="seoykqg" class="hilite1"><font style="BACKGROUND-COLOR: #ffff00">mysql5</font></span>但是q未?var/lib下?span class="hilite1"><font style="BACKGROUND-COLOR: #ffff00">mysql5</font></span>目录Q所以我们要在源码包~译安装完成之后先检查一下是否有q个目录Q如果没有的话一定要手动创徏一?命oQ# mkdir /var/lib/<span id="ukmgsqi" class="hilite1"><font style="BACKGROUND-COLOR: #ffff00">mysql5</font></span>再执行第八步骤? <br />8# bin/mysql_install_db --user=mysql <br />(在确保第七步骤正完成之后,在执行本步骤Ӟ如果正确的话Q在/var/lib/<span id="gikeiqy" class="hilite1"><font style="BACKGROUND-COLOR: #ffff00">mysql5</font></span>下将会生相应的数据库文件? <br />9# chown -R root:mysql .       //讄权限Q注意后面有一?"." <br />10# chown -R mysql /var/lib/<span id="sueoagg" class="hilite1"><font style="BACKGROUND-COLOR: #ffff00">mysql5</font></span>   //讄 mysql 目录权限 <br />11# chgrp -R mysql .          //注意后面有一?"." <br />12# cp share/mysql/my-huge.cnf /etc/my5.cnf <br />13# cp share/mysql/mysql.server /etc/rc.d/init.d/<span id="ucgiksy" class="hilite1"><font style="BACKGROUND-COLOR: #ffff00">mysql5</font></span> //开动启?mysql?<br />14# chmod 755 /etc/rc.d/init.d/<span id="asewqwu" class="hilite1"><font style="BACKGROUND-COLOR: #ffff00">mysql5</font></span><br />15# chkconfig --add <span id="yyscyuk" class="hilite1"><font style="BACKGROUND-COLOR: #ffff00">mysql5</font></span><br /><br />16以下是安装第二个数据库时Q对启动文g<span id="kmwgkqq" class="hilite1"><font style="BACKGROUND-COLOR: #ffff00">mysql5</font></span>和配|文件my5.cnf做出的必要修攏V?<br />=================================================================================== <br />/etc/rc.d/init.d/<span id="kamosqe" class="hilite1"><font style="BACKGROUND-COLOR: #ffff00">mysql5</font></span><br /><br />修改下面的内容: <br /><br />1.datadir=/var/lib/<span id="yyakeai" class="hilite1"><font style="BACKGROUND-COLOR: #ffff00">mysql5</font></span><br />2.conf=/etc/my5.cnf <br />3.?$bindir/mysqld_safe --datadir=$datadir --pid-file=$server_pid_file $other_args >/dev/null 2>&1 &"替换为(双引号中的) <br />"$bindir/mysqld_safe --defaults-file=/etc/my5.cnf --datadir=$datadir --pid-file=$server_pid_file $other_args >/dev/null 2>&1 &"Q双引号中的Q?<br />=================================================================================== <br />/etc/my5.cnf <br /><br />修改下面的内容: <br /><br />port = 3307 ###修改相关的端?<br />socket文g生成路径 <br /><br />把[client]和[mysqld]中的port号都Ҏ3307, <br />socket = /tmp/mysql.sockҎsocket = /tmp/<span id="gyaeoeu" class="hilite1"><font style="BACKGROUND-COLOR: #ffff00">mysql5</font></span>.sock <br />[client] <br />#password = your_password <br />port  = 3307 <br />socket  = /tmp/<span id="uewassy" class="hilite1"><font style="BACKGROUND-COLOR: #ffff00">mysql5</font></span>.sock <br /><br /># Here follows entries for some specific programs <br /><br /># The MySQL server <br />[mysqld] <br />port  = 3307 <br />socket  = /tmp/<span id="qiswqwu" class="hilite1"><font style="BACKGROUND-COLOR: #ffff00">mysql5</font></span>.sock <br />================================================================================== <br />17# /etc/rc.d/init.d/<span id="yqumqok" class="hilite1"><font style="BACKGROUND-COLOR: #ffff00">mysql5</font></span> start           //启动 MySQL <br />18# bin/mysqladmin -u root password "password_for_root" ### 讄数据库JDBCq接的密?<br />    注意事项Q此密码与从l端客户端登陆数据库的密码是否ؓ同一密码Q还存在疑问?<br />              讄l端客户端登陆数据库的密码:(默认讄Q用户名Qroot 密码Q(I)) <br />19# cd /usr/local/<span id="yyuwweu" class="hilite1"><font style="BACKGROUND-COLOR: #ffff00">mysql5</font></span>/bin(q入数据库安装目录下执行以下命o) <br />20# ./mysql -u root -p (登陆数据库,以mysql>开头均属数据库内的操作,注意不要丢掉分号 <br />mysql> use mysql; <br /><br />mysql> UPDATE user SET Password=PASSWORD('newpassword') where USER='root'; <br />mysql> FLUSH PRIVILEGES; <br />mysql> exit; <br />21# service <span id="ckwgqyg" class="hilite1"><font style="BACKGROUND-COLOR: #ffff00">mysql5</font></span> stop               //关闭 MySQL <br /><br />22tomcat部v文g下的修改Q?<br />修改/usr/tomcat/jetmambo/WEB-INF/classes/jdbc.properties <br />1.3306Ҏ3307 <br />2.jdbc.password=system(注意事项Q这个密码就是数据库JDBCq接的密? <br /><br />修改后如下: <br />jdbc.driverClassName=com.mysql.jdbc.Driver <br />jdbc.url=jdbc:mysql://localhost:3307/timef3_cmd?&useUnicode=true&characterEncoding=gbk <br />jdbc.username=root <br />jdbc.password=system <br /><br />23启动数据库和WEB服务器,验证数据库安装是否成?<br />/etc/init.d/mysql restart <br />/etc/init.d/<span id="wwgauki" class="hilite1"><font style="BACKGROUND-COLOR: #ffff00">mysql5</font></span> restart <br />注意事项Q必M持两个数据库都开启服?否则tomcat报SQLException <br />/usr/tomcat/bin/catalina.sh run <br /><br />补充说明Q?<br /><br />24linux下默认数据库中表名不忽略大小写,做如下设|: <br />/etc/my5.cnf <br /><br /># The MySQL server <br />[mysqld] <br />lower_case_table_names = 1 ### 1为忽略大写 0Z忽略大小?<br />port  = 3307 <br />socket  = /tmp/<span id="eyicwca" class="hilite1"><font style="BACKGROUND-COLOR: #ffff00">mysql5</font></span>.sock <br /><br />———————————————————————————————————?<br />遗留问题Q不知那位大侠可以解{一下: <br />在终端进?<br />>mysql?<br />报: <br />ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) <br />错误?<br />---------------------------------------------------------------- <br />问题解决?<br />http://www.javaeye.com/topic/203986 <br />非常感谢q篇文章 <br /><br />./mysql -uroot -p -S /tmp/<span id="wgqkomi" class="hilite1"><font style="BACKGROUND-COLOR: #ffff00">mysql5</font></span>.sock <br /><br />如果不加参数-SQ则在默认目录去找mysql.sock <br /><br /><img src ="http://www.tkk7.com/huyi2006/aggbug/247941.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/huyi2006/" target="_blank">allic</a> 2008-12-23 17:05 <a href="http://www.tkk7.com/huyi2006/articles/247941.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>z、明晎ͼ数据库设计三大范式应用实例剖?/title><link>http://www.tkk7.com/huyi2006/articles/228904.html</link><dc:creator>allic</dc:creator><author>allic</author><pubDate>Sun, 14 Sep 2008 09:12:00 GMT</pubDate><guid>http://www.tkk7.com/huyi2006/articles/228904.html</guid><wfw:comment>http://www.tkk7.com/huyi2006/comments/228904.html</wfw:comment><comments>http://www.tkk7.com/huyi2006/articles/228904.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/huyi2006/comments/commentRss/228904.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/huyi2006/services/trackbacks/228904.html</trackback:ping><description><![CDATA[ <div class="kcoqkqy" id="vogate_ad_area"> <p>引言<br /><br />  数据库的<a class="vLink1" id="vad_1" onmouseover="this.style.borderBottom='2px #FF3366 solid';var fxEvent=arguments[0];kwmouseover(this,1,fxEvent);" title="站长中国-中国站长门户 @Vogate.com" style="FONT-SIZE: 1em; CURSOR: hand; COLOR: #ff3366; BORDER-BOTTOM: #ff3366 1px dotted; TEXT-DECORATION: underline" onmouseout="this.style.borderBottom='1px #FF3366 dotted';kwmouseout(this,1)" target="_blank" name="1">设计</a>范式是数据库设计所需要满的规范Q满些规范的数据库是z的、结构明晰的Q同Ӟ不会发生插入QinsertQ、删除(deleteQ和更新QupdateQ操作异常。反之则是ؕ七八p,不仅l数据库的编Eh员制造麻烦,而且面目可憎Q可能存储了大量不需要的冗余<a class="vLink1" id="vad_2" onmouseover="this.style.borderBottom='2px #FF3366 solid';var fxEvent=arguments[0];kwmouseover(this,2,fxEvent);" title="商丘|?商丘热线 @Vogate.com" style="FONT-SIZE: 1em; CURSOR: hand; COLOR: #ff3366; BORDER-BOTTOM: #ff3366 1px dotted; TEXT-DECORATION: underline" onmouseout="this.style.borderBottom='1px #FF3366 dotted';kwmouseout(this,2)" target="_blank" name="2">信息</a>?br /><br />  设计范式是不是很难懂呢?非也Q大学教材上l我们一堆数学公式我们当然看不懂Q也C住。所以我们很多h根本不按照范式来设计数据库?br /><br />  实质上,设计范式用很<a class="vLink1" id="vad_0" onmouseover="this.style.borderBottom='2px #FF3366 solid';var fxEvent=arguments[0];kwmouseover(this,0,fxEvent);" title="形象N培训 @Vogate.com" style="FONT-SIZE: 1em; CURSOR: hand; COLOR: #ff3366; BORDER-BOTTOM: #ff3366 1px dotted; TEXT-DECORATION: underline" onmouseout="this.style.borderBottom='1px #FF3366 dotted';kwmouseout(this,0)" target="_blank" name="0">形象</a>、很z的话语p说清楚,道明白。本文将对范式进行通俗地说明,q以W者曾l设计的一个简单论坛的数据库ؓ例来讲解怎样这些范式应用于实际工程?br /><br />  范式说明<br /><br />  W一范式Q?NFQ:数据库表中的字段都是单一属性的Q不可再分。这个单一属性由基本cd构成Q包括整型、实数、字W型、逻辑型、日期型{?br /><br />  例如Q如下的数据库表是符合第一范式的:<br /><br /></p> <table cellspacing="0" cellpadding="2" width="90%" align="center" border="1"> <tbody> <tr> <td>字段1 </td> <td>字段2 </td> <td>字段3 </td> <td>字段4</td> </tr> <tr> <td> </td> <td> </td> <td> </td> <td> </td> </tr> </tbody> </table> <br />  而这L数据库表是不W合W一范式的:<br /><br /><table cellspacing="0" cellpadding="2" width="90%" align="center" border="1"><tbody><tr><td>字段1 </td><td>字段2 </td><td colspan="2">字段3 </td><td>字段4</td></tr><tr><td> </td><td> </td><td>字段3.1</td><td>字段3.2 </td><td> </td></tr></tbody></table><p><br />  很显Ӟ在当前的M关系数据库管理系l(DBMSQ中Q傻瓜也不可能做ZW合W一范式的数据库Q因些DBMS不允怽把数据库表的一列再分成二列或多列。因此,你想在现有的DBMS中设计出不符合第一范式的数据库都是不可能的?br /><br />  W二范式Q?NFQ:数据库表中不存在非关键字D对M候选关键字D늚部分函数依赖Q部分函C赖指的是存在l合关键字中的某些字D决定非关键字段的情况)Q也x有非关键字段都完全依赖于L一l候选关键字? </p><table cellspacing="0" cellpadding="0" align="left" border="0"><tbody><tr><td valign="top"> </td></tr><tr><td> </td></tr></tbody></table><br /><br />  假定选课关系表ؓSelectCourse(学号, 姓名, q龄, 评名称, 成W, 学分)Q关键字为组合关键字(学号, 评名称)Q因为存在如下决定关p:<br /><br />  (学号, 评名称) ?(姓名, q龄, 成W, 学分)<br /><br />  q个数据库表不满第二范式,因ؓ存在如下军_关系Q?br /><br />  (评名称) ?(学分)<br /><br />  (学号) ?(姓名, q龄)<br /><br />  卛_在组合关键字中的字段军_非关键字的情c?br /><br />  ׃不符?NFQ这个选课关系表会存在如下问题Q?br /><br />  (1) 数据冗余Q?br /><br />  同一门课E由n个学生选修Q?学分"重复n-1ơ;同一个学生选修了m门课E,姓名和年龄就重复了m-1ơ?br /><br />  (2) 更新异常Q?br /><br />  若调整了某门评的学分,数据表中所有行?学分"值都要更斎ͼ否则会出现同一门课E学分不同的情况?br /><br />  (3) 插入异常Q?br /><br />  假设要开设一门新的课E,暂时q没有h选修。这P׃q没?学号"关键字,评名称和学分也无法记录入数据库?br /><br />  (4) 删除异常Q?br /><br />  假设一批学生已l完成课E的选修Q这些选修记录应该从数据库表中删除。但是,与此同时Q课E名U和学分信息也被删除了。很昄Q这也会D插入异常?<br /><br />  把选课关系表SelectCourse改ؓ如下三个表:<br /><br />  学生QStudent(学号, 姓名, q龄)Q?br /><br />  评QCourse(评名称, 学分)Q?br /><br />  选课关系QSelectCourse(学号, 评名称, 成W)?br /><br />  q样的数据库表是W合W二范式的,消除了数据冗余、更新异常、插入异常和删除异常?br /><br />  另外Q所有单关键字的数据库表都符合第二范式,因ؓ不可能存在组合关键字?br /><br />  W三范式Q?NFQ:在第二范式的基础上,数据表中如果不存在非关键字段对Q一候选关键字D늚传递函C赖则W合W三范式。所谓传递函C赖,指的是如果存?A ?B ?C"的决定关p,则C传递函C赖于A。因此,满W三范式的数据库表应该不存在如下依赖关系Q?br /><br />  关键字段 ?非关键字Dx ?非关键字Dy<br /><br />  假定学生关系表ؓStudent(学号, 姓名, q龄, 所?a ><font color="#000000">学院</font></a>, <a ><u><font color="#004a9c">学院</font></u></a>地点, <a ><u><font color="#004a9c">学院</font></u></a>电话)Q关键字为单一关键?学号"Q因为存在如下决定关p:<br /><br />  (学号) ?(姓名, q龄, 所?a ><u><font color="#004a9c">学院</font></u></a>, <a ><u><font color="#004a9c">学院</font></u></a>地点, <a ><u><font color="#004a9c">学院</font></u></a>电话)<br /><br />  q个数据库是W合2NF的,但是不符?NFQ因为存在如下决定关p:<br /><br />  (学号) ?(所?a ><u><font color="#004a9c">学院</font></u></a>) ?(<a ><u><font color="#004a9c">学院</font></u></a>地点, <a ><u><font color="#004a9c">学院</font></u></a>电话)<br /><br />  卛_在非关键字段"<a ><u><font color="#004a9c">学院</font></u></a>地点"?<a ><u><font color="#004a9c">学院</font></u></a>电话"对关键字D?学号"的传递函C赖?br /><br />  它也会存在数据冗余、更新异常、插入异常和删除异常的情况,读者可自行分析得知?br /><br />  把学生关p表分ؓ如下两个表:<br /><br />  学生Q?学号, 姓名, q龄, 所?a ><u><font color="#004a9c">学院</font></u></a>)Q?br /><br />  <a ><u><font color="#004a9c">学院</font></u></a>Q?<a ><u><font color="#004a9c">学院</font></u></a>, 地点, 电话)?br /><br />  q样的数据库表是W合W三范式的,消除了数据冗余、更新异常、插入异常和删除异常?br /><br />  鲍依?U得范式QBCNFQ:在第三范式的基础上,数据库表中如果不存在M字段对Q一候选关键字D늚传递函C赖则W合W三范式?p> 假设仓库理关系表ؓStorehouseManage(仓库ID, 存储物品ID, 理员ID, 数量)Q且有一个管理员只在一个仓?a class="vLink1" id="vad_3" onmouseover="this.style.borderBottom='2px #FF3366 solid';var fxEvent=arguments[0];kwmouseover(this,3,fxEvent);" title="N店工作,上最佳东方! @Vogate.com" style="FONT-SIZE: 1em; CURSOR: hand; COLOR: #ff3366; BORDER-BOTTOM: #ff3366 1px dotted; TEXT-DECORATION: underline" onmouseout="this.style.borderBottom='1px #FF3366 dotted';kwmouseout(this,3)" target="_blank" name="3">工作</a>Q一个仓库可以存储多U物品。这个数据库表中存在如下军_关系Q?br /><br />  (仓库ID, 存储物品ID) ?理员ID, 数量)<br /><br />  (理员ID, 存储物品ID) ?(仓库ID, 数量)<br /><br />  所以,(仓库ID, 存储物品ID)?理员ID, 存储物品ID)都是StorehouseManage的候选关键字Q表中的唯一非关键字Dؓ数量Q它是符合第三范式的。但是,׃存在如下军_关系Q?br /><br />  (仓库ID) ?(理员ID)<br /><br />  (理员ID) ?(仓库ID)<br /><br />  卛_在关键字D决定关键字D늚情况Q所以其不符合BCNF范式。它会出现如下异常情况:<br /><br />  (1) 删除异常Q?br /><br />  当仓库被清空后,所?存储物品ID"?数量"信息被删除的同时Q?仓库ID"?理员ID"信息也被删除了?br /><br />  (2) 插入异常Q?br /><br />  当仓库没有存储Q何物品时Q无法给仓库分配理员?br /><br />  (3) 更新异常Q?br /><br />  如果仓库换了理员,则表中所有行的管理员ID都要修改?br /><br />  把仓库管理关p表分解Z个关p表Q?br /><br />  仓库理QStorehouseManage(仓库ID, 理员ID)Q?br /><br />  仓库QStorehouse(仓库ID, 存储物品ID, 数量)?br /><br />  q样的数据库表是W合BCNF范式的,消除了删除异常、插入异常和更新异常?</p><p> </p><p>范式应用<br /><br />  我们来逐步搞定一个论坛的数据库,有如下信息:<br /><br />  Q?Q?用户Q用户名QemailQ主,电话Q联pd址<br /><br />  Q?Q?帖子Q发帖标题,发帖内容Q回复标题,回复内容 <br /><br />  W一ơ我们将数据库设计ؓ仅仅存在表:<br />   </p><table cellspacing="0" cellpadding="2" width="90%" align="center" border="1"><tbody><tr><td>用户?</td><td>email </td><td>主页</td><td>电话</td><td>联系地址</td><td>发帖标题</td><td>发帖内容</td><td>回复标题</td><td>回复内容</td></tr></tbody></table><br />  q个数据库表W合W一范式Q但是没有Q何一l候选关键字能决定数据库表的整行Q唯一的关键字D는户名也不能完全决定整个元l。我们需要增?发帖ID"?回复ID"字段Q即表修改为:<br /><br /><table cellspacing="0" cellpadding="2" width="90%" align="center" border="1"><tbody><tr><td>用户?/td><td>email</td><td>主页</td><td>电话</td><td>联系地址</td><td>发帖ID</td><td>发帖标题</td><td>发帖内容</td><td>回复ID</td><td>回复标题</td><td>回复内容</td></tr></tbody></table><br />  q样数据表中的关键字(用户名,发帖IDQ回复ID)能决定整行:<br /><br />  (用户?发帖ID,回复ID) ?(email,主页,电话,联系地址,发帖标题,发帖内容,回复标题,回复内容)<br /><br />  但是Q这L设计不符合第二范式,因ؓ存在如下军_关系Q?br /><br />  (用户? ?(email,主页,电话,联系地址)<br /><br />  (发帖ID) ?(发帖标题,发帖内容)<br /><br />  (回复ID) ?(回复标题,回复内容)<br /><br />  即非关键字段部分函数依赖于候选关键字D,很明显,q个设计会导致大量的数据冗余和操作异常? <table cellspacing="0" cellpadding="0" align="left" border="0"><tbody><tr><td valign="top"> </td></tr><tr><td> </td></tr></tbody></table><br /><br />  我们数据库表分解ؓQ带下划U的为关键字Q:<br /><br />  Q?Q?用户信息Q用户名QemailQ主,电话Q联pd址<br /><br />  Q?Q?帖子信息Q发帖IDQ标题,内容<br /><br />  Q?Q?回复信息Q回复IDQ标题,内容<br /><br />  Q?Q?发脓Q用户名Q发帖ID<br /><br />  Q?Q?回复Q发帖IDQ回复ID<br /><br />  q样的设计是满W???范式和BCNF范式要求的,但是q样的设计是不是最好的呢?<br /><br />  不一定?br /><br />  观察可知Q第4?发帖"中的"用户??发帖ID"之间?QN的关p,因此我们可以?发帖"合ƈ到第2的"帖子信息"中;W??回复"中的"发帖ID"?回复ID"之间也是1QN的关p,因此我们可以?回复"合ƈ到第3的"回复信息"中。这样可以一定量地减数据冗余,新的设计为:<br /><br />  Q?Q?用户信息Q用户名QemailQ主,电话Q联pd址<br /><br />  Q?Q?帖子信息Q用户名Q发帖IDQ标题,内容<br /><br />  Q?Q?回复信息Q发帖IDQ回复IDQ标题,内容<br /><br />  数据库表1昄满所有范式的要求Q?br /><br />  数据库表2中存在非关键字段"标题"?内容"对关键字D?发帖ID"的部分函C赖,即不满W二范式的要求,但是q一设计q不会导致数据冗余和操作异常Q?br /><br />  数据库表3中也存在非关键字D?标题"?内容"对关键字D?回复ID"的部分函C赖,也不满W二范式的要求,但是与数据库?怼Q这一设计也不会导致数据冗余和操作异常?br /><br />  由此可以看出Qƈ不一定要满范式的要求,对于1QN关系Q当1的一边合q到N的那边后QN的那边就不再满W二范式了,但是q种设计反而比较好Q?br /><br />  对于MQN的关p,不能M一ҎN一边合q到另一边去Q这样会D不符合范式要求,同时D操作异常和数据冗余?<br />对于1Q?的关p,我们可以左边的1或者右边的1合ƈ到另一边去Q设计导致不W合范式要求Q但是ƈ不会D操作异常和数据冗余?br /><br />  l论<br /><br />  满范式要求的数据库设计是结构清晰的Q同时可避免数据冗余和操作异常。这q意味着不符合范式要求的设计一定是错误的,在数据库表中存在1Q??QN关系q种较特D的情况下,合ƈD的不W合范式要求反而是合理的?br /><br />  在我们设计数据库的时候,一定要时刻考虑范式的要求?p></p></div> <img src ="http://www.tkk7.com/huyi2006/aggbug/228904.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/huyi2006/" target="_blank">allic</a> 2008-09-14 17:12 <a href="http://www.tkk7.com/huyi2006/articles/228904.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何在mysql中创建内存表http://www.tkk7.com/huyi2006/articles/208867.htmlallicallicWed, 18 Jun 2008 06:41:00 GMThttp://www.tkk7.com/huyi2006/articles/208867.htmlhttp://www.tkk7.com/huyi2006/comments/208867.htmlhttp://www.tkk7.com/huyi2006/articles/208867.html#Feedback0http://www.tkk7.com/huyi2006/comments/commentRss/208867.htmlhttp://www.tkk7.com/huyi2006/services/trackbacks/208867.html如何创徏内存?/strong>Q?br />    创徏内存表非常的单,只需注明 ENGINE= MEMORY 卛_:
    CREATE TABLE  `tablename` ( `columnName` varchar(256) NOT NUL) ENGINE=MEMORY DEFAULT CHARSET=latin1 MAX_ROWS=100000000;

 

注意Q?br />    当内存表中的数据大于max_heap_table_size讑֮的容量大时Qmysql会{换超出的数据存储到磁盘上Q因此这是性能大打折扣了Q所以我们还需要根据我们的实际情况调整max_heap_table_sizeQ例如在.cnf文g中[mysqld]的下面加入:
        max_heap_table_size = 2048M
    另外在徏表语句中q可以通过MAX_ROWS来控制表的记录数?br />
内存表用哈希散列烦引把数据保存在内存中Q因此具有极快的速度Q适合~存中小型数据库Q但是用上受到一些限Ӟ以下是蓝草用的一些感受?br />
1、heapҎ有用Lq接是可见的Q这使得它非帔R合做缓存?br />
2、仅适合使用的场合。heap不允怋用xxxTEXT和xxxBLOB数据cdQ只允许使用=?lt;=>操作W来搜烦记录Q不允许<?gt;?lt;=?gt;=Q;不支持auto_incrementQ只允许寚wI数据列q行索引Qnot nullQ?br />注:操作W??lt;=>?说明QNULL-safe equal.q个操作W和?”操作符执行相同的比较操作,不过在两个操作码均ؓNULLӞ其所得gؓ1而不为NULLQ而当一个操作码为NULLӞ其所得gؓ0而不为NULL?br />
3、一旦服务器重启Q所有heap表数据丢失,但是heap表结构仍然存在,因ؓheap表结构是存放在实际数据库路径下的Q不会自动删除。重启之后,heap被清空Q这时候对heap的查询结果都是空的?br />
4、如果heap是复制的某数据表Q则复制之后所有主键、烦引、自增等格式不复存在,需要重新添加主键和索引Q如果需要的话?br />
5、对于重启造成的数据丢失,有以下的解决办法Q?br /> a、在M查询之前Q执行一ơ简单的查询Q判断heap表是否存在数据,如果不存在,则把数据重新写入Q或者DROP表重新复制某张表。这需要多做一ơ查询。不q可以写成include文gQ在需要用该heap表的面随时调用Q比较方ѝ?br /> b、对于需要该heap表的面Q在该页面第一ơ且仅在W一ơ查询该表时Q对数据集结果进行判断,如果l果为空Q则需要重新写入数据。这样可以节省一ơ查询?br /> c、更好的办法是在mysql每次重新启动时自动写入数据到heapQ但是需要配|服务器Q过E比较复杂,通用性受到限制?br />
6、一些预期可能用到的sql语句

//如果表存在,则删?br />DROP TABLE IF EXISTS `abc`;
//复制整张表xyz为heap表abcQ包含所有数据)
CREATE TABLE `abc` type=heap select * from `xyz`;
//d主键id
ALTER TABLE `abc` ADD PRIMARY KEY (`id`);
//d索引username
ALTER TABLE `abc` ADD INDEX `abc` (`username`);
蓝草I间



allic 2008-06-18 14:41 发表评论
]]>
php下操作sqlite的一个类http://www.tkk7.com/huyi2006/articles/203413.htmlallicallicWed, 28 May 2008 02:34:00 GMThttp://www.tkk7.com/huyi2006/articles/203413.htmlhttp://www.tkk7.com/huyi2006/comments/203413.htmlhttp://www.tkk7.com/huyi2006/articles/203413.html#Feedback0http://www.tkk7.com/huyi2006/comments/commentRss/203413.htmlhttp://www.tkk7.com/huyi2006/services/trackbacks/203413.htmlclass Sqlite {
var $link;
var $querynum = 0;

/*q接Sqlite数据库,参数Qdbname->数据库名?/
function Open($dbname) {
if(!($this->link = @sqlite_open($dbname))) {
$this->halt('Can not Open to Sqlite');
}
}

/*执行sql语句Q返回对应的l果标识*/
function Query($sql) {
$this->querynum++;
if($query = @sqlite_query($this->link, $sql)) {
return $query;
} else {
$this->halt('Sqlite Query Error', $sql);
}
}

/*执行Insert Into语句Qƈq回最后的insert操作所产生的自动增长的id*/
function Insert($table, $iarr) {
$value = $this->InsertSql($iarr);
$this->Query('INSERT INTO "' . $table . '" ' . $value);
return sqlite_last_insert_rowid($this->link);
}

/*执行Update语句Qƈq回最后的update操作所影响的行?/
function Update($table, $uarr, $condition = '') {
$value = $this->UpdateSql($uarr);
if ($condition) {
$condition = ' WHERE ' . $condition;
}
$this->Query('UPDATE "' . $table . '"' . ' SET ' . $value . $condition);
return sqlite_changes($this->link);
}

/*执行Delete语句Qƈq回最后的Delete操作所影响的行?/
function Delete($table, $condition = '') {
if ($condition) {
$condition = ' WHERE ' . $condition;
}
$this->Query('DELETE "' . $table . '"' . $condition);
return sqlite_changes($this->link);
}

/*字W{为可以安全保存的sqlite|比如a'a转ؓa''a*/
/*
function EnCode($str) {
if (strpos($str, "\0") === false) {
if (strpos($str, '\'') === false) {
return $str;
} else {
return str_replace('\'', '\'\'', $str);
}
} else {
$str = str_replace("\0", '', $str);
if (strpos($str, '\'') === false) {
return $str;
} else {
return str_replace('\'', '\'\'', $str);
}
}
}
*/
function EnCode($str) {
return sqlite_escape_string($str);
}

/*可以安全保存的sqliteD{为正常的|比如a''a转ؓa'a*/
function DeCode($str) {
if (strpos($str, '\'\'') === false) {
return $str;
} else {
return str_replace('\'\'', '\'', $str);
}
}

/*对应的列和值生成对应的insert语句Q如Qarray('id' => 1, 'name' => 'name')q回("id", "name") VALUES (1, 'name')*/
function InsertSql($iarr) {
if (is_array($iarr)) {
$fstr = '';
$vstr = '';
foreach ($iarr as $key => $val) {
$fstr .= '"' . $key . '", ';
$vstr .= '\'' . $val . '\', ';
}
if ($fstr) {
$fstr = '(' . substr($fstr, 0, -2) . ')';
$vstr = '(' . substr($vstr, 0, -2) . ')';
return $fstr . ' VALUES ' . $vstr;
} else {
return '';
}
} else {
return '';
}
}

/*对应的列和值生成对应的insert语句Q如Qarray('id' => 1, 'name' => 'name')q回"id" = 1, "name" = 'name'*/
function UpdateSql($uarr) {
if (is_array($uarr)) {
$ustr = '';
foreach ($uarr as $key => $val) {
$ustr .= '"' . $key . '" = \'' . $val . '\', ';
}
if ($ustr) {
return substr($ustr, 0, -2);
} else {
return '';
}
} else {
return '';
}
}

/*q回对应的查询标识的l果的一?/
function GetRow($query, $result_type = SQLITE_ASSOC) {
return sqlite_fetch_array($query, $result_type);
}

/*清空查询l果所占用的内存资?/
function Clear($query) {
$query = null;
return true;
}

/*关闭数据?/
function Close() {
return sqlite_close($this->link);
}

function halt($message = '', $sql = '') {
$ei = sqlite_last_error($this->link);
$message .= '<br />Sqlite Error: ' . $ei . ', ' . sqlite_error_string($ei);
if ($sql) {
$sql = '<br />sql:' . $sql;
}
exit('DataBase Error.<br />Message: ' . $message . $sql);
}
}



allic 2008-05-28 10:34 发表评论
]]>
关于sqlite_exec回调函数中参C递的问题http://www.tkk7.com/huyi2006/articles/199724.htmlallicallicSat, 10 May 2008 08:32:00 GMThttp://www.tkk7.com/huyi2006/articles/199724.htmlhttp://www.tkk7.com/huyi2006/comments/199724.htmlhttp://www.tkk7.com/huyi2006/articles/199724.html#Feedback0http://www.tkk7.com/huyi2006/comments/commentRss/199724.htmlhttp://www.tkk7.com/huyi2006/services/trackbacks/199724.html上一{载的文章中涉及到了如何用C来作回调函数d或写入SQLITE数据库的问题Q但其中没有关于回调函数如何作参C递的问题Q比如想要在你的主调函数中获取该变量Q就需要通过调用sqlite3_exec函数l回调函C递结构体指针Q下面我作了一例:
    
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>

struct olt_info
{
    int olt_index;
    int onu_on_line;
    int ui_port1;
    int ui_port2;
    int ui_port3;
    int ui_port4;
};

int my_callback(void * olt_temp, int argc, char * value[], char * name[])
{
    int i;
    struct olt_info * pdata = NULL;

    pdata = (struct olt_info *)olt_temp;
   
    puts("Here below is the code line:\n");
    for (i = 0; i < argc; i++)
    {
        printf("%s == %s\n", name[i], value[i]);
    }
    puts("Code line over.\n");
   
    pdata->olt_index = (int)atoi(value[0]);
    pdata->onu_on_line = (int)atoi(value[1]);
    pdata->ui_port1 = (int)atoi(value[2]);
    pdata->ui_port2 = (int)atoi(value[3]);
    pdata->ui_port3 = (int)atoi(value[4]);
    pdata->ui_port4 = (int)atoi(value[5]);
   
    return 0;
}

int main(int argc, char * argv[])
{
    sqlite3 * olt_db = NULL;
    int rc = 0;
    int i;
    char * err_msg = NULL;
    char temp_msg[150];
    struct olt_info * olt_temp= (struct olt_info *)malloc(sizeof(struct olt_info));   
   
    rc = sqlite3_open("olt.db", &olt_db);
    if (rc)
    {
        fprintf(stderr, "Open database error, %s\n", sqlite3_errmsg(olt_db));
        exit(1);
    }
    else
    {
        fprintf(stdout, "Open database OK.\n");
    }

    rc = sqlite3_exec(olt_db, "create table olt_tbl(olt_index integer primary key autoincrement, onu_on_line smallint, ui_port1 smallint, ui_port2 smallint, ui_port3 smallint, ui_port4 smallint);", NULL, NULL, &err_msg);

    if (rc != SQLITE_OK)
    {
        fprintf(stderr, "Create table error, %s\n", err_msg);
        exit(1);
    }
    else
    {
        fprintf(stdout, "Create table OK.\n");
    }

    for (i = 0; i < 6; i++)
    {
        sprintf(temp_msg, "insert into olt_tbl(onu_on_line, ui_port1, ui_port2, ui_port3, ui_port4) values(%d, %d, %d, %d, %d)", i * 16, i, i, i, i);
        //rc = sqlite3_exec(olt_db, "insert into olt_tbl(onu_on_line, ui_port1, ui_port2, ui_port3, ui_port4) values(32, 1, 1, 1, 1);", NULL, NULL, &err_msg);
        rc = sqlite3_exec(olt_db, temp_msg, NULL, NULL, &err_msg);
    }

    if (rc != SQLITE_OK)
    {
        fprintf(stderr, "Insert items failure, %s\n", err_msg);
    }
    else
    {
        fprintf(stdout, "Insert items OK.\n");
    }

    rc = sqlite3_exec(olt_db, "select * from olt_tbl where olt_index==4;", my_callback, olt_temp, &err_msg);
    if (rc != SQLITE_OK)
    {
        fprintf(stderr, "Selete from olt_tbl failure, %s\n", err_msg);
        exit(1);
    }
    else
    {
        fprintf(stdout, "Excute sql OK.\n");
    }

     printf("%d-%d-%d-%d-%d-%d\n", olt_temp->olt_index, olt_temp->onu_on_line,olt_temp->ui_port1,olt_temp->ui_port2,olt_temp->ui_port3,olt_temp->ui_port4);

    free(olt_temp);

    sqlite3_close(olt_db);
    return 0;
}

其中my_callback(void * pdata, int argc, char * value[], char *name[])为回调函敎ͼ切记回调函数只能按照q种格式来定义参敎ͼ
    W一个参Cؓ你的主调函数传递过来的指针Q?br />    W二个参Cؓ变量的个敎ͼ
    W三个ؓ变量的|
    W四个ؓ变量的名Uͼ
    有两个问题需要注意:
        一、这里面参数都是字符串类型,Ҏ您的需要作出强制类型{换即可?br />        二、第一个参Cؓvoid *cdQ需要在你的回调函数里强制{换成需要的cd?br /> 


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1914908

 



allic 2008-05-10 16:32 发表评论
]]>
在VC6.0中用sqlite数据?/title><link>http://www.tkk7.com/huyi2006/articles/199720.html</link><dc:creator>allic</dc:creator><author>allic</author><pubDate>Sat, 10 May 2008 08:21:00 GMT</pubDate><guid>http://www.tkk7.com/huyi2006/articles/199720.html</guid><wfw:comment>http://www.tkk7.com/huyi2006/comments/199720.html</wfw:comment><comments>http://www.tkk7.com/huyi2006/articles/199720.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/huyi2006/comments/commentRss/199720.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/huyi2006/services/trackbacks/199720.html</trackback:ping><description><![CDATA[ <p>在sqlite.org 上下载得到Windows版本的sqlite,它是以sqlitedll.zip文g提供?其中有sqlite3.def?sqlite3.dll文g,当然可以直接通过LoadLibrary{WIN32API来操作dll,查找其中包含的函?q用这些函?但是一般都 不这么做,原因很简?q样太麻?所以一般先使用LIB命o生成用于链接的lib,然后把sqlite头文件sqlite3.h包含q程序中,<br />q样直接调用 sqlite的API方便多?当然sqlite3.h文g得从sqlite源代码(以sqlite-source-3_3_4.zip文g提供Q中搞到,在源码中sqlite3.hq个头文件是sqlite3.h.in存在的,解压出来Ҏsqlite.h可以了. <br />使用VC++的LIB命o有以下步骤: <br />Q?Q设|VC98中LIB.exe所在的路径Q?<br />D:\MyDoc\db\capi>set path=%path%;"D:\Program Files\Microsoft Visual Studio\VC98\Bin" <br />(2)生成SQLite的lib文gQ?<br />D:\MyDoc\db\capi>LIB /DEF:SQLITE3.DEF /MACHINE:IX86 </p> <p>Microsoft (R) Library Manager Version 6.00.8168 Copyright (C) Microsoft Corp 1992-1998. All rights reserved. Creating library SQLITE.lib and object SQLITE.exp <br />  q样成功地创徏了在WIN32E序中访问sqlite所需要的?可以用于链接WIN32E序. <br />    到此所有用sqlite的准备工作已告罄.现在在MSVC6中新Z个Win32 Console Application工程,把sqlite.dll,sqlite.h和sqlite.lib文g复制到工E文件夹?把sqlite.h文g加入到项 目中,然后在Project Setting的Link中的对象库模块中增加sqlite.lib文g. 或者project->add to project->filesQ选择q个lib文g<br />然后修改加入如下代码卛_: </p> <p>#include <IOSTREAM><br />#include <STRING><br />#include <SSTREAM><br />#include <stdio.h><br />#include "sqlite3.h"</p> <p>using namespace std;</p> <p>sqlite3* pDB;</p> <p>int createTable()<br />{<br />  char* errMsg;<br />  std::string dropTab="drop table test_tab;";<br />  string strSQL= "create table test_tab (f1 int, f2 long, f3 varchar(20));";<br />  int res = sqlite3_exec(pDB,dropTab.c_str(),0,0, &errMsg);<br />  if (res != SQLITE_OK)<br />  {<br />   std::cout << "执行SQL 出错." << errMsg << std::endl;<br />   //return -1;<br />  } </p> <p>  res = sqlite3_exec(pDB,strSQL.c_str(),0,0, &errMsg);</p> <p>  if (res != SQLITE_OK)<br />  {<br />    std::cout << "执行创徏table的SQL 出错." << errMsg << std::endl;<br />    return -1;<br />  }<br />  else<br />  {<br />      std::cout << "创徏table的SQL成功执行."<< std::endl;<br />  }</p> <p>  return 0;<br />}</p> <p>int insert1()<br />{<br />  char* errMsg;</p> <p>  int res = sqlite3_exec(pDB,"begin transaction;",0,0, &errMsg);</p> <p>  for (int i= 1; i < 100; ++i)<br />  {<br />    std::stringstream strsql;<br />    strsql << "insert into test_tab  values(";<br />    strsql  << i << ","<< (i+10) <<",'huyi'"<< ");";<br />    std::string str = strsql.str();<br />    cout << str <<endl;<br />    res = sqlite3_exec(pDB,str.c_str(),0,0, &errMsg);<br />    if (res != SQLITE_OK)<br />    {<br />      std::cout << "执行SQL 出错." << errMsg << std::endl;<br />      return -1;<br />    }<br />  }<br />  res = sqlite3_exec(pDB,"commit transaction;",0,0, &errMsg);<br />  std::cout << "SQL成功执行."<< std::endl;<br />  return 0; <br />}</p> <p> <br />int select1()<br />{<br />  char* errMsg;<br /> int nrow = 0, ncolumn = 0;<br /> char **azResult; //二维数组存放l果<br />  string strSQL= "select * from test_tab;";<br />     /*<br />  int res = sqlite3_exec(pDB,strSQL.c_str(),0,0, &errMsg);</p> <p>  if (res != SQLITE_OK)<br />  {<br />    std::cout << "执行SQL 出错." << errMsg << std::endl;<br />    return -1;<br />  }<br />  else<br />  {<br />       std::cout << "SQL成功执行."<< std::endl;<br />  }<br />  */<br />  sqlite3_get_table(pDB, strSQL.c_str(), &azResult, &nrow, &ncolumn, &errMsg);<br />     int i = 0;<br />  for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ )<br />  {<br />   if (i>0 && i%ncolumn==0)<br />    printf("\n");<br />      printf( "%s ",azResult[i]);<br />  }<br />         printf("\n");<br />  //释放?azResult 的内存空?br />  sqlite3_free_table( azResult );<br />  sqlite3_close(pDB); //关闭数据?br />  return 0;<br />}</p> <p>int main(int argc, char* argv[])<br />{<br />  if (argc < 2)<br />  {<br />    std::cout << "误入命令行参数Qsqlite数据库名." << std::endl;<br />    return 0;<br />  }</p> <p>  int res = sqlite3_open(argv[1], &pDB);</p> <p>  if( res ){<br />    std::cout << "Can't open database: "<< sqlite3_errmsg(pDB);<br />    sqlite3_close(pDB);<br />    return -1;<br />  }<br />  res = createTable();<br />  if (res != 0)<br />  {<br />      return 0;<br />  }<br />  res = insert1();<br />  if (res != 0)<br />  {<br />      return 0;<br />  }<br />  select1();<br />   return 0;<br />}<br /></p> <img src ="http://www.tkk7.com/huyi2006/aggbug/199720.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/huyi2006/" target="_blank">allic</a> 2008-05-10 16:21 <a href="http://www.tkk7.com/huyi2006/articles/199720.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库设计指?/title><link>http://www.tkk7.com/huyi2006/articles/197518.html</link><dc:creator>allic</dc:creator><author>allic</author><pubDate>Wed, 30 Apr 2008 06:07:00 GMT</pubDate><guid>http://www.tkk7.com/huyi2006/articles/197518.html</guid><wfw:comment>http://www.tkk7.com/huyi2006/comments/197518.html</wfw:comment><comments>http://www.tkk7.com/huyi2006/articles/197518.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/huyi2006/comments/commentRss/197518.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/huyi2006/services/trackbacks/197518.html</trackback:ping><description><![CDATA[ <br /> <font style="BACKGROUND-COLOR: #ffffff" color="#808080">如果把企业的数据比做生命所必需的血Ԍ那么数据库的设计是应用中最重要的一部分。有x?br />库设计的材料汗牛充栋Q大学学位课E里也有专门的讲q。不q,如我们反复的那P再好?br />老师也比不过l验的教诌Ӏ所以我们最q找了些Ҏ据库设计颇有造诣的专业h士给大家传授一些设<br />计数据库?u><strong>技?/strong></u>和经验。我们的~辑从收到的130 个反馈中_N了其中?0 个最x巧,q把q些<br />技巧编写成了本文,Z方便索引其内容划分ؓ5 个部分:<br />W? 部分?设计数据库之?br />q一部分|列?2 个基本技巧,包括命名规范和明业务需求等?br />W? 部分?设计数据库表<br />d24 个指南性技巧,늛表内字段设计以及应该避免的常见问题等?br />W? 部分?选择?br />怎么选择键呢Q这里有10 个技巧专门涉及系l生成的主键的正用法,q有何时以及如何索引字段<br />以获得最x能{?br />W?4 部分 ?保证数据完整?br />讨论如何保持数据库的清晰和健壮,如何把有x据降低到最程度?br />W? 部分?各种技?br />不包括在以上4 个部分中的其他技巧,五花八门Q有 了它们希望你的数据库开发工作会更轻松一些?br />Page 2 © CNET Networks Inc. 2002<br />www.zdnet.com.cn/developer<br /><strong>W? 部分?设计数据库之?/strong><br />1. 考察现有环境<br />在设计一个新数据库时Q你不但应该仔细研究业务需求而且q要考察现有的系l。大多数数据?br />目都不是从头开始徏立的Q通常Q机构内M存在用来满特定需求的现有pȝQ可能没有实<br />现自动计)。显Ӟ现有pȝq不完美Q否则你׃必再建立新系l了。但是对旧系l的研究<br />可以让你发现一些可能会忽略的细微问题。一般来_考察现有pȝ对你l对有好处?br />?Lamont Adams<br />我曾l接手过一个ؓ地区q输公司开发的数据库项目,zM难,用的是Access 数据库。我讄<br />了一些项目设计参敎ͼ而且同客户一道对q些参数q行了评伎ͼ事先q查看了开发环境下所采取<br />的工作模式,{到最后部|应用的时候,只见l端上出了几个提C符然后立马在我面前辫?br />了!抓x腮的折腾了好几个时Q我才意识到Q原来这家公司的<u><strong>|络</strong></u>上跑着两个数据库应用,<br />而对|络的访问需要明和严格的用户帐号及其访问权限。明白了q一点,问题q刃而解Q只需<br />采用客户的系l即可。这个项目给我的教训是Q记住,假如你在诸如Access 或者Interbase q?br />cdq境下开发应用程序,一定要从表面下手深入系l内部搞清楚你面临的环境到底是怎么?br />事?br />?kg<br />2. <strong>定义标准?u>对象</u>命名规范</strong><br />一定要定义数据库对象的命名规范 。对数据库表来说Q从目一开始就要确定表名是采用复数q?br />是单数Ş式。此外还要给表的别名定义单规则(比方_如果表名是一个单词,别名取单词<br />的前4 个字母;如果表名是两个单词,各取两个单词的前两个字母组? 个字母长的别名;?br />果表的名字由3 个单词组成,你不妨从头两个单词中各取一个然后从最后一个单词中再取Z?br />字母Q结果还是组? 字母长的别名Q其余依ơ类推)对工作用表来_表名可以加上前缀<br />WORK_ 后面附上采用该表的应用程序的名字。表内的列要针对键采用一整套设计规则。比如,<br />如果键是数字cdQ你可以用_NO 作ؓ后缀Q如果是字符cd则可以采?_CODE 后缀。对列名<br />应该采用标准的前~和后~。再如,假如你的表里有好多“money”字D,你不妨给每个列增?br />一个_AMT 后缀。还有,日期列最好以DATE_作ؓ名字打头?br />?richard<br />查表名、报表名和查询名之间的命名规范。你可能会很快就被这些不同的数据库要素的名称?br />p涂了。假如你坚持l一地命名这些数据库的不同组成部分,臛_你应该在q些对象名字的开?br />用table、query 或者report {前~加以区别?br />?rrydenm<br />如果采用了Microsoft AccessQ你可以?qry、rpt?tbl 和mod {符h标识对象Q比?br />tbl_EmployeesQ。我在和SQL ServerQ或者OracleQ打交道的时候还用过tbl 来烦引表Q但?br />用sp_company Q现在用sp_feft_Q标识存储过E,因ؓ在有的时候如果我发现了更好的处理?br />法往往会保存好几个拯。我在实?SQL Server 2000 时用udf_ Q或者类似的标记Q标识我~?br />写的函数?br />?Timothy J. Bruce<br />Page 3 © CNET Networks Inc. 2002<br />www.zdnet.com.cn/developer<br /><strong>3. 预先计划</strong><br />上个世纪80 q代初,我还在用资产帐目系l和System 38 q_Q那时我负责设计所有的日期<br />字段Q这样在不费什么力气的情况下将来就可以L处理2000 q问题了。许多hl我说就别去<br />解决q一问题了,因ؓ要处理v来太ȝ了(q在世h皆知的Y2K 问题之前很久了)。我回击?br />只要预先计划今后׃会遇到大ȝ。结果我只用了两周的旉把E序全部改完了。因为预?br />计划的好Q后来Y2K 问题对该pȝ的危害降C最低程度(最q听说该E序甚至C1995 q都<br />q运行在AS/400 pȝ上,唯一出现的小问题是从代码中删除注释费了点工夫Q?br />?generalist<br /><strong>4. 获取数据模式资源手册</strong><br />正在LCZ模式的h可以阅读?数据模式资源手册 》一书,该书由Len Silverston、W. H.<br />Inmon 和Kent Graziano ~写Q是一本值得拥有的最x据徏模图书。该书包括的章节늛多种<br />数据领域Q比如h员、机构和工作效能{?br />?minstrelmike<br /><strong>5. 畅想未来Q但不可忘了q去的教?/strong><br />我发现询问用户如何看待未来需求变化非常有用。这样做可以辑ֈ两个目的Q首先,你可以清?br />C解应用设计在哪个地方应该更具灉|性以及如何避免性能瓉Q其ơ,你知道发生事先没?br />定的需求变更时用户和你一h到吃惊?br />?chrisdk<br />一定要Cq去的经验教训!我们开发h员还应该通过分n自己的体会和l验互相帮助。即使用<br />戯Z们再也不需要什么支持了Q我们也应该对他们进行这斚w的教Ԍ我们都曾l面临过q?br />L时刻“当初要是这么做了该多好⋯⋯”?br />?dhattrem<br /><strong>6. 在物理实践之前进行逻辑设计</strong><br />在深入物理设计之前要先进行逻辑设计。随着大量?CASE 工具不断涌现出来Q你的设计也可以<br />辑ֈ相当高的逻辑水准Q你通常可以从整体上更好C解数据库设计所需要的Ҏ面面?br />?chardove<br /><strong>7. 了解你的业务</strong><br />在你癑ֈ癑֜定pȝ从客戯度满_需求之前不要在你的ERQ实体关p)模式中加入哪?br />一个数据表Q怎么Q你q没有模式?那请你参看技?Q。了解你的企业业务可以在以后的开?br />阶段节约大量的时间。一旦你明确了业务需求,你就可以自己做出许多决策 了?br />?rangel<br />一旦你认ؓ你已l明?了业务内容,你最好同客户q行一ơ系l的交流。采用客L术语q且?br />他们解释你所惛_的和你所听到的。同时还应该用可能、将会和必须{词汇表辑ևpȝ的关pd<br />数。这样你可以让你的客户U正你自q理解然后做好下一步的ER 设计?br />?teburlew<br />Page 4 © CNET Networks Inc. 2002<br />www.zdnet.com.cn/developer<br /><strong>8. 创徏数据字典和ER 图表</strong><br />一定要q旉创徏ER 图表和数据字典。其中至应该包含每个字D늚数据cd和在每个表内<br />的主外键。创建ER 图表和数据字典确实有点费时但对其他开发h员要了解整个设计却是完全?br />要的。越早创能有助于避免今后面的可能؜乱,从而可以让M了解数据库的人都明确?br />何从数据库中获得数据?br />?bgumbert<br />有一份诸如ER 图表{最新文档其重要性如何强调都不过分,q对表明表之间关pd有用Q而数<br />据字典则说明了每个字D늚用途以及Q何可能存在的别名。对SQL 表达式的文档化来说这是完<br />全必要的?br />?vanduin.chris.cj<br /><strong>9. 创徏模式</strong><br />一张图表胜q千a万语Q开发h员不仅要阅读和实现它Q而且q要用它来帮助自己和用户对话?br />模式有助于提高协作效能,q样在先期的数据库设计中几乎不可能出现大的问题。模式不必弄?br />很复杂;甚至可以单到手写在一张纸上就可以了。只是要保证其上的逻辑关系今后能生效<br />益?br />?Dana Daigle<br /><strong>10. 从输入输Z?/strong><br />在定义数据库表和字段需求(输入Q时Q首先应查现有的或者已l设计出的报表、查询和视图<br />Q输出)以决定ؓ了支持这些输出哪些是必要的表和字DcD个简单的例子Q假如客户需要一?br />报表按照邮政~码排序、分D和求和Q你要保证其中包括了单独的邮政编码字D而不要把邮政~?br />码糅q地址字段里?br />?peter.marshall<br /></font> <font style="BACKGROUND-COLOR: #ffffff"> <font color="#808080"> <strong>11. 报表技?br /></strong>要了解用户通常是如何报告数据的Q批处理q是在线提交报表Q时间间隔是每天、每周、每月?br />每个季度q是每年Q如果需要的话还可以考虑创徏ȝ表。系l生成的主键在报表中很难理?br />用户在具有系l生成主键的表内用副键进行检索往往会返回许多重复数据。这L索性能比较<br />低而且Ҏ引v混ؕ?br />?kol<br /><strong>12. 理解客户需?/strong><br />看v来这应该是显而易见的事,但需求就是来自客Pq里要从内部和外部客L角度考虑Q?br />不要依赖用户写下来的需求,真正的需求在客户的脑袋里。你要让客户解释光求,而且随着开<br />发的l箋Q还要经常询问客户保证其需求仍然在开发的目的之中。一个不变的真理是:“只有我<br />看见了我才知道我惌的是什么”必然会D大量的返工,因ؓ数据库没有达到客户从来没有写<br />下来的需求标准。而更p的是你对他们需求的解释只属于你自己Q而且可能是完全错误的?br />?kgilson<br />Page 5 © CNET Networks Inc. 2002<br />www.zdnet.com.cn/developer<br />W? 部分?设计表和字段<br />1. 查各U变?br />我在设计数据库的时候会考虑到哪些数据字D将来可能会发生变更。比方说Q姓氏就是如此(?br />意是西方人的姓氏Q比如女性结婚后从夫姓等Q。所以,在徏立系l存储客户信息时Q我們֐?br />在单独的一个数据表里存储姓氏字D,而且q附加v始日和终止日{字D,q样可以跟t这一<br />数据条目的变化?br />?Shropshire Lad<br />2. 采用有意义的字段?br />有一回我参加开发过一个项目,其中有从其他E序员那里承的E序Q那个程序员喜欢用屏q上<br />昄数据指示用语命名字段Q这也不赖,但不q的是,她还喜欢用一些奇怪的命名法,其命名采<br />用了匈牙利命名和控制序号的组合Ş式,比如cbo1?txt2、txt2_b {等?br />除非你在使用只面向你的羃写字D名的系l,否则请尽可能地把字段描述的清楚些。当Ӟ也别<br />做过头了Q比如Customer_Shipping_Address_Street_Line_1 I 虽然很富有说明性,但没人愿?br />键入q么长的名字Q具体尺度就在你的把握中?br />?Lamont Adams<br />3. 采用前缀命名<br />如果多个表里有好多同一cd的字D(比如FirstNameQ,你不妨用特定表的前缀Q比?br />CusLastNameQ来帮助你标识字Dc?br />?notoriousDOG<br />时效性数据应包括“最q更新日?旉”字Dc时间标记对查找数据问题的原因、按日期重新?br />?重蝲数据和清除旧数据特别有用?br />?kol<br />5. 标准化和数据驱动<br />数据的标准化不仅方便了自p且也方便了其他人。比方说Q假如你的用L面要讉K外部数据<br />源(文g、XML 文档、其他数据库{)Q你不妨把相应的q接和\径信息存储在用户界面支持?br />里。还有,如果用户界面执行工作之cȝdQ发送邮件、打CW、修改记录状态等Q,?br />么生工作流的数据也可以存放在数据库里。预先安排总需要付出努力,但如果这些过E采用数<br />据驱动而非编码的方式Q那么策略变更和l护都会方便得多。事实上Q如果过E是数据驱动<br />的,你就可以把相当大的责Ll用Pqhl护自己的工作流q程?br />?tduvall<br />6. 标准化不能过?br />寚w些不熟悉标准化一词(normalization Q的言Q标准化可以保证表内的字D都是最基础?br />要素Q而这一措施有助于消除数据库中的数据冗余。标准化有好几种形式Q但Third Normal<br />FormQ?NFQ通常被认为在性能、扩展性和数据完整性方面达C最好^衡。简单来_3NF ?br />定:<br />Page 6 © CNET Networks Inc. 2002<br />www.zdnet.com.cn/developer<br />· 表内的每一个值都只能被表达一ơ?br />· 表内的每一行都应该被唯一的标识(有唯一键)?br />· 表内不应该存储依赖于其他键的非键信息?br />遵守3NF 标准的数据库h以下特点Q有一l表专门存放通过键连接v来的兌数据。比方说Q?br />某个存放客户及其有关定单?NF 数据库就可能有两个表QCustomer 和Order。Order 表不?br />含定单关联客LM信息Q但表内会存放一个键|该键指向Customer 表里包含该客户信?br />的那一行?br />更高层次的标准化也有Q但更标准是否就一定更好呢Q答案是不一定。事实上Q对某些目?br />_甚至p3NF 都可能给数据库引入太高的复杂性?br />?Lamont Adams<br />Z效率的缘故,对表不进行标准化有时也是必要的,q样的例子很多。曾l有个开发胦务分?br />软g的活是用非标准化表把查询时间从q_40 U降低到了两U左叟뀂虽然我不得不这么做Q?br />但我l不把数据表的非标准化当作当然的设计理念。而具体的操作不过是一U派生。所以如果表<br />Z问题重新产生非标准化的表是完全可能的?br />?epepke<br />7. Microsoft Access 报表技?br />如果你正在用Microsoft AccessQ你可以用对用户友好的字D名来代替编L名称Q比如用<br />Customer Name 代替txtCNaM。这P当你用向导程序创单和报表Ӟ其名字会让那些不<br />是程序员的h更容易阅诅R?br />?jwoodruf<br />8. 不活跃或者不采用的指C符<br />增加一个字D表C所在记录是否在业务中不再活跃挺有用的。不是客户、员工还是其他什?br />人,q样做都能有助于再运行查询的时候过滤活跃或者不z跃状态。同时还消除了新用户在采?br />数据时所面的一些问题,比如Q某些记录可能不再ؓ他们所用,再删除的时候可以vC??br />防范作用?br />?theoden<br />9. 使用角色实体定义属于某类别的?br />在需要对属于特定cd或者具有特定角色的事物做定义时Q可以用角色实体来创建特定的旉?br />联关p,从而可以实现自我文档化?br />q里的含义不是让PERSON 实体带有Title 字段Q而是_Z么不用PERSON 实体?br />PERSON_TYPE 实体来描qCh员呢Q然后,比方_?John Smith, Engineer 提升为John<br />Smith, Director 乃至最后爬到John Smith, CIO 的高位,而所有你要做的不q是改变两个?br />PERSON 和PERSON_TYPE 之间关系的键|同时增加一个日?旉字段来知道变化是何时<br />发生的。这P你的PERSON_TYPE 表就包含了所有PERSON 的可能类型,比如Associate?br />Engineer、Director、CIO 或者CEO {?br />q有个替代办法就是改变PERSON 记录来反映新头衔的变化,不过q样一来在旉上无法跟t?br />个h所处位|的具体旉?br />Page 7 © CNET Networks Inc. 2002<br />www.zdnet.com.cn/developer<br />?teburlew<br />10. 采用常用实体命名机构数据<br />l织数据的最单办法就是采用常用名字,比如QPERSON、ORGANIZATION、ADDRESS ?br />PHONE {等。当你把q些常用的一般名字组合v来或者创建特定的相应副实体时Q你得C<br />自己用的Ҏ版本。开始的时候采用一般术语的主要原因在于所有的具体用户都能Ҏ象事物具<br />体化?br />有了q些抽象表示Q你可以在W? U标识中采用自己的特D名Uͼ比如QPERSON 可能?br />Employee、Spouse、Patient、Client、Customer、Vendor 或者Teacher {。同LQ?br />ORGANIZATION 也可能是MyCompany、MyDepartment、Competitor、Hospital?br />Warehouse、Government {。最后ADDRESS 可以具体为Site、Location、Home、Work?br />Client、Vendor、Corporate 和FieldOffice {?br />采用一般抽象术语来标识“事物”的cd可以让你在关联数据以满业务要求斚w获得巨大的灵<br />zL,同时q样做还可以显著降低数据存储所需的冗余量?br />?teburlew<br />11. 用户来自世界各地<br />在设计用到网l或者具有其他国际特性的数据库时Q一定要C大多数国安有不同的字段?br />式,比如邮政~码{,有些国家Q比如新西兰没有邮政编码一说?br />?billh<br />12. 数据重复需要采用分立的数据?br />如果你发现自己在重复输入数据Q请创徏新表和新的关pR?br />?Alan Rash<br />13. 每个表中都应该添加的3 个有用的字段<br />· dRecordCreationDateQ在VB 下默认是Now()Q而在SQL Server 下默认ؓGETDATE()<br />· sRecordCreatorQ在SQL Server 下默认ؓNOT NULL DEFAULT USER<br />· nRecordVersionQ记录的版本标记Q有助于准确说明记录中出现null 数据或者丢失数据的?br />?br />?Peter Ritchie<br />14. 对地址和电话采用多个字D?br />描述街道地址q短一行记录是不够的。Address_Line1、Address_Line2 和Address_Line3 ?br />以提供更大的灉|性。还有,电话L和邮件地址最好拥有自q数据表,光h自n的类?br />和标记类别?br />?dwnerd<br />q分标准化可要小心,q样做可能会D性能上出现问题。虽然地址和电话表分离通常可以辑ֈ<br />最佳状态,但是如果需要经常访问这cM息,或许在其父表中存䏀首选”信息(比如<br />Customer {)更ؓ妥当些。非标准化和加速访问之间的妥协是有一定意义的?br />?dhattrem<br />Page 8 © CNET Networks Inc. 2002<br />www.zdnet.com.cn/developer<br />15. 使用多个名称字段<br />我觉得很吃惊Q许多h在数据库里就l?name 留一个字Dc我觉得只有刚入门的开发h员才会这<br />么做Q但实际上网上这U做法非常普遍。我应该把姓氏和名字当作两个字段来处理,然后?br />查询的时候再把他们组合v来?br />?klempan<br />Klempan 不是唯一一个注意到使用单个name 字段的hQ要把这U情况变得对用户更ؓ友好有好<br />些方法。我最常用的是在同一表中创徏一个计列Q通过它可以自动地q接标准化后的字D,q?br />h据变动的时候它也跟着变。不q,q样做在采用建模软g时得很机灉|行。MQ采用连?br />字段的方式可以有效的隔离用户应用和开发h员界面?br />?damon<br />16. 提防大小写؜用的对象名和Ҏ字符<br />q去最令我恼火的事情之一是数据库里有大写L的对象名Q比如CustomerData。这一?br />题从Access 到Oracle 数据库都存在。我不喜Ƣ采用这U大写L的对象命名方法,l果q不<br />得不手工修改名字。想想看Q这U数据库/应用E序能؜到采用更强大数据库的那一天吗Q采用全<br />部大写而且包含下划W的名字h更好的可L(CUSTOMER_DATAQ,l对不要在对象名?br />字符之间留空根{?br />?bfren<br />17. 心保留?br />要保证你的字D名没有和保留词、数据库pȝ或者常用访问方法冲H,比如Q最q我~写的一?br />ODBC q接E序里有个表Q其中就用了DESC 作ؓ说明字段名。后果可惌知QDESC ?br />DESCENDING ~写后的保留词。表里的一个SELECT *语句倒是能用Q但我得到的却是一大堆<br />毫无用处的信息?br />?Daniel Jordan<br />18. 保持字段名和cd的一致?br />在命名字Dƈ为其指定数据cd的时候一定要保证一致性。假如字D在某个表中叫做<br />“agreement_number”,你就别在另一个表里把名字Ҏ“ref1”。假如数据类型在一个表?br />是整敎ͼ那在另一个表里可别变成字符型了。记住,你干完自qzMQ其他hq要用你的数<br />据库呢?br />?setanta<br />19. 仔细选择数字cd<br />在SQL 中用smallint 和tinyint cd要特别小心,比如Q假如你想看看月销售总额Q你的总额?br />D늱型是smallintQ那么,如果总额过?32,767 你就不能q行计算操作了?br />?egermain<br />20. 删除标记<br />在表中包含一个“删除标记”字D,q样可以把行标Cؓ删除。在关系数据库里不要单独删除<br />某一行;最好采用清除数据程序而且要仔l维护烦引整体性?br />?kol<br />Page 9 © CNET Networks Inc. 2002<br />www.zdnet.com.cn/developer<br />21. 避免使用触发?br />触发器的功能通常可以用其他方式实现。在调试E序时触发器可能成ؓq扰。假如你实需要采<br />用触发器Q你最好集中对它文档化?br />?kol<br />22. 包含版本机制<br />你在数据库中引入版本控制机制来确定用中的数据库的版本。无论如何你都要实现q一?br />求。时间一长,用户的需求L会改变的。最l可能会要求修改数据库结构。虽然你可以通过<br />查新字段或者烦引来定数据库结构的版本Q但我发现把版本信息直接存放到数据库中不更ؓ?br />便吗Q?br />?Richard Foster<br />23. l文本字D늕余?br />ID cd的文本字D,比如客户ID 或定单号{等都应该设|得比一般想象更大,因ؓ旉不长?br />多半׃因ؓ要添加额外的字符而难堪不巌Ӏ比方说Q假设你的客户ID ?0 位数ѝ那你应?br />把数据库表字D늚长度设ؓ12 或?3 个字W长。这浪费空间吗Q是有一点,但也没你惌?br />那么多:一个字D加? 个字W在? 百万条记录,再加上一点烦引的情况下才不过让整个数?br />库多占据3MB 的空间。但q额外占据的I间却无需来重构整个数据库就可以实现数据库规?br />的增长了?br />?tlundin<br />24. 列命名技?br />我们发现Q假如你l每个表的列名都采用l一的前~Q那么在~写SQL 表达式的时候会得到?br />大的化。这样做也确实有~点Q比如破坏了自动表连接工L作用Q后者把公共列名同某些数<br />据库联系hQ不q就q这些工h时不也连接错误嘛。D个简单的例子Q假设有两个表:<br />Customer 和Order。Customer 表的前缀是cu_Q所以该表内的子D名如下Qcu_name_id?br />cu_surname、cu_initials 和cu_address {。Order 表的前缀是or_Q所以子D名是:<br />or_order_id、or_cust_name_id、or_quantity 和or_descrīption {?br />q样从数据库中选出全部数据的SQL 语句可以写成如下所C:<br />Select * from Customer, Order<br />Where cu_surname = "MYNAME"<br />and cu_name_id = or_cust_name_id<br />and or_quantity = 1;<br />在没有这些前~的情况下则写成这个样子:<br />Select * from Customer, Order<br />Where Customer.surname = "MYNAME"<br />and Customer.name_id = Order.cust_name_id<br />and Order.quantity = 1<br />W? 个SQL 语句没少键入多少字符。但如果查询涉及? 个表乃至更多的列你就知道q个技?br />多有用了?br />?Bryce Stenberg<br />Page 10 © CNET Networks Inc. 2002<br />www.zdnet.com.cn/developer<br />W? 部分?选择键和索引<br />1. 数据采掘要预先计?br />我所在的市场部门一度要处理8 万多份联pL式,同时填写每个客户的必要数据(q绝对不是小<br />z)。我从中q要定Zl客户作为市场目标。当我从最开始设计表和字D늚时候,我试图不<br />在主索引里增加太多的字段以便加快数据库的q行速度。然后我意识到特定的l查询和信息采掘<br />既不准确速度也不快。结果只好在ȝ引中重徏而且合ƈ了数据字Dc我发现有一个指C划相<br />当关键——当我想创徏pȝcd查找时ؓ什么要采用L作ؓȝ引字D呢Q我可以用传真号?br />q行索,但是它几乎就象系l类型一样对我来说ƈ不重要。采用后者作Z字段Q数据库更新<br />后重新烦引和索就快多了?br />?hscovell<br />可操作数据仓库(ODSQ和数据仓库QDWQ这两种环境下的数据索引是有差别的。在DW 环境<br />下,你要考虑销售部门是如何l织销售活动的。他们ƈ不是数据库管理员Q但是他们确定表内的<br />键信息。这里设计h员或者数据库工作人员应该分析数据库结构从而确定出性能和正输Z?br />的最x件?br />?teburlew<br />2. 使用pȝ生成的主?br />q一天类同技?Q但我觉得有必要在这里重复提醒大家。假如你L在设计数据库的时候采?br />pȝ生成的键作ؓ主键Q那么你实际控制了数据库的烦引完整性。这P数据库和非h工机制就<br />有效地控制了对存储数据中每一行的讉K?br />采用pȝ生成键作Z键还有一个优点:当你拥有一致的键结构时Q找到逻辑~陷很容易?br />?teburlew<br />3. 分解字段用于索引<br />Z分离命名字段和包含字D以支持用户定义的报表,误虑分解其他字段Q甚至主键)为其l?br />成要素以便用户可以对其进行烦引。烦引将加快SQL 和报表生成器脚本的执行速度。比方说Q?br />我通常在必M用SQL LIKE 表达式的情况下创建报表,因ؓ case number 字段无法分解?br />year、serial number、case type 和defendant code {要素。性能也会变坏。假如年度和cd?br />D可以分解ؓ索引字段那么q些报表q行h׃快多了?br />?rdelval<br />4. 键设? 原则<br />· 为关联字D创建外键?br />· 所有的键都必须唯一?br />· 避免使用复合键?br />· 外键L兌唯一的键字段?br />?Peter Ritchie<br />Page 11 © CNET Networks Inc. 2002<br />www.zdnet.com.cn/developer<br />5. 别忘了烦?br />索引是从数据库中获取数据的最高效方式之一?5%的数据库性能问题都可以采用烦引技术得?br />解决。作Z条规则,我通常寚w辑主键使用唯一的成l烦引,对系l键Q作为存储过E)采用<br />唯一的非成组索引Q对M外键列采用非成组索引。不q,索引p是盐Q太多了菜就了。你<br />得考虑数据库的I间有多大,表如何进行访问,q有q些讉K是否主要用作d?br />?tduvall<br />大多数数据库都烦引自动创建的主键字段Q但是可别忘了烦引外键,它们也是l常使用的键Q比<br />如运行查询显CZ表和所有关联表的某条记录就用得上。还有,不要索引memo/note 字段Q不<br />要烦引大型字D(有很多字W)Q这样作会让索引占用太多的存储空间?br />?gbrayton<br />6. 不要索引常用的小型表<br />不要为小型数据表讄M键,假如它们l常有插入和删除操作更别这样作了。对q些插入?br />删除操作的烦引维护可能比扫描表空间消耗更多的旉?br />?kbpatel<br />7. 不要把社会保障号码(SSNQ选作?br />永远都不要用SSN 作ؓ数据库的键。除了隐U原因以外,ȝ政府来趋向于不准许把<br />SSN 用作除收入相关以外的其他目的QSSN 需要手工输入。永q不要用手工输入的键作Z<br />键,因ؓ一旦你输入错误Q你唯一能做的就是删除整个记录然后从头开始?br />?teburlew<br />上个世纪70 q代我还在读大学的时候,我记得那时SSN q曾被用做学P当然管q么做是?br />法的。而且Z也都知道q是非法的,但他们已l习惯了。后来,随着盗取w䆾犯罪案g的增<br />加,我现在的大学校园正痛苦地从一大摊子数据中把SSN 删除?br />?generalist<br />8. 不要用用L?br />在确定采用什么字D作的键的时候,可一定要心用户要~辑的字Dc通常的情况下不要<br />选择用户可编辑的字段作ؓ键。这样做会迫使你采取以下两个措施Q?br />· 在创录之后对用户~辑字段的行为施加限制。假如你q么做了Q你可能会发C的应用程<br />序在商务需求突然发生变化,而用户需要编辑那些不可编辑的字段时缺乏够的灉|性。当?br />户在输入数据之后直到保存记录才发现系l出了问题他们该怎么惻I删除重徏Q假如记录不?br />重徏是否让用戯开Q?br />· 提出一些检和U正键冲H的Ҏ。通常Q费点精力也搞定了Q但是从性能上来看这样做?br />代h比较大了。还有,键的U正可能会迫使你H破你的数据和商?用户界面层之间的?br />R?br />所以还是重提一句老话Q你的设计要适应用户而不是让用户来适应你的设计?br />?Lamont Adams<br />不让主键h可更新性的原因是在关系模式下,主键实现了不同表之间的关联。比如,<br />Customer 表有一个主键CustomerIDQ而客L定单则存攑֜另一个表里。Order 表的主键可能<br />Page 12 © CNET Networks Inc. 2002<br />www.zdnet.com.cn/developer<br />是OrderNo 或者OrderNo、CustomerID 和日期的l合。不你选择哪种键设|,你都需要在<br />Order 表中存放CustomerID 来保证你可以l下定单的用h到其定单记录?br />假如你在Customer 表里修改了CustomerIDQ那么你必须扑ևOrder 表中的所有相兌录对其进<br />行修攏V否则,有些定单׃不属于Q何客户——数据库的完整性就完蛋了?br />如果索引完整性规则施加到表一U,那么在不~写大量代码和附加删除记录的情况下几乎不可能<br />改变某一条记录的键和数据库内所有关联的记录。而这一q程往往错误丛生所以应该尽量避免?br />?ljboast<br />9. 可选键有时可做主键<br />CQ查询数据的不是机器而是人?br />假如你有可选键Q你可能q一步把它用做主键。那L话,你就拥有了徏立强大烦引的能力。这<br />样可以阻止用数据库的h不得不连接数据库从而恰当的qo数据。在严格控制域表的数据库<br />上,q种负蝲是比较醒目的。如果可选键真正有用Q那是辑ֈ了主键的水准?br />我的看法是,假如你有可选键Q比如国家表内的state_codeQ你不要在现有不能变动的唯一键上<br />创徏后箋的键。你要做的无非是创徏毫无价值的数据。比如以下的例子Q?br />Select count(*)<br />from address, state_ref<br />where<br />address.state_id = state_ref.state_id<br />and state_ref.state_code = 'TN'<br />我的做法是这LQ?br />Select count(*)<br />from address<br />where<br />and state_code = 'TN'<br />如你因ؓq度使用表的后箋键徏立这U表的关联,操作负蝲真得需要考虑一下了?br />?Stocker<br />10. 别忘了外?br />大多数数据库索引自动创徏的主键字Dc但别忘了烦引外键字D,它们在你x询主表中的记?br />及其兌记录时每ơ都会用到。还有,不要索引memo/notes 字段而且不要索引大型文本字段<br />Q许多字W)Q这样做会让你的索引占据大量的数据库I间。?br />?gbrayton<br />Page 13 © CNET Networks Inc. 2002<br />www.zdnet.com.cn/developer<br />W? 部分?保证数据的完整?br />1. 用约束而非商务规则强制数据完整?br />如果你按照商务规则来处理需求,那么你应当检查商务层?用户界面Q如果商务规则以后发生变<br />化,那么只需要进行更新即可?br />假如需求源于维护数据完整性的需要,那么在数据库层面上需要施加限制条件?br />如果你在数据层确实采用了U束Q你要保证有办法把更C能通过U束查的原因采用用户理解<br />的语a通知用户界面。除非你 的字D命名很冗长Q否则字D名本nq不够?br />?Lamont Adams<br />只要有可能,请采用数据库pȝ实现数据的完整性。这不但包括通过标准化实现的完整性而且q?br />包括数据的功能性。在写数据的时候还可以增加触发器来保证数据的正性。不要依赖于商务?br />保证数据完整性;它不能保证表之间Q外键)的完整性所以不能强加于其他完整性规则之上?br />?Peter Ritchie<br />2. 分布式数据系l?br />对分布式pȝ而言Q在你决定是否在各个站点复制所有数据还是把数据保存在一个地方之前应?br />估计一下未? q或?0 q的数据量。当你把数据传送到其他站点的时候,最好在数据库字D?br />中设|一些标记。在目的站点收到你的数据之后更新你的标记。ؓ了进行这U数据传输,请写?br />你自q批处理或者调度程序以特定旉间隔q行而不要让用户在每天的工作后传输数据。本?br />拯你的l护数据Q比如计常数和利息率等Q设|版本号保证数据在每个站炚w完全一致?br />?Suhair TechRepublic<br />3. 强制指示完整?br />没有好办法能在有x据进入数据库之后消除它,所以你应该在它q入数据库之前将其剔除。激<br />zL据库pȝ的指C完整性特性。这样可以保持数据的清洁而能q开发h员投入更多的旉?br />理错误条件?br />?kol<br />4. 关系<br />如果两个实体之间存在多对一关系Q而且q有可能转化为多对多关系Q那么你最好一开始就讄<br />成多对多关系。从现有的多对一关系转变为多对多关系比一开始就是多对多关系要难得多?br />?CS Data Architect<br />5. 采用视图<br />Z在你的数据库和你的应用程序代码之间提供另一层抽象,你可以ؓ你的应用E序建立专门?br />视图而不必非要应用程序直接访问数据表。这样做q等于在处理数据库变更时l你提供了更多的<br />自由?br />?Gay Howe<br />Page 14 © CNET Networks Inc. 2002<br />www.zdnet.com.cn/developer<br />6. l数据保有和恢复制定计划<br />考虑数据保有{略q包含在设计q程中,预先设计你的数据恢复q程。采用可以发布给用户/开?br />人员的数据字典实现方便的数据识别同时保证Ҏ据源文档化。编写在U更新来“更新查询”供<br />以后万一数据丢失可以重新处理更新?br />?kol<br />7. 用存储过E让pȝ做重z?br />解决了许多麻烦来产生一个具有高度完整性的数据库解x案之后,我所在的团队军_装一?br />兌表的功能l,提供一整套常规的存储过E来讉K各组以便加快速度和简化客L序代码的开<br />发。在此期_我们发现3GL ~码器设|了所有可能的错误条gQ比如以下所C:<br />SELECT Cnt = COUNT (*)<br />FROM [<Table>]<br />WHERE [<primary key column>] = <new value><br />IF Cnt = 0<br />BEGIN<br />INSERT INTO [<Table>]<br />( [< primary key column>] )<br />VALUES ( <New value> )<br />END<br />ELSE<br />BEGIN<br /><indicate duplication error><br />END<br />而一个非3GL ~码器是q样做的Q?br />INSERT INTO [<Table>]<br />( [< primary key column>] )<br />VALUES<br />( <New value> )<br />IF @@ERROR = 2627 -- Literal error code for Primary Key Constraint<br />BEGIN<br /><indicate duplication error><br />END<br />W? 个程序简单多了,而且事实上,利用了我们给数据库的功能。虽然我个h不喜Ƣ用嵌入文<br />字(2627Q。但是那样可以很方便地用一炚w先处理来代替。数据库不只是一个存放数据的?br />方,它也是简化编码之地?br />?a-smith<br />8. 使用查找<br />控制数据完整性的最x式就是限制用L选择。只要有可能都应该提供给用户一个清晰的价?br />列表供其选择。这样将减少键入代码的错误和误解同时提供数据的一致性。某些公共数据特别?br />合查找:国家代码、状态代码等?br />?CS Data Architect<br />Page 15 © CNET Networks Inc. 2002<br />www.zdnet.com.cn/developer<br />W? 部分?各种技?br />1. 文档、文档、文?br />Ҏ有的快捷方式、命名规范、限制和函数都要~制文档?br />?nickypendragon<br />采用l表、列、触发器{加注释的数据库工具。是的,q有点费事,但从长远来看Q这样做对开<br />发、支持和跟踪修改非常有用?br />?chardove<br />取决于你使用的数据库pȝQ可能有一些Y件会l你一些供你很快上手的文档。你可能希望先开<br />始在_然后获得来多的细节。或者你可能希望周期性的预排Q在输入新数据同旉着你的<br />q展Ҏ一部分l节化。不你选择哪种方式Q总要对你的数据库文档化,或者在数据库自w的<br />内部或者单独徏立文档。这P当你q了一q多旉后再回过头来做第2 个版本,你犯错的Z<br />大大减?br />?mrs_helm<br />2. 使用常用pQ或者其他Q何语aQ而不要用编?br />Z么我们经帔R用编码(比如9935A 可能是墨水笔的供应代码,4XF788-Q 可能是帐目编<br />码)Q理由很多。但是用户通常都用pq行思考而不是编码。工? q的会计或许知道<br />4XF788-Q 是什么东西,但新来的可就不一定了。在创徏下拉菜单、列表、报表时最好按照英?br />名排序。假如你需要编码,那你可以在编码旁附上用户知道的英语?br />?amasa<br />3. 保存常用信息<br />让一个表专门存放一般数据库信息非常有用。我常在q个表里存放数据库当前版本、最q检??br />复(对AccessQ、关联设计文档的名称、客L信息。这样可以实CU简单机制跟t数?br />库,当客h怨他们的数据库没有达到希望的要求而与你联pLQ这样做寚w客户?服务器环?br />特别有用?br />?Richard Foster<br />4. 试、测试、反复测?br />建立或者修订数据库之后Q必ȝ用户新输入的数据试数据字段。最重要的是Q让用户q行?br />试ƈ且同用户一道保证你选择的数据类型满_业要求。测试需要在把新数据库投入实际服务之<br />前完成?br />?juneebug<br />5. 查设?br />在开发期间检查数据库设计的常用技术是通过其所支持的应用程序原型检查数据库。换句话_<br />针对每一U最l表达数据的原型应用Q保证你查了数据模型q且查看如何取出数据?/font> </font> <img src ="http://www.tkk7.com/huyi2006/aggbug/197518.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/huyi2006/" target="_blank">allic</a> 2008-04-30 14:07 <a href="http://www.tkk7.com/huyi2006/articles/197518.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sqlite的C开?/title><link>http://www.tkk7.com/huyi2006/articles/189156.html</link><dc:creator>allic</dc:creator><author>allic</author><pubDate>Thu, 27 Mar 2008 15:06:00 GMT</pubDate><guid>http://www.tkk7.com/huyi2006/articles/189156.html</guid><wfw:comment>http://www.tkk7.com/huyi2006/comments/189156.html</wfw:comment><comments>http://www.tkk7.com/huyi2006/articles/189156.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/huyi2006/comments/commentRss/189156.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/huyi2006/services/trackbacks/189156.html</trackback:ping><description><![CDATA[写了一个简单的C试E序Q里面调有了几个sqlite接口。然后编译。我p试如何编译链?br />E序目录如下<br />/home/sqlite-ix86-linux<br />[root@localhost sqlite-ix86-linux]# ls<br />bin  ctest  huyi.db  include  lib  test  test.c<br />库和头文仉不是在标准的/usr/include ?usr/lib目录?br />gcc -L/home/sqlite-ix86-linux/lib/ -lsqlite3 -o test test.c <br />~译通过。其实后来把头文件拷C/usr/include 目录下了。半天没有搞对,拷q去了?br />q行test?br />./test: error while loading shared libraries: libsqlite3.so.0: cannot open shared object file: No such file or directory<br /><br />再到|上一查原来是加蝲动态链接库的\径不?br />export LD_LIBRARY_PATH=/home/sqlite-ix86-linux/lib<br /><br />q行成功?br /><img src ="http://www.tkk7.com/huyi2006/aggbug/189156.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/huyi2006/" target="_blank">allic</a> 2008-03-27 23:06 <a href="http://www.tkk7.com/huyi2006/articles/189156.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sqlite基本操作http://www.tkk7.com/huyi2006/articles/189116.htmlallicallicThu, 27 Mar 2008 12:21:00 GMThttp://www.tkk7.com/huyi2006/articles/189116.htmlhttp://www.tkk7.com/huyi2006/comments/189116.htmlhttp://www.tkk7.com/huyi2006/articles/189116.html#Feedback0http://www.tkk7.com/huyi2006/comments/commentRss/189116.htmlhttp://www.tkk7.com/huyi2006/services/trackbacks/189116.html  #sqlite3 name.db
2、创
  >create table tabelname (field1[cd] ,field2[cd] ,field3[cd].....);
3、修改表
  >alter table tablename add culumn fieldN;   只适用与追?br />4、删除表
  >drop table tablename;
5、列?br />  > tables or show tables;
6、显C库l构
  > schema tablename;
7、数据操?br />   查询 select  from tablename;
   增加 insert into tablename values(filed|value);
   删除 delete from tablename ;
   改变 update tablename set filedN=valueN;
以上数据操作均可以跟where条g表达式,orderby
逻辑表达式有  AND OR NOT > =  = + = * / ()


.q有很有用的SQL
Select * from Sqlite_master
Select datetime('now')
Select date('now')
Select time('now')

数据cd和创CZ
CREATE TABLE ex2
(
  a VARCHAR(10),
  b NVARCHAR(15),
  c TEXT,
  d INTEGER,
  e FLOAT,
  f BOOLEAN,
  g CLOB,
  h BLOB,
  i TIMESTAMP,
  j NUMERIC(10,5)
  k VARYING CHARACTER (24),
  l NATIONAL VARYING CHARACTER(16)
);



allic 2008-03-27 20:21 发表评论
]]>
SQLite数据库文件格式分?B树的基本l织)http://www.tkk7.com/huyi2006/articles/189050.htmlallicallicThu, 27 Mar 2008 08:37:00 GMThttp://www.tkk7.com/huyi2006/articles/189050.htmlhttp://www.tkk7.com/huyi2006/comments/189050.htmlhttp://www.tkk7.com/huyi2006/articles/189050.html#Feedback0http://www.tkk7.com/huyi2006/comments/commentRss/189050.htmlhttp://www.tkk7.com/huyi2006/services/trackbacks/189050.html此分析称为简易版Q因为后面还计划分析一个更复杂的数据库文gQ以深入理解SQLite数据库B树实现的l构Q从易的开始不׃ؓ一U好的学习方法,q里的简易版本文件是指大ؓ2K字节Q即每个B树页1K字节Q共两个B树页Q补充说明一下,q里的B树页是指经典数据结构书上所讲的B树节点,在这里称为页是因为SQLite在实现B树时是使用page的概忉|l织的?
创徏Ҏ如下Q?br />CREATE TABLE tbl1(one varchar(10),two varchar(10));
INSERT INTO "tbl1" VALUES('first', 'xxx');
INSERT INTO "tbl1" VALUES('second', 'yyy');

然后退出,用UltraEdit打开q个数据库文Ӟ
00000000h: 53 51 4C 69 74 65 20 66 6F 72 6D 61 74 20 33 00 ; SQLite format 3.
00000010h: 04 00 01 01 00 40 20 20 00 00 00 07 00 00 00 00 ; .....@  ........
00000020h: 00 00 00 00 00 00 00 00 00 00 00 03 00 00 00 01 ; ................
00000030h: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ; ................
00000040h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000050h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000060h: 00 00 00 00 0D 00 00 00 01 03 B8 00 03 B8 00 00 ; ..........?.?.
00000070h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
q中间部分全部都是零。省去!
000003a0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000003b0h: 00 00 00 00 00 00 00 00 46 01 06 17 15 15 01 71 ; ........F......q
000003c0h: 74 61 62 6C 65 74 62 6C 31 74 62 6C 31 02 43 52 ; tabletbl1tbl1.CR
000003d0h: 45 41 54 45 20 54 41 42 4C 45 20 74 62 6C 31 28 ; EATE TABLE tbl1(
000003e0h: 6F 6E 65 20 76 61 72 63 68 61 72 28 31 30 29 2C ; one varchar(10),
000003f0h: 74 77 6F 20 76 61 72 63 68 61 72 28 31 30 29 29 ; two varchar(10))
     q是W一个B树页Q这个B树页里存放了表sqlite_master的信息,q就是SQLite数据库的pȝ表了?br />下面分析一下这些二q制的具体涵义,SQLitel一采用大端法来表示数据Q不同与一般intel机器的小端法了:
偏移地址   大小    涵义
 0          16     "SQLite format 3\000"
16           2     400HQ?024个字节,每个面的字节数 
18           2     0101H表示版本可已
20           1     每页末端的未用空_q里为零表示数据都是从每|后一个字节开始存?br />21           1     最大负载分片数Q类gIP分片Q一存不下Q要分片
22           1     最负载分片数
23           1     最叶子负载分片数
24           4     文g修改计数Q用于实现ƈ行访?br />28           4     保留未用
32           4     W一个freelist?br />36           4     文g中的freelist|
40          60     q里未用
上面的这一百个字节UCؓ数据库文件的文g_q个文g头只有第一个B树页才有Q后面的每一个B树页都没有这个结构,后面每一늻构都相同Q?br />依次为:B树页头结构,B树指针结构,未用I间QB树实际数据负载?br />q里和经典数据结构书上的B树结构有些出入,q里的目的是实际应用方便Q而书上的l构目的是解释清楚B树的原理。所以有些不同:
一般书上讲的一个B树页的结构ؓQ指针,数据Q指针,数据Q指针,数据Q?..Q指?br />而SQLitel织为:指针Q指针,指针Q?..Q指针,数据Q数据,...数据?br />W一个页面中?0000060h行第五个字节开始就表示B树页头结构了Q?br />偏移地址   大小    涵义
0           1      0DhQ?101b各位意义?: intkey, 2: zerodata, 4: leafdata, 8: leaf
1           2      W一个空闲块的字节偏U量Q这里ؓ0
3           2      01Q这个B树页存放的记录数?个,即系l表中只存放了一条记录,因ؓ只创Z一个表tbl1
5           2      负蝲区首地址Q?3B8Q往下看?00003b0h行那?6是负蝲区的开始了
7           1      分片敎ͼq里数据,不考虑Q所以ؓ0
?000006Bh偏移处B数头l束了,接下来的是B数指针结构了Q此处只有一,只有一个指?3B8h处?br />?00003B8h偏移到结束都是sqlite_master表的实际数据了。当然这些数据也是有l构的?6h表示q条记录?0个字节,除去其本w?6Q和后面?1是烦引外Q整个记录刚好是70个字节,01索引后面都是payload负蝲数据了?br />如法炮制Q下面列出第二个B树页Q?br />00000400h: 0D 00 00 00 02 03 E5 00 03 F3 03 E5 00 00 00 00 ; ......?.??...
00000410h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
q中间部分全部ؓ零。省去!
000007d0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000007e0h: 00 00 00 00 00 0C 02 03 19 13 73 65 63 6F 6E 64 ; ..........second
000007f0h: 79 79 79 0B 01 03 17 13 66 69 72 73 74 78 78 78 ; yyy.....firstxxx
׃不是W一,所以不存在文g头的100个字节了Q一开始就是B树页头结构了Q这里有两个指针03F3?3E5Q其它的和上面一栗整个数据库理pȝ是准确无误地对q个文gq行理?br />q一步的工作Q只有数据多了,才能看出B树组l的好处Q查找,删除Q增加的快速!把这个文件变大再分析Q?/div>

allic 2008-03-27 16:37 发表评论
]]>sqlite-3.3.6~译安装与交叉编?/title><link>http://www.tkk7.com/huyi2006/articles/189032.html</link><dc:creator>allic</dc:creator><author>allic</author><pubDate>Thu, 27 Mar 2008 07:53:00 GMT</pubDate><guid>http://www.tkk7.com/huyi2006/articles/189032.html</guid><wfw:comment>http://www.tkk7.com/huyi2006/comments/189032.html</wfw:comment><comments>http://www.tkk7.com/huyi2006/articles/189032.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/huyi2006/comments/commentRss/189032.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/huyi2006/services/trackbacks/189032.html</trackback:ping><description><![CDATA[下文介绍的内定w是基?Linux RedHat 9.0 q_的?br /><br />一、PC机编译安?br />请阅d安装包里?INSTALL 文g。或者用PEAR installer with "pear install sqlite"。SQLite已经内置了,你不需要安装Q何附加的软gQadditional softwareQ?br />Windows users可以下蝲SQLite扩展DLLQphp_sqlite.dlQ?br />q里单介l一下:<br />假设你得到的是源代码sqlite-3.3.6.tar.gzQ这里将告诉你怎么~译它?br />解压sqlite-3.3.6.tar.gz ?/home目录?br />For example:<br />    tar zxvf sqlite-3.3.6.tar.gz -C /home            <br />    cd /home<br />    mkdir sqlite-ix86-linux<br />    cd /home/sqlite-ix86-linux/<br />    ../sqlite-3.3.6/configure --prefix=/home/sqlite-ix86-linux/<br />~译q安装,然后生成帮助文档    <br />    make && make install     && make doc<br /><br />如果出现下列错误<br />../sqlite-3.3.6/src/tclsqlite.c: In function `DbUpdateHandler':<br />../sqlite-3.3.6/src/tclsqlite.c:333: warning: passing arg 3 of `Tcl_ListObjAppendElement' makes pointer from integer without a cast<br />../sqlite-3.3.6/src/tclsqlite.c: In function `tclSqlFunc':<br />../sqlite-3.3.6/src/tclsqlite.c:419: warning: passing arg 1 of `Tcl_NewByteArrayObj' discards qualifiers from pointer target type<br />q个都时tcl相关的错?可以先安装ActiveTcl以解?假如你不需要tcl支持,那么q个错误可以q样避免:<br />    cd /home/sqlite-ix86-linux/<br />    ../sqlite-3.3.6/configure --disable-tcl  --prefix=/home/sqlite-ix86-linux/<br />~译q安装,然后生成帮助文档    <br />    make && make install     && make doc<br />不出意外,不会出现错?那么<br />库文件已l生成在 /home/sqlite-ix86-linux/lib 目录?<br />可执行文件sqlite3已经生成?/home/sqlite-ix86-linux/bin 目录?<br />下面创徏一个新的数据库文g名叫"zieckey.db" (当然你可以用不同的名字) 来测试数据库.<br />直接输入:  /home/sqlite-ix86-linux/bin/sqlite3 test.db<br />如果出现下面字样表明~译安装已经成功?<br />SQLite version 3.3.6<br />Enter ".help" for instructions<br />sqlite><br /><br /><br />二、交叉编译sqlite.3.3.6.tar.gz库文?br />    tar zxvf sqlite-3.3.6.tar.gz -C /home     (q一步前面已l有?Z完整?q里q是写出?<br />    mkdir /home/sqlite-arm-linux<br /><br />讄交叉~译环境<br />    export PATH=/usr/local/arm-linux/bin:$PATH<br />    <br />    cd /home/sqlite-arm-linux/<br />    ../sqlite-3.3.6/configure  --disable-tcl --prefix=/home/sqlite-arm-linux/ --host=arm-linux<br />    q步出现错误而没有生成Makefile<br />    configure: error: unable to find a compiler for building build tools<br />    <br />    前面查arm-linux-gcc都通过了,怎么q说没有扑ֈ~译器呢Q花了点旉看configure的脚本,太复杂了Q又l合 configure.ac看了一下。原来是要设|config_TARGET_CC和config_BUILD_CC两个环境变量?config_TARGET_CC是交叉编译器Qconfig_BUILD_CC是主机编译器。重来:<br /><br />    export config_BUILD_CC=gcc<br />    export config_TARGET_CC=arm-linux-gcc<br />    ../sqlite-3.3.6/configure  --disable-tcl --prefix=/home/sqlite-arm-linux/ --host=arm-linux<br />又出现如下错?br />    checking for /usr/include/readline.h... configure: error: cannot check for file existence when cross compiling<br />说readline.h的错,扑ֈreadline.h?usr/include/readline/readline.h目录,我想q样解决<br />    ln -s /usr/include/readline/readline.h /usr/include/readline.h<br />但还是不?br />    ../sqlite-3.3.6/configure  --disable-tcl --prefix=/home/sqlite-arm-linux/ --host=arm-linux<br />q是出现如下同样的错?br />    checking for /usr/include/readline.h... configure: error: cannot check for file existence when cross compiling<br />    <br />上面说是要检查交叉编译环境,我可以肯定我的交叉编译环境是正确的,<br />所以我军_ƺ骗configureQ我时这样做?br />    cd /home/sqlite-3.3.6<br />该目录下的 configure 文g的部分内容修改下(q里是根据 ?test "$cross_compiling" = yes &&  扑ֈ?),<br />q样可以让configure不去查你的交叉编译环境?br />  20420?{ (exit 1); exit 1; }; }改ؓ { (echo 1); echo 1; }; }<br />  20446?{ (exit 1); exit 1; }; }改ؓ { (echo 1); echo 1; }; }<br /> 在回去重新配|下Q?br />      cd /home/sqlite-arm-linux/<br />    ../sqlite-3.3.6/configure  --disable-tcl --prefix=/home/sqlite-arm-linux/ --host=arm-linux<br />中间打印信息出现如下错误信息,<br />checking for /usr/include/readline.h... configure: error: cannot check for file existence when cross compiling<br />但是q是生成了Makefile文g一个libtool脚本Q这些将在make时用?    <br />注意:<br />如果Makefile文g中有如下语句<br />BCC = arm-linux-gcc -g -O2 <br />请将其改掉,ҎQ?br />BCC = gcc -g -O2     <br />    <br />~译q安?br />    make && make install     <br />q里如果不出意外,不会出现错?那么<br />库文件已l生成在 /home/sqlite-ix86-linux/lib 目录下   ?img src ="http://www.tkk7.com/huyi2006/aggbug/189032.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/huyi2006/" target="_blank">allic</a> 2008-03-27 15:53 <a href="http://www.tkk7.com/huyi2006/articles/189032.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://changfafangzhi.com" target="_blank">Ʒѹۿһ</a>| <a href="http://zj1069.com" target="_blank">˾Ʒһ</a>| <a href="http://7766ks.com" target="_blank">һaƵۿվ</a>| <a href="http://lijieedu.com" target="_blank">͹Ƶ</a>| <a href="http://zz1965.com" target="_blank">þ޾Ʒ</a>| <a href="http://bjqhkf.com" target="_blank">պaa߿</a>| <a href="http://www99383.com" target="_blank">޵һڶĵ</a>| <a href="http://0917xzb.com" target="_blank">ʮ߹ۿӰ</a>| <a href="http://6f2igoa4.com" target="_blank">aѹۿþav</a>| <a href="http://flowsns.com" target="_blank">ɫɫwww˿</a>| <a href="http://hn283.com" target="_blank">Ѹ</a>| <a href="http://41xjj.com" target="_blank">޾ƷƵ</a>| <a href="http://liangdy.com" target="_blank">ҹAV</a>| <a href="http://sh-lkby.com" target="_blank">ĻۺϾþ2</a>| <a href="http://54vpn.com" target="_blank">ŮƵaƵȫ</a>| <a href="http://aidannis.com" target="_blank">ձһ</a>| <a href="http://0967c.com" target="_blank">ҹƵѹۿƵ</a>| <a href="http://ekyzs.com" target="_blank">Ʒ޾Ʒպͼ </a>| <a href="http://tianwu520.com" target="_blank">ɫþƷƵ</a>| <a href="http://biarn.com" target="_blank">ŷպĻһ </a>| <a href="http://caoporg.com" target="_blank">ۺϳַ</a>| <a href="http://www6661126.com" target="_blank">߹ۿ</a>| <a href="http://langya2255.com" target="_blank">þþƷŮav鶹</a>| <a href="http://lhtjdj.com" target="_blank">ղƷaëƬþ</a>| <a href="http://fanhaogo.com" target="_blank">޹ƷŰ֥߹ۿ </a>| <a href="http://959901cc.com" target="_blank">smһ</a>| <a href="http://xyxpx.com" target="_blank">һþۺ³³</a>| <a href="http://ranjihua.com" target="_blank">91۲˽˳ӰԺ</a>| <a href="http://hidiaoyan.com" target="_blank">ëƬѹۿվ</a>| <a href="http://xjdz8.com" target="_blank">AëƬѿ</a>| <a href="http://888-28.com" target="_blank">רVAV</a>| <a href="http://chch12.com" target="_blank">ҹƵ</a>| <a href="http://simupiao.com" target="_blank">鶹69Ƶ</a>| <a href="http://xiamenwave.com" target="_blank">þþƷѿ޹AV</a>| <a href="http://fl6fe.com" target="_blank">õ998Ƶѹۿ</a>| <a href="http://557265.com" target="_blank">޾Ʒ**ëƬ</a>| <a href="http://plladay.com" target="_blank">˹ۿëƬ</a>| <a href="http://cn-zggx.com" target="_blank">ƷһëƬƵۿ </a>| <a href="http://glgg99.com" target="_blank">޾Ʒþþþ66</a>| <a href="http://www-840012.com" target="_blank">þþþþþƷѿSSS</a>| <a href="http://qinglou31.com" target="_blank">鵺̳ƷƵվ </a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>