konhon

忘掉過去,展望未來。找回自我,超越自我。
逃避不一定躲的过, 面对不一定最难过, 孤单不一定不快乐, 得到不一定能长久, 失去不一定不再拥有, 可能因为某个理由而伤心难过, 但我却能找个理由让自己快乐.

Google

BlogJava 首页 新随笔 联系 聚合 管理
  203 Posts :: 0 Stories :: 61 Comments :: 0 Trackbacks

#

批量删除海量数据通常都是很复杂及缓慢的,方法也很多,但是通常的概念是:分批删除,逐次提交。
下面是我的删除过程,我的数据表可以通过主键删除,测试过Delete和For all两种方法,for all在这里并没有带来性能提高,所以仍然选择了批量直接删除。

首先创建一下过程,使用自制事务进行处理:

create or replace procedure delBigTab
(
p_TableName       in    varchar2,
p_Condition       in    varchar2,
p_Count        in    varchar2
)
as
pragma autonomous_transaction;
n_delete number:=0;
begin
while 1=1 loop
EXECUTE IMMEDIATE
'delete from '||p_TableName||' where '||p_Condition||' and rownum <= :rn'
USING p_Count;
if SQL%NOTFOUND then
exit;
else
n_delete:=n_delete + SQL%ROWCOUNT;
end if;
commit;
end loop;
commit;
DBMS_OUTPUT.PUT_LINE('Finished!');
DBMS_OUTPUT.PUT_LINE('Totally '||to_char(n_delete)||' records deleted!');
end;

以下是删除过程及时间:
SQL> create or replace procedure delBigTab
  2  (
  3    p_TableName       in    varchar2,
  4    p_Condition       in    varchar2,
  5    p_Count        in    varchar2
  6  )
  7  as
  8   pragma autonomous_transaction;
  9   n_delete number:=0;
10  begin
11   while 1=1 loop
12     EXECUTE IMMEDIATE
13       'delete from '||p_TableName||' where '||p_Condition||' and rownum <= :rn'
14     USING p_Count;
15     if SQL%NOTFOUND then
16        exit;
17     else
18              n_delete:=n_delete + SQL%ROWCOUNT;
19     end if;
20     commit;
21   end loop;
22   commit;
23   DBMS_OUTPUT.PUT_LINE('Finished!');
24   DBMS_OUTPUT.PUT_LINE('Totally '||to_char(n_delete)||' records deleted!');
25  end;
26  /

Procedure created.

SQL> set timing on
SQL> select min(NUMDLFLOGGUID) from HS_DLF_DOWNLOG_HISTORY;

MIN(NUMDLFLOGGUID)
------------------
          11000000

Elapsed: 00:00:00.23
SQL> exec delBigTab('HS_DLF_DOWNLOG_HISTORY','NUMDLFLOGGUID < 11100000','10000');

PL/SQL procedure successfully completed.

Elapsed: 00:00:18.54
SQL> select min(NUMDLFLOGGUID) from HS_DLF_DOWNLOG_HISTORY;

MIN(NUMDLFLOGGUID)
------------------
          11100000

Elapsed: 00:00:00.18
SQL> set serveroutput on
SQL> exec delBigTab('HS_DLF_DOWNLOG_HISTORY','NUMDLFLOGGUID < 11200000','10000');
Finished!
Totally 96936 records deleted!

PL/SQL procedure successfully completed.

Elapsed: 00:00:18.61
10万记录大约19s

SQL> exec delBigTab('HS_DLF_DOWNLOG_HISTORY','NUMDLFLOGGUID < 11300000','10000');
Finished!
Totally 100000 records deleted!

PL/SQL procedure successfully completed.

Elapsed: 00:00:18.62
SQL> exec delBigTab('HS_DLF_DOWNLOG_HISTORY','NUMDLFLOGGUID < 11400000','10000');
Finished!
Totally 100000 records deleted!

PL/SQL procedure successfully completed.

Elapsed: 00:00:18.85
SQL>
SQL> exec delBigTab('HS_DLF_DOWNLOG_HISTORY','NUMDLFLOGGUID < 13000000','10000');
Finished!
Totally 1000000 records deleted!

PL/SQL procedure successfully completed.

Elapsed: 00:03:13.87

100万记录大约3分钟
SQL> exec delBigTab('HS_DLF_DOWNLOG_HISTORY','NUMDLFLOGGUID < 20000000','10000');

Finished!
Totally 6999977 records deleted!

PL/SQL procedure successfully completed.

Elapsed: 00:27:24.69
700万大约27分钟

posted @ 2005-10-17 05:20 konhon 优华 阅读(1752) | 评论 (0)编辑 收藏

  用户自定义的数据库备份 

备份类型

备份方法

示例

数据文件

操作系统命令或工具

C:\COPY datafile1.ora datafile.bak

归档重做日志文件

操作系统命令或工具

C:\COPY log_01_23.arc log_01_23.bak

控制文件

SQL命令

SQL>ALTER DATABASE BACKUP CONTROLFILE  TO confile.bak;

初始化参数文件

SQL命令

SQL>CREATE  PFILE=SIDinit.ora FROM  SPFILE;

网络配置与口令文件

操作系统命令

C:\COPY tnsnames.ora tnsnames.bak

数据库逻辑对象(表、索引、存储过程等)

Export工具

C:\EXPORT system/manager  TABLE

=hr.employees file=emp.dmp



 

 

 

 

 


















如果数据库运行在不归档模式下,可以对数据库进行不一致的完全备份,或者对某个表空间或数据文件进行单独的备份。

如果数据库运行在不归档模式下,只能在关闭状态下对数据库进行一致的完全备份

一、             表空间或数据文件的脱机备份

    如果数据库运行在归档模式下,可以在打开状态下对数据库中处于脱机状态的表空间或数据文件进行备份。在备份期间数据库中其它的表空间或数据文件仍然可以被用户使用。

SQL>ALTER  TABLESPACE  users  OFFLINE  NORMAL;

C:\COPY  E:\oracle\oradata\users01.dbf  F:\backup\users01.bak

SQL>ALTER  TABLESPACE  users  ONLINE;

SQL>ALTER  SYSTEM  ARCHIVE  LOG  CURRENT;

二、             表空间或数据文件的联机备份

如果数据库运行在归档模式下,可以在打开状态下对数据库中处于联机状态的表空间或数据文件进行备份。在备份期间这些表空间或数据文件仍然可以被用户使用。

SQL>ALTER  TABLESPACE  users  BEGIN  BACKUP;

C:\COPY  E:\oracle\oradata\users01.dbf  F:\backup\users01.bak

SQL>ALTER  TABLESPACE  users  END  BACKUP;

