`

数据库连接、设计以及备份技巧集锦

阅读更多
重要提示:本文部分内容是斑竹从论坛搜集整理而来,如果您认为该文档的内容侵犯了您的权益,请与整理者(excelarthur@yahoo.com.cn)联系

JDBC操作各种数据库经验技巧集萃
  Java 数据库连接(JDBC)由一组用 Java 编程语言编写的类和接口组成。JDBC 为工具/数据库开发人员提供了一个标准的 API,使他们能够用纯Java API 来编写数据库应用程序。然而各个开发商的接口并不完全相同,所以开发环境的变化会带来一定的配置变化。本文主要集合了不同数据库的连接方式。

一、连接各种数据库方式速查表
  下面罗列了各种数据库使用JDBC连接的方式,可以作为一个手册使用。

1、Oracle8/8i/9i数据库(thin模式)    
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();    
String url="jdbcracle:thinlocalhost:1521rcl"; //orcl为数据库的SID    
String user="test";    
String password="test";    
Connection conn= DriverManager.getConnection(url,user,password);   
   
2、DB2数据库    
   
Class.forName("com.ibm.db2.jdbc.app.DB2Driver ").newInstance();    
String url="jdbc:db2://localhost:5000/sample"; //sample为你的数据库名    
String user="admin";    
String password="";    
Connection conn= DriverManager.getConnection(url,user,password);   
   
3、Sql Server7.0/2000数据库    
   
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();    
String url="jdbc:microsoftqlserver://localhost:1433;DatabaseName=mydb";    
//mydb为数据库    
String user="sa";    
String password="";    
Connection conn= DriverManager.getConnection(url,user,password);   
   
4、Sybase数据库    
   
Class.forName("com.sybase.jdbc.SybDriver").newInstance();    
String url =" jdbcybase:Tds:localhost:5007/myDB";//myDB为你的数据库名    
Properties sysProps = System.getProperties();    
SysProps.put("user","userid");    
SysProps.put("password","user_password");    
Connection conn= DriverManager.getConnection(url, SysProps);   
5、Informix数据库    
   
   
Class.forName("com.informix.jdbc.IfxDriver").newInstance();    
String url = "jdbc:informix-sqli://123.45.67.89:1533/myDB:INFORMIXSERVER=myserver;    
user=testuser;password=testpassword"; //myDB为数据库名    
Connection conn= DriverManager.getConnection(url);   
   
6、MySQL数据库    
   
Class.forName("org.gjt.mm.mysql.Driver").newInstance();    
String url ="jdbc:mysql://localhost/myDB?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1"    
//myDB为数据库名    
Connection conn= DriverManager.getConnection(url);   
   
7、PostgreSQL数据库    
   
Class.forName("org.postgresql.Driver").newInstance();    
String url ="jdbcostgresql://localhost/myDB" //myDB为数据库名    
String user="myuser";    
String password="mypassword";    
Connection conn= DriverManager.getConnection(url,user,password);   
   
8、access数据库直连用ODBC的   
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver") ;   
String url="jdbcdbc:Driver={MicroSoft Access Driver (*.mdb)};DBQ="+application.getRealPath("/Data/ReportDemo.mdb");   
Connection conn = DriverManager.getConnection(url,"","");   
Statement stmtNew=conn.createStatement() ;  

1、Oracle8/8i/9i数据库(thin模式) 
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); 
String url="jdbcracle:thinlocalhost:1521rcl"; //orcl为数据库的SID 
String user="test"; 
String password="test"; 
Connection conn= DriverManager.getConnection(url,user,password);

2、DB2数据库 

Class.forName("com.ibm.db2.jdbc.app.DB2Driver ").newInstance(); 
String url="jdbc:db2://localhost:5000/sample"; //sample为你的数据库名 
String user="admin"; 
String password=""; 
Connection conn= DriverManager.getConnection(url,user,password);

3、Sql Server7.0/2000数据库 

Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); 
String url="jdbc:microsoftqlserver://localhost:1433;DatabaseName=mydb"; 
//mydb为数据库 
String user="sa"; 
String password=""; 
Connection conn= DriverManager.getConnection(url,user,password);

4、Sybase数据库 

Class.forName("com.sybase.jdbc.SybDriver").newInstance(); 
String url =" jdbcybase:Tds:localhost:5007/myDB";//myDB为你的数据库名 
Properties sysProps = System.getProperties(); 
SysProps.put("user","userid"); 
SysProps.put("password","user_password"); 
Connection conn= DriverManager.getConnection(url, SysProps);
5、Informix数据库 


Class.forName("com.informix.jdbc.IfxDriver").newInstance(); 
String url = "jdbc:informix-sqli://123.45.67.89:1533/myDB:INFORMIXSERVER=myserver; 
user=testuser;password=testpassword"; //myDB为数据库名 
Connection conn= DriverManager.getConnection(url);

6、MySQL数据库 

Class.forName("org.gjt.mm.mysql.Driver").newInstance(); 
String url ="jdbc:mysql://localhost/myDB?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1" 
//myDB为数据库名 
Connection conn= DriverManager.getConnection(url);

7、PostgreSQL数据库 

Class.forName("org.postgresql.Driver").newInstance(); 
String url ="jdbcostgresql://localhost/myDB" //myDB为数据库名 
String user="myuser"; 
String password="mypassword"; 
Connection conn= DriverManager.getConnection(url,user,password);

8、access数据库直连用ODBC的
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver") ;
String url="jdbcdbc:Driver={MicroSoft Access Driver (*.mdb)};DBQ="+application.getRealPath("/Data/ReportDemo.mdb");
Connection conn = DriverManager.getConnection(url,"","");
Statement stmtNew=conn.createStatement() ;

二、JDBC连接MySql方式
  下面是使用JDBC连接MySql的一个小的教程

1、查找驱动程序
  MySQL目前提供的java驱动程序为Connection/J,可以从MySQL官方网站下载,并找到mysql-connector-java-3.0.15-ga-bin.jar文件,此驱动程序为纯java驱动程序,不需做其他配置。

2、动态指定classpath
  如果需要执行时动态指定classpath,就在执行时采用-cp方式。否则将上面的.jar文件加入到classpath环境变量中。

3、加载驱动程序

try{   
 Class.forName(com.mysql.jdbc.Driver);   
 System.out.println(Success loading Mysql Driver!);   
}catch(Exception e)   
{   
 System.out.println(Error loading Mysql Driver!);   
 e.printStackTrace();   
}  

try{
 Class.forName(com.mysql.jdbc.Driver);
 System.out.println(Success loading Mysql Driver!);
}catch(Exception e)
{
 System.out.println(Error loading Mysql Driver!);
 e.printStackTrace();
}

4、设置连接的url
jdbc:mysql://localhost/databasename[?pa=va][&pa=va]

三、以下列出了在使用JDBC来连接Oracle数据库时可以使用的一些技巧
1、在客户端软件开发中使用Thin驱动程序
 在开发Java软件方面,Oracle的数据库提供了四种类型的驱动程序,二种用于应用软件、applets、servlets等客户端软件,另外二种用于数据库中的Java存储过程等服务器端软件。在客户机端软件的开发中,我们可以选择OCI驱动程序或Thin驱动程序。OCI驱动程序利用Java本地化接口(JNI),通过Oracle客户端软件与数据库进行通讯。Thin驱动程序是纯Java驱动程序,它直接与数据库进行通讯。为了获得最高的性能,Oracle建议在客户端软件的开发中使用OCI驱动程序,这似乎是正确的。但我建议使用Thin驱动程序,因为通过多次测试发现,在通常情况下, Thin驱动程序的性能都超过了OCI驱动程序。

2、关闭自动提交功能,提高系统性能
   在第一次建立与数据库的连接时,在缺省情况下,连接是在自动提交模式下的。为了获得更好的性能,可以通过调用带布尔值false参数的Connection类的setAutoCommit()方法关闭自动提交功能,如下所示:

conn.setAutoCommit(false);

  值得注意的是,一旦关闭了自动提交功能,我们就需要通过调用Connection类的commit()和rollback()方法来人工的方式对事务进行管理。

3、在动态SQL或有时间限制的命令中使用Statement对象
 在执行SQL命令时,我们有二种选择:可以使用PreparedStatement对象,也可以使用Statement对象。无论多少次地使用同一个 SQL命令,PreparedStatement都只对它解析和编译一次。当使用Statement对象时,每次执行一个SQL命令时,都会对它进行解析和编译。这可能会使你认为,使用PreparedStatement对象比使用Statement对象的速度更快。然而,我进行的测试表明,在客户端软件中,情况并非如此。因此,在有时间限制的SQL操作中,除非成批地处理SQL命令,我们应当考虑使用Statement对象。

   此外,使用Statement对象也使得编写动态SQL命令更加简单,因为我们可以将字符串连接在一起,建立一个有效的SQL命令。因此,我认为,Statement对象可以使动态SQL命令的创建和执行变得更加简单。

4、利用helper函数对动态SQL命令进行格式化
 在创建使用Statement对象执行的动态SQL命令时,我们需要处理一些格式化方面的问题。例如,如果我们想创建一个将名字O'Reilly插入表中的SQL命令,则必须使用二个相连的“''”号替换O'Reilly中的“'”号。完成这些工作的最好的方法是创建一个完成替换操作的helper方法,然后在连接字符串心服用公式表达一个SQL命令时,使用创建的helper方法。与此类似的是,我们可以让helper方法接受一个Date型的值,然后让它输出基于Oracle的to_date()函数的字符串表达式。

5、利用PreparedStatement对象提高数据库的总体效率
  在使用PreparedStatement对象执行SQL命令时,命令被数据库进行解析和编译,然后被放到命令缓冲区。然后,每当执行同一个 PreparedStatement对象时,它就会被再解析一次,但不会被再次编译。在缓冲区中可以发现预编译的命令,并且可以重新使用。在有大量用户的企业级应用软件中,经常会重复执行相同的SQL命令,使用PreparedStatement对象带来的编译次数的减少能够提高数据库的总体性能。如果不是在客户端创建、预备、执行PreparedStatement任务需要的时间长于Statement任务,我会建议在除动态SQL命令之外的所有情况下使用PreparedStatement对象。

6、在成批处理重复的插入或更新操作中使用PreparedStatement对象
  如果成批地处理插入和更新操作,就能够显著地减少它们所需要的时间。Oracle提供的Statement和 CallableStatement并不真正地支持批处理,只有PreparedStatement对象才真正地支持批处理。我们可以使用 addBatch()和executeBatch()方法选择标准的JDBC批处理,或者通过利用PreparedStatement对象的 setExecuteBatch()方法和标准的executeUpdate()方法选择速度更快的Oracle专有的方法。要使用Oracle专有的批处理机制,可以以如下所示的方式调用setExecuteBatch():

PreparedStatement pstmt3D null;   
try {   
 ((OraclePreparedStatement)pstmt).setExecuteBatch(30);   
 ...   
 pstmt.executeUpdate();   
}  

PreparedStatement pstmt3D null;
try {
 ((OraclePreparedStatement)pstmt).setExecuteBatch(30);
 ...
 pstmt.executeUpdate();
} 调用setExecuteBatch()时指定的值是一个上限,当达到该值时,就会自动地引发SQL命令执行,标准的executeUpdate()方法就会被作为批处理送到数据库中。我们可以通过调用PreparedStatement类的sendBatch()方法随时传输批处理任务。
 
7、使用Oracle locator方法插入、更新大对象(LOB)
  Oracle的PreparedStatement类不完全支持BLOB和CLOB等大对象的处理,尤其是Thin驱动程序不支持利用 PreparedStatement对象的setObject()和setBinaryStream()方法设置BLOB的值,也不支持利用 setCharacterStream()方法设置CLOB的值。只有locator本身中的方法才能够从数据库中获取LOB类型的值。可以使用 PreparedStatement对象插入或更新LOB,但需要使用locator才能获取LOB的值。由于存在这二个问题,因此,我建议使用 locator的方法来插入、更新或获取LOB的值。

8、使用SQL92语法调用存储过程
  在调用存储过程时,我们可以使用SQL92或Oracle PL/SQL,由于使用Oracle PL/SQL并没有什么实际的好处,而且会给以后维护你的应用程序的开发人员带来麻烦,因此,我建议在调用存储过程时使用SQL92。

9、使用Object SQL将对象模式转移到数据库中
  既然可以将Oracle的数据库作为一种面向对象的数据库来使用,就可以考虑将应用程序中的面向对象模式转到数据库中。目前的方法是创建Java bean作为伪装的数据库对象,将它们的属性映射到关系表中,然后在这些bean中添加方法。尽管这样作在Java中没有什么问题,但由于操作都是在数据库之外进行的,因此其他访问数据库的应用软件无法利用对象模式。如果利用Oracle的面向对象的技术,可以通过创建一个新的数据库对象类型在数据库中模仿其数据和操作,然后使用JPublisher等工具生成自己的Java bean类。如果使用这种方式,不但Java应用程序可以使用应用软件的对象模式,其他需要共享你的应用中的数据和操作的应用软件也可以使用应用软件中的对象模式。

10、利用SQL完成数据库内的操作
  我要向大家介绍的最重要的经验是充分利用SQL的面向集合的方法来解决数据库处理需求,而不是使用Java等过程化的编程语言。

 如果编程人员要在一个表中查找许多行,结果中的每个行都会查找其他表中的数据,最后,编程人员创建了独立的UPDATE命令来成批地更新第一个表中的数据。与此类似的任务可以通过在set子句中使用多列子查询而在一个UPDATE命令中完成。当能够在单一的SQL命令中完成任务,何必要让数据在网上流来流去的?我建议用户认真学习如何最大限度地发挥SQL的功能。   

ORACLE 数据库备份技术
  ORACLE数据库是一种大型关系型的数据库,可以存贮达到存贮TB的数据,那么如何保证这些数据的安全尤其至关重要,我们从1991年开始使用 ORACLE数据库,通过这些年的使用,我们制定了一整套的ORACLE数据库的备份制度。现在把我们的备份制度介绍给大家,供大家参考。

1.根据实际需要决定数据库的运行方式
ORACLE数据库有两种运行方式:一是归档方式(ARCHIVELOG),归档方式的目的是当数据库发生故障时最大限度恢复所有已提交的事物;二是不归档方式(NOARCHIVELOG),恢复数据库到最近的回收点。我们根据数据库的高可用性和用户可承受丢失的工作量的多少,把我们正式运行的数据库采用为归档方式;那些正在开发和调试的数据库采用不归档方式。

2如何改变数据库的运行方式
2.1在创建数据库时设置数据库的运行的方式
  在创建数据库时,作为创建数据库的一部分,就决定了数据库初始的存档方式。一般情况下为NOARCHIVELOG方式。当数据库创建好以后,根据我们的需要把需要运行在归档方式的数据库改成ARCHIVELOG方式。
  
2.2改变不归档方式为为归档方式
  关闭数据库,备份已有的数据
  改变数据库的运行方式是对数据库的重要改动,所以要对数据库做备份,对可能出现的问题作出保护。
  启动Instance ,Mount数据库但不打开数据库,来改变归档方式

  sqldba lmode=y(svrmgrl)
  sqldba>connect internal
  sqldba>startup mount
  sqldba>alter database archivelog;

  使能自动存档
  在初始化文件init*.ora(一般放ORACLE根目录的下层目录dbs下)加参数:
  log_archive_start=true
  指定存档的重做登录文件名和存放的位置
  同样是在初始化文件init*.ora中加入下面的参数:
  log_archive_format=%S.arc
  log_archive_dest=/arch12/arch (arch12 是日志文件存放的目录)
  关闭数据库,重新启动数据库,归档方式转换完成。

3回收制度
3.1 根据数据库的运行方式和可承受丢失的工作量来决定数据库的回收制度对于不归档方式,我们用的是ORACLE数据库的逻辑备份Export ,回收的制度是:一个月作一次全备份(x01.dmp),一周作一次累积备份(c*.dmp),一天一次增量备份(I*.dmp),具体的是星期一到星期五作增量备份,星期六做累积备份或全备份,每次做完备份后自动传到其它的机器上存储。这些备份都是自动执行的,后面给出程序文本。

  对于归档方式,我们用的是ORCALE的物理备份:当数据库创建好以后,做一次物理上的全备份,平时在不关闭数据库的前提下,一个星期对经常改变的数据文件做联机的数据库数据文件的物理备份;当数据库的结构发生改变,如:增加表空间,加数据文件等,如允许关机,正常关闭数据库,重新做数据库全备份,否则,备份控制文件,备份数据文件照常。联机的日志文件我们是写在阵列上的,不用镜象和备份。

3.2回收的方法
3.2.1不归档方式
   我们拿曙光AIX操作系统为例,来讲解以下如何做自动备份:
---- a.首先建UNIX用户 demo/demo
---- b.拷贝oracle用户下的 .profile 到 demo 用户下,以保证 demo 用户可以用 Export命令
---- c.用root用户登录,编辑 /var/adm/cron/cron.allow 加入用户名demo,这样demo用户就有权自动执行数据库备份的shell程序;
---- d.创建数据库备份程序,放到本用户的下层目录bin下,并且这些文件要有可执行权文件zlbf1:(增量备份1,星期一执行的程序)

/u11/demo/.profile    
exp system/manager inctype=INCREMENTAL file=i01.dmp    
ftp -n< < !    
open 10.10.10.40    
user demo demo    
binary    
prompt    
cd backup40    
put i01.dmp    
close    
bye    
!    
   
文件zlbf2:(增量备份2, 星期二执行的程序)    
   
. /u11/demo/.profile    
exp system/manager inctype=INCREMENTAL file=i02.dmp    
ftp -n< < !    
   
open 10.10.10.40    
user demo demo    
binary    
prompt    
cd backup40    
put i02.dmp    
close    
bye    
!    
   
文件zlbf3:(增量备份3, 星期三执行的程序)    
. /u11/demo/.profile    
exp system/manager inctype=INCREMENTAL file=i03.dmp    
ftp -n< < !    
open 10.10.10.40    
user demo demo    
binary    
prompt    
cd backup40    
put i03.dmp    
close    
bye    
!    
文件zlbf4:(增量备份4, 星期四执行的程序)    
. /u11/demo/.profile    
exp system/manager inctype=INCREMENTAL file=i04.dmp    
ftp -n< < !    
open 10.10.10.40    
user demo demo    
binary    
prompt    
cd backup40    
put i04.dmp    
close    
bye    
!    
文件zlbf5:(增量备份5, 星期五执行的程序)    
. /u11/demo/.profile    
exp system/manager inctype=INCREMENTAL file=i05.dmp    
ftp -n< < !    
open 10.10.10.40    
user demo demo    
binary    
prompt    
cd backup40    
put i05.dmp    
close    
bye    
!    
文件zlbf6:(增量备份6, 星期六执行的程序)    
. /u11/demo/.profile    
js=`ls c*.dmp|wc -l`    
if test $js = 0    
then    
exp system/manager inctype=CUMULATIVE file=c01.dmp    
ftp -n< < !    
open 10.10.10.40    
user demo demo    
binary    
prompt    
cd backup40    
put c01.dmp    
close    
bye    
!    
fi    
if test $js = 1    
then    
exp system/manger inctype=CUMULATIVE file=c02.dmp    
ftp -n< < !    
open 10.10.10.40    
user demo demo    
binary    
prompt    
cd backup40    
put c02.dmp    
close    
bye    
!    
fi    
if test $js = 2    
then    
exp system/maneger inctype=CUMULATIVE file=c03.dmp    
ftp -n< < !    
open 10.10.10.40    
user demo demo    
binary    
prompt    
cd backup40    
put c03.dmp    
close    
bye    
!    
fi    
if test $js = 3    
then    
exp system/manager inctype=COMPLETE file=x01.dmp    
ftp -n< < !    
open 10.10.10.40    
user demo demo    
binary    
prompt    
cd backup40    
put x01.dmp    
close    
bye    
!    
rm c*.dmp    
fi    
   
---- e.在demo 用户下建一个文件,假如叫:cron.demo,文件内容如下    
59 22 * * 1 bin/zlbf1    
59 22 * * 2 bin/zlbf2    
59 22 * * 3 bin/zlbf3    
59 22 * * 4 bin/zlbf4    
59 22 * * 5 bin/zlbf5    
59 22 * * 6 bin/zlbf6   

/u11/demo/.profile 
exp system/manager inctype=INCREMENTAL file=i01.dmp 
ftp -n< < ! 
open 10.10.10.40 
user demo demo 
binary 
prompt 
cd backup40 
put i01.dmp 
close 
bye 
! 

文件zlbf2:(增量备份2, 星期二执行的程序) 

. /u11/demo/.profile 
exp system/manager inctype=INCREMENTAL file=i02.dmp 
ftp -n< < ! 

open 10.10.10.40 
user demo demo 
binary 
prompt 
cd backup40 
put i02.dmp 
close 
bye 
! 

文件zlbf3:(增量备份3, 星期三执行的程序) 
. /u11/demo/.profile 
exp system/manager inctype=INCREMENTAL file=i03.dmp 
ftp -n< < ! 
open 10.10.10.40 
user demo demo 
binary 
prompt 
cd backup40 
put i03.dmp 
close 
bye 
! 
文件zlbf4:(增量备份4, 星期四执行的程序) 
. /u11/demo/.profile 
exp system/manager inctype=INCREMENTAL file=i04.dmp 
ftp -n< < ! 
open 10.10.10.40 
user demo demo 
binary 
prompt 
cd backup40 
put i04.dmp 
close 
bye 
! 
文件zlbf5:(增量备份5, 星期五执行的程序) 
. /u11/demo/.profile 
exp system/manager inctype=INCREMENTAL file=i05.dmp 
ftp -n< < ! 
open 10.10.10.40 
user demo demo 
binary 
prompt 
cd backup40 
put i05.dmp 
close 
bye 
! 
文件zlbf6:(增量备份6, 星期六执行的程序) 
. /u11/demo/.profile 
js=`ls c*.dmp|wc -l` 
if test $js = 0 
then 
exp system/manager inctype=CUMULATIVE file=c01.dmp 
ftp -n< < ! 
open 10.10.10.40 
user demo demo 
binary 
prompt 
cd backup40 
put c01.dmp 
close 
bye 
! 
fi 
if test $js = 1 
then 
exp system/manger inctype=CUMULATIVE file=c02.dmp 
ftp -n< < ! 
open 10.10.10.40 
user demo demo 
binary 
prompt 
cd backup40 
put c02.dmp 
close 
bye 
! 
fi 
if test $js = 2 
then 
exp system/maneger inctype=CUMULATIVE file=c03.dmp 
ftp -n< < ! 
open 10.10.10.40 
user demo demo 
binary 
prompt 
cd backup40 
put c03.dmp 
close 
bye 
! 
fi 
if test $js = 3 
then 
exp system/manager inctype=COMPLETE file=x01.dmp 
ftp -n< < ! 
open 10.10.10.40 
user demo demo 
binary 
prompt 
cd backup40 
put x01.dmp 
close 
bye 
! 
rm c*.dmp 
fi 

---- e.在demo 用户下建一个文件,假如叫:cron.demo,文件内容如下 
59 22 * * 1 bin/zlbf1 
59 22 * * 2 bin/zlbf2 
59 22 * * 3 bin/zlbf3 
59 22 * * 4 bin/zlbf4 
59 22 * * 5 bin/zlbf5 
59 22 * * 6 bin/zlbf6 
 
---- f.在demo用户下执行下面的命令:
crontab cron.demo 执行的结果放到
/var/spool/cron/crontabs/demo文件里

---- g.重新启动cron 进程,命令:kill -1 进程号
---- h.执行结果放在本用户的邮件里
---- i.查看结果是否执行,请看:/var/adm/cron/log文件

3.2.2归档方式
---- a. 找到要回收的数据文件、联机重做登录文件、控制文件和参数文件
---- b. 正常关闭数据库,作一次全回收(用操作系统的TAR命令,可以写成shell程序),然后打开数据库供正常使用,shell程序如下:
tar cvf /dev/rmt/ctape2 /u1/oracle/dbs/ctrl1ora7.ctl\
/u1/oracle/dbs/ctrl2ora7.ctl\
/u1/oracle/dbs/ctrl3ora7.ctl\
/u1/oracle/dbs/systora7.dbf\
/u1/oracle/dbs/rbsora7.dbf\
/u1/oracle/dbs/tempora7.dbf\
/u1/oracle/dbs/toolora7.dbf\
/u1/oracle/dbs/usrora7.dbf\
/ls1/ls1.dbf\
/u1/oracle/dbs/log1ora7.dbf\
/u1/oracle/dbs/log2ora7.dbf\
/u1/oracle/dbs/log3ora7.dbf
---- c. 经常作联机的表空间和数据文件的部分回收
首先标记联机表空间回收的开始
alter tablespace 表空间名 begin backup;
用操作系统命令备份数据文件
最后标记联机的表空间回收结束
alter tablespace 表空间名 end backup
---- 多个表空间可以一起做标记,备份做标记的所有数据文件后,一起标记结束。
---- d. 当数据库结构发生改变后,要对它的控制文件做回收
sqldba >alter database backup
controlfile to ’文件名’ reuse;  

数据库设计中的14个技巧
1. 原始单据与实体之间的关系
  可以是一对一、一对多、多对多的关系。在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体。在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证对应多个实体,或多张原始单证对应一个实体。这里的实体可以理解为基本表。明确这种对应关系后,对我们设计录入界面大有好处。
  〖例1〗:一份员工履历资料,在人力资源信息系统中,就对应三个基本表:员工基本情况表、社会关系表、工作简历表。这就是“一张原始单证对应多个实体”的典型例子。

2. 主键与外键
  一般而言,一个实体不能既无主键又无外键。在E—R 图中, 处于叶子部位的实体, 可以定义主键,也可以不定义主键(因为它无子孙), 但必须要有外键(因为它有父亲)。
  主键与外键的设计,在全局数据库的设计中,占有重要地位。当全局数据库的设计完成以后,有个美国数据库设计专家说:“键,到处都是键,除了键之外,什么也没有”,这就是他的数据库设计经验之谈,也反映了他对信息系统核心(数据模型)的高度抽象思想。因为:主键是实体的高度抽象,主键与外键的配对,表示实体之间的连接。

3. 基本表的性质
  基本表与中间表、临时表不同,因为它具有如下四个特性:
  (1) 原子性。基本表中的字段是不可再分解的。
  (2) 原始性。基本表中的记录是原始数据(基础数据)的记录。
  (3) 演绎性。由基本表与代码表中的数据,可以派生出所有的输出数据。
  (4) 稳定性。基本表的结构是相对稳定的,表中的记录是要长期保存的。
   理解基本表的性质后,在设计数据库时,就能将基本表与中间表、临时表区分开来。

4. 范式标准
  基本表及其字段之间的关系, 应尽量满足第三范式。但是,满足第三范式的数据库设计,往往不是最好的设计。为了提高数据库的运行效率,常常需要降低范式标准:适当增加冗余,达到以空间换时间的目的。
  〖例2〗:有一张存放商品的基本表,如表1所示。“金额”这个字段的存在,表明该表的设计不满足第三范式,因为“金额”可以由“单价”乘以“数量”得到,说明“金额”是冗余字段。但是,增加“金额”这个冗余字段,可以提高查询统计的速度,这就是以空间换时间的作法。
  在Rose 2002中,规定列有两种类型:数据列和计算列。“金额”这样的列被称为“计算列”,而“单价”和“数量”这样的列被称为“数据列”。
  表1 商品表的表结构
  商品名称商品型号单价数量金额
  电视机 29吋 2,500 40 100,000

5. 通俗地理解三个范式
  通俗地理解三个范式,对于数据库设计大有好处。在数据库设计中,为了更好地应用三个范式,就必须通俗地理解三个范式(通俗地理解是够用的理解,并不是最科学最准确的理解):
  第一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解;
  第二范式:2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性;
  第三范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。
  没有冗余的数据库设计可以做到。但是,没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。具体做法是:在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段,允许冗余。

6. 要善于识别与正确处理多对多的关系
  若两个实体之间存在多对多的关系,则应消除这种关系。消除的办法是,在两者之间增加第三个实体。这样,原来一个多对多的关系,现在变为两个一对多的关系。要将原来两个实体的属性合理地分配到三个实体中去。这里的第三个实体,实质上是一个较复杂的关系,它对应一张基本表。一般来讲,数据库设计工具不能识别多对多的关系,但能处理多对多的关系。
  〖例3〗:在“图书馆信息系统”中,“图书”是一个实体,“读者”也是一个实体。这两个实体之间的关系,是一个典型的多对多关系:一本图书在不同时间可以被多个读者借阅,一个读者又可以借多本图书。为此,要在二者之间增加第三个实体,该实体取名为“借还书”,它的属性为:借还时间、借还标志(0表示借书,1表示还书),另外,它还应该有两个外键(“图书”的主键,“读者”的主键),使它能与“图书”和 “读者”连接。

7. 主键PK的取值方法
  PK是供程序员使用的表间连接工具,可以是一无物理意义的数字串, 由程序自动加1来实现。也可以是有物理意义的字段名或字段名的组合。不过前者比后者好。当PK是字段名的组合时,建议字段的个数不要太多,多了不但索引占用空间大,而且速度也慢。

8. 正确认识数据冗余
  主键与外键在多表中的重复出现, 不属于数据冗余,这个概念必须清楚,事实上有许多人还不清楚。非键字段的重复出现, 才是数据冗余!而且是一种低级冗余,即重复性的冗余。高级冗余不是字段的重复出现,而是字段的派生出现。
  〖例4〗:商品中的“单价、数量、金额”三个字段,“金额”就是由“单价”乘以“数量”派生出来的,它就是冗余,而且是一种高级冗余。冗余的目的是为了提高处理速度。只有低级冗余才会增加数据的不一致性,因为同一数据,可能从不同时间、地点、角色上多次录入。因此,我们提倡高级冗余(派生性冗余),反对低级冗余(重复性冗余)。

9. E--R图没有标准答案
  信息系统的E--R图没有标准答案,因为它的设计与画法不是惟一的,只要它覆盖了系统需求的业务范围和功能内容,就是可行的。反之要修改E--R图。尽管它没有惟一的标准答案,并不意味着可以随意设计。好的E—R图的标准是:结构清晰、关联简洁、实体个数适中、属性分配合理、没有低级冗余。

10. 视图技术在数据库设计中很有用
  与基本表、代码表、中间表不同,视图是一种虚表,它依赖数据源的实表而存在。视图是供程序员使用数据库的一个窗口,是基表数据综合的一种形式, 是数据处理的一种方法,是用户数据保密的一种手段。为了进行复杂处理、提高运算速度和节省存储空间, 视图的定义深度一般不得超过三层。若三层视图仍不够用, 则应在视图上定义临时表, 在临时表上再定义视图。这样反复交迭定义, 视图的深度就不受限制了。
  对于某些与国家政治、经济、技术、军事和安全利益有关的信息系统,视图的作用更加重要。这些系统的基本表完成物理设计之后,立即在基本表上建立第一层视图,这层视图的个数和结构,与基本表的个数和结构是完全相同。并且规定,所有的程序员,一律只准在视图上操作。只有数据库管理员,带着多个人员共同掌握的“安全钥匙”,才能直接在基本表上操作。请读者想想:这是为什么?

11. 中间表、报表和临时表
  中间表是存放统计数据的表,它是为数据仓库、输出报表或查询结果而设计的,有时它没有主键与外键(数据仓库除外)。临时表是程序员个人设计的,存放临时记录,为个人所用。基表和中间表由DBA维护,临时表由程序员自己用程序自动维护。

12. 完整性约束表现在三个方面
  域的完整性:用Check来实现约束,在数据库设计工具中,对字段的取值范围进行定义时,有一个Check按钮,通过它定义字段的值城。
  参照完整性:用PK、FK、表级触发器来实现。
  用户定义完整性:它是一些业务规则,用存储过程和触发器来实现。

13. 防止数据库设计打补丁的方法是“三少原则”
  (1) 一个数据库中表的个数越少越好。只有表的个数少了,才能说明系统的E--R图少而精,去掉了重复的多余的实体,形成了对客观世界的高度抽象,进行了系统的数据集成,防止了打补丁式的设计;
  (2) 一个表中组合主键的字段个数越少越好。因为主键的作用,一是建主键索引,二是做为子表的外键,所以组合主键的字段个数少了,不仅节省了运行时间,而且节省了索引存储空间;
  (3) 一个表中的字段个数越少越好。只有字段的个数少了,才能说明在系统中不存在数据重复,且很少有数据冗余,更重要的是督促读者学会“列变行”,这样就防止了将子表中的字段拉入到主表中去,在主表中留下许多空余的字段。所谓“列变行”,就是将主表中的一部分内容拉出去,另外单独建一个子表。这个方法很简单,有的人就是不习惯、不采纳、不执行。
  数据库设计的实用原则是:在数据冗余和处理速度之间找到合适的平衡点。“三少”是一个整体概念,综合观点,不能孤立某一个原则。该原则是相对的,不是绝对的。“三多”原则肯定是错误的。试想:若覆盖系统同样的功能,一百个实体(共一千个属性) 的E--R图,肯定比二百个实体(共二千个属性) 的E--R图,要好得多。
  提倡“三少”原则,是叫读者学会利用数据库设计技术进行系统的数据集成。数据集成的步骤是将文件系统集成为应用数据库,将应用数据库集成为主题数据库,将主题数据库集成为全局综合数据库。集成的程度越高,数据共享性就越强,信息孤岛现象就越少,整个企业信息系统的全局E—R图中实体的个数、主键的个数、属性的个数就会越少。
  提倡“三少”原则的目的,是防止读者利用打补丁技术,不断地对数据库进行增删改,使企业数据库变成了随意设计数据库表的“垃圾堆”,或数据库表的“大杂院”,最后造成数据库中的基本表、代码表、中间表、临时表杂乱无章,不计其数,导致企事业单位的信息系统无法维护而瘫痪。
  “三多”原则任何人都可以做到,该原则是“打补丁方法”设计数据库的歪理学说。“三少”原则是少而精的原则,它要求有较高的数据库设计技巧与艺术,不是任何人都能做到的,因为该原则是杜绝用“打补丁方法”设计数据库的理论依据。

14. 提高数据库运行效率的办法
  在给定的系统硬件和系统软件条件下,提高数据库系统的运行效率的办法是:
  (1) 在数据库物理设计时,降低范式,增加冗余, 少用触发器, 多用存储过程。
  (2) 当计算非常复杂、而且记录条数非常巨大时(例如一千万条),复杂计算要先在数据库外面,以文件系统方式用C++语言计算处理完成之后,最后才入库追加到表中去。这是电信计费系统设计的经验。
  (3) 发现某个表的记录太多,例如超过一千万条,则要对该表进行水平分割。水平分割的做法是,以该表主键PK的某个值为界线,将该表的记录水平分割为两个表。若发现某个表的字段太多,例如超过八十个,则垂直分割该表,将原来的一个表分解为两个表。
  (4) 对数据库管理系统DBMS进行系统优化,即优化各种系统参数,如缓冲区个数。
  (5) 在使用面向数据的SQL语言进行程序设计时,尽量采取优化算法。
   总之,要提高数据库的运行效率,必须从数据库系统级优化、数据库设计级优化、程序实现级优化,这三个层次上同时下功夫。
  上述十四个技巧,是许多人在大量的数据库分析与设计实践中,逐步总结出来的。对于这些经验的运用,读者不能生帮硬套,死记硬背,而要消化理解,实事求是,灵活掌握。并逐步做到:在应用中发展,在发展中应用。
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    java数据库连接、设计以及备份技巧集锦

    在Java编程中,数据库连接是核心部分,尤其是在构建企业级应用时。JDBC(Java Database Connectivity)作为Java平台的标准API,提供了连接和操作数据库的能力,使得开发者能够用统一的方式处理不同的数据库系统。...

    数据库设计原则与技巧

    #### 五、数据库连接、设计与备份技巧集锦 数据库连接是任何数据库应用的核心,不同的数据库管理系统(DBMS)有不同的连接方式。以下是一些常见数据库的连接示例: 1. **Oracle 8/8i/9i (thin模式)**:使用`oracle....

    数据库设计和备份恢复技术

    数据库设计和备份恢复技术是IT领域中的核心环节,对于数据安全和系统稳定性至关重要。数据库是存储和管理信息的系统,而良好的设计能确保数据的有效组织和高效访问。本主题将深入探讨这两个方面,并提供实用的技巧和...

    vb.net写的数据库备份 带进度条显示

    4. 关闭数据库连接:完成备份后,关闭数据库连接以释放资源。 接下来,我们关注如何在UI中添加进度条显示。VB.NET提供了多种控件可以实现这一功能,如`ProgressBar`控件。为了更新进度条,你需要将备份过程分解为可...

    Oracle数据库备份技巧

    每周至少进行一次主数据库的全量备份是推荐的做法,特别是在数据库结构发生变化,如创建、修改或删除数据库,或者有新的SQL Server消息、连接服务器或记录设备添加时,应立即进行手工备份。 msdb数据库是另一个需要...

    C# sql数据库自动备份并压缩(源码)

    1. 数据库连接字符串的配置和管理。 2. 使用SqlCommand对象执行备份SQL命令。 3. 文件流操作,如FileStream用于读写文件,以及GZipStream或DeflateStream进行压缩。 4. GUI事件驱动编程,例如按钮点击事件触发备份...

    工资管理系统数据库课程设计

    这份课程设计采用VC++作为编程语言,构建了一个完整的工资管理系统,涵盖了数据库备份、数据库文件操作、程序源码以及相关的使用文档。 在数据库管理方面,该系统基于关系型数据库模型,可能使用了如SQL Server或...

    MySQL 数据库系统设计实现与管理第六版课后习题答案

    MySQL数据库系统设计实现与管理是数据库领域的一门重要课程,主要涵盖了数据库的基础理论、设计方法、实施技巧以及管理策略。第六版的教材深入浅出地介绍了MySQL这一流行的开源关系型数据库管理系统,为学习者提供了...

    浅谈数据库设计技巧-程序员应该读的

    本文将深入探讨数据库设计的一些重要技巧,帮助程序员提升在这一领域的专业技能。 一、概念理解 1. 数据库模式:数据库模式是数据库结构的逻辑表示,包括实体、属性、关系和约束。理解并掌握ER模型(实体-关系模型...

    数据库设计方法规范技巧

    本资料主要聚焦于数据库设计方法与规范技巧,结合Java编程语言进行阐述,旨在帮助开发者提升数据库设计能力。 首先,数据库设计的基本流程包括需求分析、概念设计、逻辑设计、物理设计以及实施与维护。在需求分析...

    多表数据库课程设计

    在数据库系统领域,多表数据库课程设计是一项至关重要的实践环节,它涵盖了数据库系统的基本理论、设计原则以及实际操作技巧。这个课程设计的目标是让学生深入理解如何有效地管理和组织大量的数据,以便进行高效的...

    SQL数据库的备份与恢复技巧.pdf

    本文以SQL Server 2005版本为例,介绍了几种常见的备份类型、备份时应该考虑的问题以及恢复模式和技巧。 首先,SQL数据库备份分为四种类型:完整备份、差异备份、事务日志备份和文件或文件组备份。完整备份复制了...

    数据库连接客户端

    数据库连接客户端在日常工作中发挥着重要作用,不仅限于数据查询,还涉及到数据导入导出、数据同步、备份恢复、权限管理等。对于IT专业人员来说,熟练掌握这些工具的使用和优化技巧,是提高工作效率和保证数据安全的...

    易语言MYSQL数据库备份还原器源码

    1. **连接MySQL数据库**:源码可能会展示如何使用易语言的库函数连接到MySQL服务器,包括设置服务器地址、端口号、用户名、密码以及数据库名。 2. **执行SQL命令**:备份数据库通常涉及创建一个SQL导出命令,将整个...

    数据库课程设计(包含数据库 程序 实验报告)

    这涉及数据库连接、SQL语句的执行、结果集的处理等。了解面向对象编程和相关的框架(如Java的JDBC或Python的sqlite3模块)是必要的。 5. **实验报告**:实验报告是记录和展示你工作过程和成果的重要文档。它应包含...

    数据库设计经验谈 数据库设计经验 数据库设计经验总结谈

    除了上述四个主要部分之外,还有一些实用的小技巧可以帮助优化数据库的设计和管理: - **5.1 数据备份与恢复**:定期备份数据是非常重要的步骤,以防数据丢失。同时,也需要具备有效的数据恢复机制。 - **5.2 性能...

    SQLSERVER数据库备份详细操作步骤带截图

    ### SQLSERVER数据库备份详细操作步骤 #### 一、引言 在现代企业的信息化管理中,数据的安全性至关重要。...通过本篇文档的学习,相信您已经掌握了SQL Server数据库备份的基本方法和技巧,为您的日常工作带来了便利。

    数据库课程设计DB 数据库课程设计

    这涉及到数据库连接池的使用、预编译语句的编写以及异常处理等。 七、案例分析与实践 通过具体的案例分析,比如模拟一个学校信息管理系统、图书馆管理系统等,让学生将理论知识应用于实际,锻炼其解决实际问题的...

Global site tag (gtag.js) - Google Analytics