SQL>ALTER  SYSTEM  ARCHIVE  LOG  CURRENT;

三、             处理备份故障

如果在备份过程中发生故障,导致备份突然中断,那么在下一次启动数据库时备份表空间的数据文件将会仍然处于备份模式下,因此ORACLE会要求进行数据库恢复。

1、  利用ALTER  DATABASE  END  BACKUP语句退出备份模式

SQL>STARTUP  MOUNT

SQL>SELECT * FROM V$BACKUP WHERE STATUS=’ACTIVE’

(查询哪些数据文件处于备份模式)

SQL>ALTER  DATABASE  END BACKUP;

SQL>ALTER  DATABASE  OPEN;

2、  利用RECOVER命令退出备份模式

   SQL>STARTUP  MOUNT

   SQL>RECOVER  DATABASE

   SQL>ALTER  DATABASE  OPEN;

四、             控制文件备份为二进制文件

SQL>ALTER  DATABASE  BACKUP  CONTROLFILE  TO

‘E:\backup\cfile.bak’  REUSE;

五、             控制文件备份到跟踪文件中

SQL>ALTER  DATABASE  BACKUP  CONTROLFILE  TO  TRACE;

(数据库处于加载状态时,利用上面语句可以将控制文件备份到跟踪文件中)
posted @ 2005-10-17 02:45 konhon 优华 阅读(421) | 评论 (0)编辑 收藏

 

Create  function fun_getPY
 (
    @str nvarchar(4000)
 )
returns nvarchar(4000)
as
begin

  declare @word nchar(1),@PY nvarchar(4000)

  set @PY=''

  while len(@str)>0
  begin
    set @word=left(@str,1)

    --如果非汉字字符,返回原字符
    set @PY=@PY+(case when unicode(@word) between 19968 and 19968+20901
               then ( 
                            select top 1 PY 
                            from 
                            ( 
                             select 'A' as PY,N'驁' as word
                             union all select 'B',N'簿'
                             union all select 'C',N'錯'
                     union all select 'D',N'鵽'
                     union all select 'E',N'樲'
                     union all select 'F',N'鰒'
                     union all select 'G',N'腂'
                     union all select 'H',N'夻'
                     union all select 'J',N'攈'
                     union all select 'K',N'穒'
                     union all select 'L',N'鱳'
                     union all select 'M',N'旀'
                     union all select 'N',N'桛'
                     union all select 'O',N'漚'
                     union all select 'P',N'曝'
                     union all select 'Q',N'囕'
                     union all select 'R',N'鶸'
                     union all select 'S',N'蜶'
                     union all select 'T',N'籜'
                     union all select 'W',N'鶩'
                     union all select 'X',N'鑂'
                     union all select 'Y',N'韻'
                     union all select 'Z',N'咗'
                      ) T 
                   where word>=@word collate Chinese_PRC_CS_AS_KS_WS 
                   order by PY ASC
                          ) 
                      else @word 
                 end)
    set @str=right(@str,len(@str)-1)
  end

  return @PY

end

posted @ 2005-10-17 02:44 konhon 优华 阅读(478) | 评论 (0)编辑 收藏

This stored procedure can be used to insert the result set of the
particular select statement into Excel file (c:\ImportToExcel.xls,
by default).
You can pass the server name, user name, user password, the select
statement to execute, and the file name to store the results set,
as in the example below:

EXEC ExportToExcel @server = '.',
                   @uname = 'sa',
                   @QueryText = 'SELECT au_fname FROM pubs..authors',
                   @filename = 'c:\ImportToExcel.xls'

/*
Version: SQL Server 7.0/2000
Created by: Alexander Chigrik
- all about MS SQL
(SQL Server Articles, FAQ, Scripts, Tips and Test Exams).

This stored procedure can be used to insert the result set of the
particular select statement into Excel file (c:\ImportToExcel.xls,
by default).
You can pass the server name, user name, user password, the select
statement to execute, and the file name to store the results set,
as in the example below:

EXEC ExportToExcel @server = '.',
                   @uname = 'sa',
                   @QueryText = 'SELECT au_fname FROM pubs..authors',
                   @filename = 'c:\ImportToExcel.xls'
*/

IF OBJECT_ID('ExportToExcel') IS NOT NULL DROP PROC ExportToExcel
GO

CREATE PROCEDURE ExportToExcel (
  @server sysname = null,
  @uname sysname = null,
  @pwd sysname = null,
  @QueryText varchar(200) = null,
  @filename varchar(200) = 'c:\ImportToExcel.xls'
)
AS
DECLARE @SQLServer int,
        @QueryResults int,
        @CurrentResultSet int,
        @object int,
        @WorkBooks int,
        @WorkBook int,
        @Range int,
        @hr int,
        @Columns int,
        @Rows int,
        @indColumn int,
        @indRow int,
        @off_Column int,
        @off_Row int,
        @code_str varchar(100),
        @result_str varchar(255)

IF @QueryText IS NULL 
  BEGIN
    PRINT 'Set the query string'
    RETURN
  END

-- Sets the server to the local server
IF @server IS NULL SELECT @server = @@servername

-- Sets the username to the current user name
IF @uname IS NULL SELECT @uname = SYSTEM_USER

SET NOCOUNT ON

EXEC @hr = sp_OACreate 'SQLDMO.SQLServer', @SQLServer OUT
IF @hr <> 0
BEGIN
    PRINT 'error create SQLDMO.SQLServer'
    RETURN
END

--  Connect to the SQL Server
IF @pwd IS NULL
  BEGIN
    EXEC @hr = sp_OAMethod @SQLServer, 'Connect', null, @server, @uname
    IF @hr <> 0
       BEGIN
         PRINT 'error Connect'
         RETURN
       END
  END
ELSE
  BEGIN
    EXEC @hr = sp_OAMethod @SQLServer, 'Connect', null, @server, @uname, @pwd
    IF @hr <> 0
      BEGIN
        PRINT 'error Connect'
        RETURN
      END
  END

SELECT @result_str = 'ExecuteWithResults("' + @QueryText + '")'
EXEC @hr = sp_OAMethod @SQLServer, @result_str, @QueryResults OUT
IF @hr <> 0
BEGIN
    PRINT 'error with method ExecuteWithResults'
    RETURN
END

EXEC @hr = sp_OAMethod @QueryResults, 'CurrentResultSet', @CurrentResultSet OUT
IF @hr <> 0
BEGIN
    PRINT 'error get CurrentResultSet'
    RETURN
END

EXEC @hr = sp_OAMethod @QueryResults, 'Columns', @Columns OUT
IF @hr <> 0
BEGIN
    PRINT 'error get Columns'
    RETURN
END

EXEC @hr = sp_OAMethod @QueryResults, 'Rows', @Rows OUT
IF @hr <> 0
BEGIN
    PRINT 'error get Rows'
    RETURN
END

EXEC @hr = sp_OACreate 'Excel.Application', @object OUT
IF @hr <> 0
BEGIN
    PRINT 'error create Excel.Application'
    RETURN
END

EXEC @hr = sp_OAGetProperty @object, 'WorkBooks', @WorkBooks OUT
IF @hr <> 0
BEGIN
    PRINT 'error create WorkBooks'
    RETURN
END

EXEC @hr = sp_OAGetProperty @WorkBooks, 'Add', @WorkBook OUT
IF @hr <> 0
BEGIN
    PRINT 'error with method Add'
    RETURN
END

EXEC @hr = sp_OAGetProperty @object, 'Range("A1")', @Range OUT
IF @hr <> 0
BEGIN
    PRINT 'error create Range'
    RETURN
END

SELECT @indRow = 1
SELECT @off_Row = 0
SELECT @off_Column = 1

WHILE (@indRow <= @Rows)
BEGIN
SELECT @indColumn = 1

WHILE (@indColumn <= @Columns)
BEGIN

EXEC @hr = sp_OAMethod @QueryResults, 'GetColumnString', @result_str OUT, @indRow, @indColumn
IF @hr <> 0
BEGIN
    PRINT 'error get GetColumnString'
    RETURN
END

EXEC @hr = sp_OASetProperty @Range, 'value', @result_str
IF @hr <> 0
BEGIN
    PRINT 'error set value'
    RETURN
END

EXEC @hr = sp_OAGetProperty @Range, 'Offset', @Range OUT, @off_Row, @off_Column
IF @hr <> 0
BEGIN
    PRINT 'error get Offset'
    RETURN
END

SELECT @indColumn = @indColumn + 1

END

SELECT @indRow = @indRow + 1
SELECT @code_str = 'Range("A' + LTRIM(str(@indRow)) + '")'
EXEC @hr = sp_OAGetProperty @object, @code_str, @Range OUT
IF @hr <> 0
BEGIN
    PRINT 'error create Range'
    RETURN
END

END

SELECT @result_str = 'exec master..xp_cmdshell ''del ' + @filename + ''', no_output'
EXEC(@result_str)
SELECT @result_str = 'SaveAs("' + @filename + '")'
EXEC @hr = sp_OAMethod @WorkBook, @result_str
IF @hr <> 0
BEGIN
    PRINT 'error with method SaveAs'
    RETURN
END

EXEC @hr = sp_OAMethod @WorkBook, 'Close'
IF @hr <> 0
BEGIN
    PRINT 'error with method Close'
    RETURN
END

EXEC @hr = sp_OADestroy @object
IF @hr <> 0
BEGIN
    PRINT 'error destroy Excel.Application'
    RETURN
END

EXEC @hr = sp_OADestroy @SQLServer
IF @hr <> 0
BEGIN
    PRINT 'error destroy SQLDMO.SQLServer'
    RETURN
END
GO

posted @ 2005-10-17 02:43 konhon 优华 阅读(407) | 评论 (0)编辑 收藏

数学函数 
  1.绝对值 
  S:select abs(-1) value 
  O:select abs(-1) value from dual 

  2.取整(大) 
  S:select ceiling(-1.001) value 
  O:select ceil(-1.001) value from dual 

  3.取整(小) 
  S:select floor(-1.001) value 
  O:select floor(-1.001) value from dual 

  4.取整(截取) 
  S:select cast(-1.002 as int) value 
  O:select trunc(-1.002) value from dual 

  5.四舍五入 
  S:select round(1.23456,4) value 1.23460 
  O:select round(1.23456,4) value from dual 1.2346 

  6.e为底的幂 
  S:select Exp(1) value 2.7182818284590451 
  O:select Exp(1) value from dual 2.71828182 

  7.取e为底的对数 
  S:select log(2.7182818284590451) value 1 
  O:select ln(2.7182818284590451) value from dual; 1 

  8.取10为底对数 
  S:select log10(10) value 1 
  O:select log(10,10) value from dual; 1 

  9.取平方 
  S:select SQUARE(4) value 16 
  O:select power(4,2) value from dual 16 

  10.取平方根 
  S:select SQRT(4) value 2 
  O:select SQRT(4) value from dual 2 

  11.求任意数为底的幂 
  S:select power(3,4) value 81 
  O:select power(3,4) value from dual 81 

  12.取随机数 
  S:select rand() value 
  O:select sys.dbms_random.value(0,1) value from dual; 

  13.取符号 
  S:select sign(-8) value -1 
  O:select sign(-8) value from dual -1 

  14.圆周率 
  S:SELECT PI() value 3.1415926535897931 
  O:不知道 

  15.sin,cos,tan 参数都以弧度为单位 
  例如:select sin(PI()/2) value 得到1(SQLServer) 

  16.Asin,Acos,Atan,Atan2 返回弧度 

  17.弧度角度互换(SQLServer,Oracle不知道) 
  DEGREES:弧度-〉角度 
  RADIANS:角度-〉弧度 

数值间比较 

  18. 求集合最大值 
  S:select max(value) value from 
  (select 1 value 
  union 
  select -2 value 
  union 
  select 4 value 
  union 
  select 3 value)a 

  O:select greatest(1,-2,4,3) value from dual 

  19. 求集合最小值 
  S:select min(value) value from 
  (select 1 value 
  union 
  select -2 value 
  union 
  select 4 value 
  union 
  select 3 value)a 

  O:select least(1,-2,4,3) value from dual 

  20.如何处理null值(F2中的null以10代替) 
  S:select F1,IsNull(F2,10) value from Tbl 
  O:select F1,nvl(F2,10) value from Tbl 

  21.求字符序号 
  S:select ascii('a') value 
  O:select ascii('a') value from dual 

  22.从序号求字符 
  S:select char(97) value 
  O:select chr(97) value from dual 

  23.连接 
  S:select '11'+'22'+'33' value 
  O:select CONCAT('11','22')  33 value from dual 

23.子串位置 --返回3 
  S:select CHARINDEX('s','sdsq',2) value 
  O:select INSTR('sdsq','s',2) value from dual 

  23.模糊子串的位置 --返回2,参数去掉中间%则返回7 
  S:select patindex('%d%q%','sdsfasdqe') value 
  O:oracle没发现,但是instr可以通过第四个参数控制出现次数 
  select INSTR('sdsfasdqe','sd',1,2) value from dual 返回6 

  24.求子串 
  S:select substring('abcd',2,2) value 
  O:select substr('abcd',2,2) value from dual 

  25.子串代替 返回aijklmnef 
  S:SELECT STUFF('abcdef', 2, 3, 'ijklmn') value 
  O:SELECT Replace('abcdef', 'bcd', 'ijklmn') value from dual 

  26.子串全部替换 
  S:没发现 
  O:select Translate('fasdbfasegas','fa','我' ) value from dual 

  27.长度 
  S:len,datalength 
  O:length 

  28.大小写转换 lower,upper 

  29.单词首字母大写 
  S:没发现 
  O:select INITCAP('abcd dsaf df') value from dual 

  30.左补空格(LPAD的第一个参数为空格则同space函数) 
  S:select space(10)+'abcd' value 
  O:select LPAD('abcd',14) value from dual 

  31.右补空格(RPAD的第一个参数为空格则同space函数) 
  S:select 'abcd'+space(10) value 
  O:select RPAD('abcd',14) value from dual 

  32.删除空格 
  S:ltrim,rtrim 
  O:ltrim,rtrim,trim 

  33. 重复字符串 
  S:select REPLICATE('abcd',2) value 
  O:没发现 

  34.发音相似性比较(这两个单词返回值一样,发音相同) 
  S:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe') 
  O:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe') from dual 
  SQLServer中用SELECT DIFFERENCE('Smithers', 'Smythers') 比较soundex的差 
  返回0-4,4为同音,1最高 

日期函数 
  35.系统时间 
  S:select getdate() value 
  O:select sysdate value from dual 

  36.前后几日 
  直接与整数相加减 

  37.求日期 
  S:select convert(char(10),getdate(),20) value 
  O:select trunc(sysdate) value from dual 
  select to_char(sysdate,'yyyy-mm-dd') value from dual 

  38.求时间 
  S:select convert(char(8),getdate(),108) value 
  O:select to_char(sysdate,'hh24:mm:ss') value from dual 

39.取日期时间的其他部分 
  S:DATEPART 和 DATENAME 函数 (第一个参数决定) 
  O:to_char函数 第二个参数决定 

  参数---------------------------------下表需要补充 
  year yy, yyyy 
  quarter qq, q (季度) 
  month mm, m (m O无效) 
  dayofyear dy, y (O表星期) 
  day dd, d (d O无效) 
  week wk, ww (wk O无效) 
  weekday dw (O不清楚) 
  Hour hh,hh12,hh24 (hh12,hh24 S无效) 
  minute mi, n (n O无效) 
  second ss, s (s O无效) 
  millisecond ms (O无效) 
  ---------------------------------------------- 

  40.当月最后一天 
  S:不知道 
  O:select LAST_DAY(sysdate) value from dual 

  41.本星期的某一天(比如星期日) 
  S:不知道 
  O:SELECT Next_day(sysdate,7) vaule FROM DUAL; 

  42.字符串转时间 
  S:可以直接转或者select cast('2004-09-08'as datetime) value 
  O:SELECT To_date('2004-01-05 22:09:38','yyyy-mm-dd hh24-mi-ss') vaule FROM DUAL; 

  43.求两日期某一部分的差(比如秒) 
  S:select datediff(ss,getdate(),getdate()+12.3) value 
  O:直接用两个日期相减(比如d1-d2=12.3) 
  SELECT (d1-d2)*24*60*60 vaule FROM DUAL; 

  44.根据差值求新的日期(比如分钟) 
  S:select dateadd(mi,8,getdate()) value 
  O:SELECT sysdate+8/60/24 vaule FROM DUAL; 

  45.求不同时区时间 
  S:不知道 
  O:SELECT New_time(sysdate,'ydt','gmt' ) vaule FROM DUAL; 

  -----时区参数,北京在东8区应该是Ydt------- 
  AST ADT 大西洋标准时间 
  BST BDT 白令海标准时间 
  CST CDT 中部标准时间 
  EST EDT 东部标准时间 
  GMT 格林尼治标准时间 
  HST HDT 阿拉斯加?夏威夷标准时间 
  MST MDT 山区标准时间 
  NST 纽芬兰标准时间 
  PST PDT 太平洋标准时间 
  YST YDT YUKON标准时间

posted @ 2005-10-13 07:14 konhon 优华 阅读(482) | 评论 (0)编辑 收藏

function SetSystemtime(ATime: TDateTime): Boolean;
var
  ADateTime: TSystemTime;
  yy, mon, dd, hh, min, ss, ms: Word;
begin
  decodedate(ATime, yy, mon, dd);
  decodetime(ATime, hh, min, ss, ms);
  with ADateTime do
  begin
    wYear := yy;
    wMonth := mon;
    wDay := dd;
    wHour := hh;
    wMinute := min;
    wSecond := ss;
    wMilliseconds := ms;
  end;
  Result := SetLocalTime(ADateTime);
  SendMessage(HWND_BROADCAST, WM_TIMECHANGE, 0, 0);
end;
posted @ 2005-10-12 00:49 konhon 优华 阅读(471) | 评论 (0)编辑 收藏

oracle入门知识

一个表空间只能属于一个数据库  
每个数据库最少有一个控制文件(建议3个,分别放在不同的磁盘上)  
每个数据库最少有一个表空间(SYSTEM表空间)  
建立SYSTEM表空间的目的是尽量将目的相同的表存放在一起,以提高使用效率,只应存放数据字典  
  
每个数据库最少有两个联机日志组,每组最少一个联机日志文件  
  
一个数据文件只能属于一个表空间  
一个数据文件一旦被加入到一个表空间中,就不能再从这个表空间中移走,也不能再加入到其他表空间中  
  
建立新的表空间需要建立新的数据文件  
  
COMMIT后,数据不一定立即写盘(数据文件)  
  
一个事务即使不被提交,也会被写入到重做日志中。  
  
oracle server可以同时启动多个数据库  
  
一套操作系统上可以安装多个版本的ORACLE数据库系统(UNIX可以,NT不可以)  
  
一套ORACLE数据库系统中可以有多个ORACLE数据库及其相对应的实例

posted @ 2005-10-06 03:38 konhon 优华 阅读(494) | 评论 (0)编辑 收藏

软件名称: 轻松Oracle 8开发
软件大小: 10970KB
软件语言: 简体中文
软件类别: 书籍教程\数据库类
软件简介: <br>
轻松Oracle 8开发这本书还不错,值得一看.<br>
http://www.xuanxi.net/Software/Catalog138/1214.html 下 载

========================================================
软件名称: 微软数据库开发梦工场简体中文版多媒体教学光盘-ORACLE
软件大小: 15344KB
软件语言: 简体中文
软件类别: 书籍教程\数据库类
软件简介: <br>
微软数据库开发梦工场简体中文版多媒体教学光盘-ORACLE这本书还不错,值得一看.<br>
http://www.xuanxi.net/Software/Catalog138/1213.html 下 载

========================================================
软件名称: 完全接触 Oracle
软件大小: 5813KB
软件语言: 简体中文
软件类别: 书籍教程\数据库类
软件简介: <br>
完全接触 Oracle这本书还不错,值得一看.<br>
http://www.xuanxi.net/Software/Catalog138/1212.html 下 载

========================================================
软件名称: 即学即用Oracle
软件大小: 17650KB
软件语言: 简体中文
软件类别: 书籍教程\数据库类
软件简介: <br>
即学即用Oracle这本书还不错,值得一看.<br>
http://www.xuanxi.net/Software/Catalog138/1211.html 下 载

========================================================
软件名称: OReilly.Classic.Shell.Scripting.Feb.2005
软件大小: 1049KB
软件语言: 简体中文
软件类别: 书籍教程\数据库类
软件简介: <br>
OReilly.Classic.Shell.Scripting.Feb.2005这本书还不错,值得一看.<br>
http://www.xuanxi.net/Software/Catalog138/1210.html 下 载

========================================================
软件名称: Oracle错误码大全
软件大小: 1374KB
软件语言: 简体中文
软件类别: 书籍教程\数据库类
软件简介: <br>
Oracle错误码大全这本书还不错,值得一看.<br>
http://www.xuanxi.net/Software/Catalog138/1209.html 下 载

========================================================
软件名称: oracle的入门心得
软件大小: 489KB
软件语言: 简体中文
软件类别: 书籍教程\数据库类
软件简介: <br>
oracle的入门心得这本书还不错,值得一看.<br>
http://www.xuanxi.net/Software/Catalog138/1208.html 下 载

========================================================
软件名称: oracle数据操作和控制语言详解
软件大小: 10KB
软件语言: 简体中文
软件类别: 书籍教程\数据库类
软件简介: <br>
oracle数据操作和控制语言详解这本书还不错,值得一看.<br>
http://www.xuanxi.net/Software/Catalog138/1207.html 下 载

========================================================
软件名称: oracle数据库网络的安装和配置
软件大小: 1076KB
软件语言: 简体中文
软件类别: 书籍教程\数据库类
软件简介: <br>
oracle数据库网络的安装和配置这本书还不错,值得一看.<br>
http://www.xuanxi.net/Software/Catalog138/1206.html 下 载

========================================================
软件名称: Oracle数据库系统应用实例集锦与编程技巧
软件大小: 5893KB
软件语言: 简体中文
软件类别: 书籍教程\数据库类
软件简介: <br>
Oracle数据库系统应用实例集锦与编程技巧这本书还不错,值得一看.<br>
http://www.xuanxi.net/Software/Catalog138/1205.html 下 载

========================================================
软件名称: Oracle数据库系统
软件大小: 5399KB
软件语言: 简体中文
软件类别: 书籍教程\数据库类
软件简介: <br>
Oracle数据库系统这本书还不错,值得一看.<br>
http://www.xuanxi.net/Software/Catalog138/1204.html 下 载

========================================================
软件名称: oracle数据库管理员教程
软件大小: 191KB
软件语言: 简体中文
软件类别: 书籍教程\数据库类
软件简介: <br>
oracle数据库管理员教程这本书还不错,值得一看.<br>
http://www.xuanxi.net/Software/Catalog138/1203.html 下 载

========================================================
软件名称: oracle数据库管理
软件大小: 27736KB
软件语言: 简体中文
软件类别: 书籍教程\数据库类
软件简介: <br>
oracle数据库管理这本书还不错,值得一看.<br>
http://www.xuanxi.net/Software/Catalog138/1202.html 下 载

========================================================
软件名称: oracle数据库dba管理手册
软件大小: 50522KB
软件语言: 简体中文
软件类别: 书籍教程\数据库类
软件简介: <br>
oracle数据库dba管理手册这本书还不错,值得一看.<br>
http://www.xuanxi.net/Software/Catalog138/1201.html 下 载

========================================================
软件名称: Oracle开发
软件大小: 5572KB
软件语言: 简体中文
软件类别: 书籍教程\数据库类
软件简介: <br>
Oracle开发这本书还不错,值得一看.<br>
http://www.xuanxi.net/Software/Catalog138/1200.html 下 载

========================================================
软件名称: oracle常用傻瓜问题1000问
软件大小: 25KB
软件语言: 简体中文
软件类别: 书籍教程\数据库类
软件简介: <br>
oracle常用傻瓜问题1000问这本书还不错,值得一看.<br>
http://www.xuanxi.net/Software/Catalog138/1199.html 下 载

========================================================
软件名称: ORACLE培训教材
软件大小: 95KB
软件语言: 简体中文
软件类别: 书籍教程\数据库类
软件简介: <br>
ORACLE培训教材这本书还不错,值得一看.<br>
http://www.xuanxi.net/Software/Catalog138/1198.html 下 载

========================================================
软件名称: oracle初学者1000问
软件大小: 35KB
软件语言: 简体中文
软件类别: 书籍教程\数据库类
软件简介: <br>
oracle初学者1000问这本书还不错,值得一看.<br>
http://www.xuanxi.net/Software/Catalog138/1197.html 下 载

========================================================
软件名称: oracle专家高级编程
软件大小: 30482KB
软件语言: 简体中文
软件类别: 书籍教程\数据库类
软件简介: <br>
oracle专家高级编程这本书还不错,值得一看.<br>
http://www.xuanxi.net/Software/Catalog138/1196.html 下 载

========================================================
软件名称: Oracle_Errors
软件大小: 1373KB
软件语言: 简体中文
软件类别: 书籍教程\数据库类
软件简介: <br>
Oracle_Errors这本书还不错,值得一看.<br>
http://www.xuanxi.net/Software/Catalog138/1195.html 下 载

========================================================
软件名称: OracleUML建模
软件大小: 8397KB
软件语言: 简体中文
软件类别: 书籍教程\数据库类
软件简介: <br>
OracleUML建模这本书还不错,值得一看.<br>
http://www.xuanxi.net/Software/Catalog138/1194.html 下 载

========================================================
软件名称: Oraclea Call Interface Programmer’s Guide
软件大小: 2340KB
软件语言: 简体中文
软件类别: 书籍教程\数据库类
软件简介: <br>
Oraclea Call Interface Programmer’s Guide这本书还不错,值得一看.<br>
http://www.xuanxi.net/Software/Catalog138/1193.html 下 载

========================================================
软件名称: oracle9i数据库系统培训教程
软件大小: 24785KB
软件语言: 简体中文
软件类别: 书籍教程\数据库类
软件简介: <br>
oracle9i数据库系统培训教程这本书还不错,值得一看.<br>
http://www.xuanxi.net/Software/Catalog138/1192.html 下 载

========================================================
软件名称: Oracle9i应用服务器详解
软件大小: 25592KB
软件语言: 简体中文
软件类别: 书籍教程\数据库类
软件简介: <br>
Oracle9i应用服务器详解这本书还不错,值得一看.<br>
http://www.xuanxi.net/Software/Catalog138/1191.html 下 载

========================================================
软件名称: Oracle9iAS Portal 宝典
软件大小: 30270KB
软件语言: 简体中文
软件类别: 书籍教程\数据库类
软件简介: <br>
Oracle9iAS Portal 宝典这本书还不错,值得一看.<br>
http://www.xuanxi.net/Software/Catalog138/1190.html 下 载

========================================================
软件名称: oracle9i 数据库设计指引全集
软件大小: 92KB
软件语言: 简体中文
软件类别: 书籍教程\数据库类
软件简介: <br>
oracle9i 数据库设计指引全集这本书还不错,值得一看.<br>
http://www.xuanxi.net/Software/Catalog138/1189.html 下 载

========================================================
软件名称: ORACLE9i Windows安装手册
软件大小: 609KB
软件语言: 简体中文
软件类别: 书籍教程\数据库类
软件简介: <br>
ORACLE9i Windows安装手册这本书还不错,值得一看.<br>
http://www.xuanxi.net/Software/Catalog138/1188.html 下 载

========================================================
软件名称: Oracle8最新教程
软件大小: 10217KB
软件语言: 简体中文
软件类别: 书籍教程\数据库类
软件简介: <br>
Oracle8最新教程这本书还不错,值得一看.<br>
http://www.xuanxi.net/Software/Catalog138/1187.html 下 载

========================================================
软件名称: ORACLE8i_9i数据库基础
软件大小: 551KB
软件语言: 简体中文
软件类别: 书籍教程\数据库类
软件简介: <br>
oracle8i_9i数据库基础这本书还不错,值得一看.<br>
http://www.xuanxi.net/Software/Catalog138/1186.html 下 载

========================================================
软件名称: ORACLE8 UML 对象建模设计
软件大小: 9728KB
软件语言: 简体中文
软件类别: 书籍教程\数据库类
软件简介: <br>
ORACLE8 UML 对象建模设计这本书还不错,值得一看.<br>
http://www.xuanxi.net/Software/Catalog138/1185.html 下 载

最新的书籍教程 更新时间:2005-9-11 更多的下载请到http://www.xuanxi.net 轩溪软件园

posted @ 2005-09-29 03:05 konhon 优华 阅读(543) | 评论 (0)编辑 收藏

1.Powerdesigner使用建议
1.1业务规则的使用(Business Rule)
对于一些业务逻辑可能出现在多个数据表中,建议封装成Business Rule,这样便于业务逻辑的重新使用,也便于业务逻辑的维护。
为了便于维护业务逻辑,可以考虑将Business Rule和Domains结合起来使用。将业务Business Rule应用到Domains上,然后再把Domains应用到数据表的字段上。
例如:在拆迁项目中,拆迁业务部分,管理参数业务部分,房源业务部分,拆迁合同部分的数据表中都有楼层这个字段,因此先一个Business Rule,然后定义一个Domain,这样相应的数据表的字段就可以使用这个Domain了。
1.2.自定义数据类型(Domains)的使用
oralce提供了一些内置的数据类型,但是用户也可以根据业务的需要,定义自定义的数据类型。
在自定义数据类型里面包装业务逻辑。
正如上面的房屋楼层,我们可以定义一个独立的数据类型(Domain)维护,然后在相关数据表的
字段上使用这个自定义数据类型。
一般在定义自己的数据类型时候,可以在oracle基本类型上定义,然后可以加上一些standard check或者Business Rules。
比如:在拆迁项目中,面积类别这个字段在很多数据表都出现了,可以作为一个单独的数据类型类维护,定义一个” 面积类别” Domains(包含的种类有:0 --- 厅房面积,1 --- 使用面积,2 --- 单元面积,,3 --- 总建筑面积,4 --- 分摊面积)。而且由于Powerdesigner的提供关联作用,这样便于当业务逻辑发生了变动,能够很快查询出那些对象受到影响。
1.3序列号(Sequence)的使用
在powersigner的模型里面定义一堆了Sequence,接下来的是要把他们和数据表的相关字段关联起来,特别是那些用于多个数据表字段的Sequence。
一个数据表原则上只允许一个字段使用Sequence,并且在数据表的字段使用Sequence前,应该把该Sequence添加到数据表的Extended Dependencies中。
如果一个数据表有2个字段或者更多字段使用了Sequence,那模型检查时会给出提示信息。
使用的规则一般是只能应用到数据表的主键字段上。
主键字段建议是 数据表+“ID“或者 “编号“构成。
例如:“房屋整合面积“ 数据表,那它的主键字段=房屋整合面积编号,对应的Sequence为
SEQ_房屋整合面积。其它数据表可能也使用到了这个Sequence,那也需要在使用前设置引用关系。
(在数据表的Extended Dependencies 上设置引用关系)
1.4 Oracle Package的使用
在Oracle Package里面可以定一些procedure ,但是Oracle包引用的数据库对象到底有哪些呢,这些信息建议手动维护起来。特别是Oracle Package使用了哪些数据表,视图,以及Oracle Packag等信息建议维护起来。
1.5包的使用
PowerDesigner的包相当于文件夹。用户可以把它当作一个维护业务逻辑的容器。PowerDesigner包一般建议按照业务模块来建立。如果模块需要细分,可以考虑建立PowerDesigner子包来完成。
建议容器里保存的是模型对象的快捷方式。原始信息建议不要放到容器里面。因为在要是把这些信息放到容器里,在PowerDesigner的模型合并或者逆向工程时,这种方式的信息可能得不到维护。
PowerDesigner的包下面的PhysicalDiagram,建议采用象ERWin的Subject Area那样,按照某个主题或者业务角度的方式来组织PhysicalDiagram包含的对象,使得每个PhysicalDiagram的功能明确。

1.6.视图(View)的使用
视图一般是数据表或者视图上建立得来的(当然也可能引用了某个存储过程)。一般视图的模型中应该维护视图的数据来源的引用信息。
在我们现在的项目中数据库模型没有对视图进行维护,为此需要在建立视图的Powerdesigner
模型。
我在Powerdesigner9.5环境下通过逆向工程不能够获得视图(view)的脚本,通过修改相关配
置参数,还是不能够获得脚本。
可以通过以下2方法获得视图(view)的脚本。
方法1:使用powerdesigner8.0的逆向工程获得视图的脚本,然后在Powerdesigner9.5中把视
图的模型合并进来,这样就可以对视图进行维护了。
方法2:使用Erwin逆向工程获得视图的Erwin模型,然后再把模型保存为ERX类型的文件
在Powerdesigner9.5中导入该文件,然后进行合并模型就可以了
PowerDesigner的视图模型处理能力比较差,不能构维护视图的依赖关系(也就是建立视图对数据源的依赖关系),这一点明显不如ERWin。

1.7.同义词(synonym)的使用
同义词相当于给数据库对象一个别名,提供了位置和数据的独立性。在跨数据库用户访问对象时,可以考虑建立同义词结合权限分配,简化数据库对象的访问。

1.8.数据表的使用
数据表的注释语句的更新。
业务背景:
在我们的项目中,Erwin模型中的数据表的注释语句没有同步到Oracle数据库。现在需要更数据库中的数据表的注释语句。
可能可以采取的实现方法:
方法1:Erwin直接正向工程,但是从Erwin直接正向工程由于注释语句中有回车符号,更新会失败。
方法2:如果把Erwin模型转换成为powerdesigner模型再更新数据表的注释语句,这样就可以避免回车符号的问题,按正常情况是可以行得通的,但是由于Erwin模型中的逻辑模型和物理模型不一致,甚至它们出现的顺序不一致,这样获得powerdesigner模型就不正确了,生成的修改数据库的脚本也就不正确了。
实际采用的方法:
把Erwin模型转换成powerdesigner模型在Erwin中保存为ERX类型,然后在PowerDesigner导入模型),并且把文件保存为PDM类型(XML格式),删除模型中的视图,domains,Business Rule,reference等信息,只留下相关数据表本身的信息,然后把模型文件的后缀修改XML,并且采用XMLSPY生成这个文件的DTD文件,再采用Java编写了一个基于SAX的程序去解析XML文件,把各个数据表以及字段的注释语句提取出来,然后更新数据库中数据表和字段的注释语句,这样就可以了。

1.9.ERWin升级到PowerDesigner的相关问题
1.9.1 Domain的升级
从Erwin3.52升级到PowerDesigner9.5时,Domain信息和数据表的关联关系会丢失,需要手动重新添加2者间的关系。当然可以通过编程修改PowerDesigner的模型文件,添加2者之间的关联关系。一般的PowerDesigner模型文件较大,只要有个几十张数据表肯定模型文件有1MB,建议采用SAX的方式添加信息。
注意:添加数据表字段使用的Domain时候,需要设置数据表对Domain的引用关系(也就是Extended Dependencies)。
1.9.2 Business Rule的升级
从Erwin3.52升级到Powerdesigner9.5,Business Rule的表达式(脚本)需要修改的,把所有的
Business Rule的表达式中的@column 修改成%COLUMN%
具体实现的方式,可以直接在Powerdesigner9.5里面修改;或者把模型保存为XML格式(文件类为 .pdm),通过UltraEdit或者XMLSpy等工具来修改,一个查找替换旧搞定了。当然的注意
只能修改<c:BusinessRules> </c:BusinessRules>里面的内容,否则会修改一些不应该修改的地方。
同Domain一样,从Erwin3.52升级到PowerDesigner9.5时,Business信息和数据表的关联关系也会丢失。如果Business Rule 不是太多建议手动修改模型文件。

1.9.3.Sequence的升级
.Sequence的升级建议采用和Domain的方式,编程实现维护。
1.9.4.物理图的升级
从Erwin3.52升级到Powerdesigner9.5,物理图同样能够倒入Powerdesigner9.5中,但是Powerdesigner9.5的升级功能有些问题:在生成的物理图中数据表的信息有些问题:物理图中的数据表的字段显示不完全,而且很多时候数据表字段的类型都不能显示完全。我使用java采用sax的方式把升级后的模型文件进行解析,然后重新生成物理图中数据表的位置信息(数据表的2个坐标:左上角坐标,右下角坐标);另外根据业务需要可以生成自己的Powerdesigner9.5包并且可以创建物理图,把数据表添加到物理图上。

1.9.5.其他说明
从Erwin3.52升级到Powerdesigner9.5,我写了一些java程序解决了相关问题,如果哪位同行遇到相似的问题
可以交流一下。
2.关于powerdesigner中的数据结构的变更管理
目前拆迁项目中数据结构的有些失控,在结合powerdesigner包的概念的基础山上提出如下一些建议。
2.1.数据结构按照业务模块进行维护
模型中所有的数据结构都在一个文件中,而且在顶层文件夹中各个业务模块维护的是数据结构的快捷方式。
2.2.数据结构按照其生命周期进行分类管理。
在各个业务模块的包下面建立如下的包:
2.2.1临时测试数据结构:
是一些当前业务模块测试时使用的数据结构,可以随时被删除
2.2.2讨论中数据结构:
是数据结构处于讨论中,还没有确定下来。
2.2.3需要更新的数据结构:
是数据结构已经确定下来,但是还没有更新到数据库中。
2.2.4正式数据结构:
在数据库中被业务正常使用的数据结构
2.2.5作废中的数据结构:
在数据库中以前被业务正常使用,现在已经不再使用,但是还没有进行
被作废的数据表中数据的迁移,没有完全作废的数据结构。如果要把这些数据结构进行作废,
需要先进行数据迁移,以及其他相关处理。
2.2.6已经作废的数据结构:
在数据库已经不再被使用的业务数据表,相关的数据迁移已经完成,但是数据表还没有删除,
相关的文档没有更新。

posted @ 2005-09-28 06:51 konhon 优华 阅读(480) | 评论 (0)编辑 收藏

“你不必严格遵守这些原则,违背它们也不会被处以宗教刑罚。但你应当把这些原则看成警铃,若违背了其中的一条,那么警铃就会响起。”

----------Arthur J.Riel

(1)所有数据都应该隐藏在所在的类的内部。

(2)类的使用者必须依赖类的共有接口,但类不能依赖它的使用者。

(3)尽量减少类的协议中的消息。

(4)实现所有类都理解的最基本公有接口[例如,拷贝操作(深拷贝和浅拷贝)、相等性判断、正确输出内容、从ASCII描述解析等等]。

(5)不要把实现细节(例如放置共用代码的私有函数)放到类的公有接口中。
如果类的两个方法有一段公共代码,那么就可以创建一个防止这些公共代码的私有函数。

(6)不要以用户无法使用或不感兴趣的东西扰乱类的公有接口。

(7)类之间应该零耦合,或者只有导出耦合关系。也即,一个类要么同另一个类毫无关系,要么只使用另一个类的公有接口中的操作。

(8)类应该只表示一个关键抽象。
包中的所有类对于同一类性质的变化应该是共同封闭的。一个变化若对一个包影响,则将对包中的所有类产生影响,而对其他的包不造成任何影响 .

(9)把相关的数据和行为集中放置。
设计者应当留意那些通过get之类操作从别的对象中获取数据的对象。这种类型的行为暗示着这条经验原则被违反了。

(10)把不相关的信息放在另一个类中(也即:互不沟通的行为)。
朝着稳定的方向进行依赖.

(11)确保你为之建模的抽象概念是类,而不只是对象扮演的角色。

(12)在水平方向上尽可能统一地分布系统功能,也即:按照设计,顶层类应当统一地共享工作。

(13)在你的系统中不要创建全能类/对象。对名字包含Driver、Manager、System、Susystem的类要特别多加小心。
规划一个接口而不是实现一个接口。

(14)对公共接口中定义了大量访问方法的类多加小心。大量访问方法意味着相关数据和行为没有集中存放。

(15)对包含太多互不沟通的行为的类多加小心。
这个问题的另一表现是在你的应用程序中的类的公有接口中创建了很多的get和set函数。

(16)在由同用户界面交互的面向对象模型构成的应用程序中,模型不应该依赖于界面,界面则应当依赖于模型。

(17)尽可能地按照现实世界建模(我们常常为了遵守系统功能分布原则、避免全能类原则以及集中放置相关数据和行为的原则而违背这条原则) 。

(18)从你的设计中去除不需要的类。
一般来说,我们会把这个类降级成一个属性。

(19)去除系统外的类。
系统外的类的特点是,抽象地看它们只往系统领域发送消息但并不接受系统领域内其他类发出的消息。

(20)不要把操作变成类。质疑任何名字是动词或者派生自动词的类,特别是只有一个有意义行为的类。考虑一下那个有意义的行为是否应当迁移到已经存在或者尚未发现的某个类中。

(21)我们在创建应用程序的分析模型时常常引入代理类。在设计阶段,我们常会发现很多代理没有用的,应当去除。

(22)尽量减少类的协作者的数量。
一个类用到的其他类的数目应当尽量少。

(23)尽量减少类和协作者之间传递的消息的数量。

(24)尽量减少类和协作者之间的协作量,也即:减少类和协作者之间传递的不同消息的数量。

(25)尽量减少类的扇出,也即:减少类定义的消息数和发送的消息数的乘积。

(26)如果类包含另一个类的对象,那么包含类应当给被包含的对象发送消息。也即:包含关系总是意味着使用关系。

(27)类中定义的大多数方法都应当在大多数时间里使用大多数数据成员。

(28)类包含的对象数目不应当超过开发者短期记忆的容量。这个数目常常是6。
当类包含多于6个数据成员时,可以把逻辑相关的数据成员划分为一组,然后用一个新的包含类去包含这一组成员。

(29)让系统功能在窄而深的继承体系中垂直分布。

(30)在实现语义约束时,最好根据类定义来实现。这常常会导致类泛滥成灾,在这种情况下,约束应当在类的行为中实现,通常是在构造函数中实现,但不是必须如此。

(31)在类的构造函数中实现语义约束时,把约束测试放在构造函数领域所允许的尽量深的包含层次中。

(32)约束所依赖的语义信息如果经常改变,那么最好放在一个集中式的第3方对象中。

(33)约束所依赖的语义信息如果很少改变,那么最好分布在约束所涉及的各个类中。

(34)类必须知道它包含什么,但是不能知道谁包含它。

(35)共享字面范围(也就是被同一个类所包含)的对象相互之间不应当有使用关系。

(36)继承只应被用来为特化层次结构建模。

(37)派生类必须知道基类,基类不应该知道关于它们的派生类的任何信息。

(38)基类中的所有数据都应当是私有的,不要使用保护数据。
类的设计者永远都不应该把类的使用者不需要的东西放在公有接口中。

(39)在理论上,继承层次体系应当深一点,越深越好。

(40)在实践中,继承层次体系的深度不应当超出一个普通人的短期记忆能力。一个广为接受的深度值是6。

(41)所有的抽象类都应当是基类。

(42)所有的基类都应当是抽象类。

(43)把数据、行为和/或接口的共性尽可能地放到继承层次体系的高端。

(44)如果两个或更多个类共享公共数据(但没有公共行为),那么应当把公共数据放在一个类中,每个共享这个数据的类都包含这个类。

(45)如果两个或更多个类有共同的数据和行为(就是方法),那么这些类的每一个都应当从一个表示了这些数据和方法的公共基类继承。

(46)如果两个或更多个类共享公共接口(指的是消息,而不是方法),那么只有他们需要被多态地使用时,他们才应当从一个公共基类继承。

(47)对对象类型的显示的分情况分析一般是错误的。在大多数这样的情况下,设计者应当使用多态。

(48)对属性值的显示的分情况分析常常是错误的。类应当解耦合成一个继承层次结构,每个属性值都被变换成一个派生类。

(49)不要通过继承关系来为类的动态语义建模。试图用静态语义关系来为动态语义建模会导致在运行时切换类型。

(50)不要把类的对象变成派生类。对任何只有一个实例的派生类都要多加小心。

(51)如果你觉得需要在运行时刻创建新的类,那么退后一步以认清你要创建的是对象。现在,把这些对象概括成一个类。

(52)在派生类中用空方法(也就是什么也不做的方法)来覆写基类中的方法应当是非法的。

(53)不要把可选包含同对继承的需要相混淆。把可选包含建模成继承会带来泛滥成灾的类。

(54)在创建继承层次时,试着创建可复用的框架,而不是可复用的组件。

(55)如果你在设计中使用了多重继承,先假设你犯了错误。如果没犯错误,你需要设法证明。

(56)只要在面向对象设计中用到了继承,问自己两个问题:(1)派生类是否是它继承的那个东西的一个特殊类型?(2)基类是不是派生类的一部分?

(57)如果你在一个面向对象设计中发现多重继承关系,确保没有哪个基类实际上是另一个基类的派生类。

(58)在面向对象设计中如果你需要在包含关系和关联关系间作出选择,请选择包含关系。

(59)不要把全局数据或全局函数用于类的对象的薄记工作。应当使用类变量或类方法。

(60)面向对象设计者不应当让物理设计准则来破坏他们的逻辑设计。但是,在对逻辑设计作出决策的过程中我们经常用到物理设计准则。

(61)不要绕开公共接口去修改对象的状态。

posted @ 2005-09-27 04:13 konhon 优华 阅读(494) | 评论 (0)编辑 收藏

仅列出标题
共21页: First 上一页 10 11 12 13 14 15 16 17 18 下一页 Last