表的设计规范
遵循如下三点原则:第一:有无原则:除临时表和外部表,以及流水表,日志表外,其他表都要建立主键;第二:构成原则:主键不能使用含有实际语义的列,应该增加一个xx_id字段做主键,类型为number,取值来自序列sequence;第三:创建原则:对于500万以上的表,请数据组参与设计实施,采用先建唯一索引再添加主键约束的方式来创建主键;
对于实体表,主键就是一列,就是没有任何语义的自增的NUMBER列,对于关系表,主键就是相关实体表主键形成的复合主键,是多列;
原则 | 每个表,每个字段都要有注释,说明其含义,对于冗余字段还要特别说明其维护方法,外键字段说明参照与那个表 |
衡量 | 原则上谁设计谁注释 |
方法 | 查询字典表user_tab_comments和user_col_comments可知道表和字段的注释信息 |
实施 | 对表添加注释: SQL>comment on table is 'xx'; 对字段添加注释: SQL>comment on column . is 'xx'; |
原则 | 一个表中的所有字段,应当能存储在一个数据块中(BLOCK),也即:表的单行字段总长度减去pctfree) |
衡量 | 对不含有大对象数据类型字段的表,字段数大于50个的,请数据组参与设计 |
方法 | 查询字典表USER_TAB_COLUMNS中的字段DATA_LENGTH得到表中所有字段的总长度,再依据db_block和表的pctfree参数可以判断是否一个数据行可以存储在一个数据块(BLOCK)中 |
实施 | 如果所有字段的总长度超出了一个数据块,那么需要将该表拆分成两个(甚至多个)表,拆分的依据是字段的频繁使用程度,也就是频繁使用的字段在一个表中,很少被使用的字段放在另一个表中,他们之间使用相同的主键值,用主外键关联。这点就是“一个表所含字段访问频繁度的规范” |
原则 | 一个表中的各字段的访问频繁度应该基本一致 |
衡量 | 如果一个表的字段数超过50个, 请数据组参与审核 |
方法 | 如果一个表的字段数过多超过50个,并且依据业务逻辑确定该表中一些字段频繁被访问,另一些字段则很少被访问,则该表需要做拆分处理,这在OLAP系统中比较常见; 目的:这样可以避免读取频繁信息时多读取很少被访问的信息,可以提高IO性能,减少内存耗费; |
实施 | 将访问频繁度相差太远的字段拆分到两个表中,一个表存频繁访问的字段,另一个表存很少被访问的字段; |
原则 | 一个非分区表中的数据量不要超过500万 |
衡量 | 一个非分区表中的数据量超过500万, 请数据组参与设计成分区表,如果该表数据量超过5000万,请DBA参与设计 |
方法 | 在系统上线前,通过对业务分析,判断一个表的数据量;在系统上线后,可以通过exp的日志,Top性能SQL,count(1)来发现数据量大的表 |
实施 | 将这些表进行分区,具体方法请参看分区表的设计规范 |
原则 | 存储图片,视频,音频,文件,500字节以上文本等占用太多空间的字段(大对象字段),不能和其他字段存储在一个表中 |
衡量 | 含有大对象(BLOB,CLOB)字段的表设计和存储请数据组参与设计 |
方法 | 方法一:数据库存储,可以重新建一个表专门存储该大对象字段,该表基本为两个字段,一个为大对象编号ID为主键,一个为大对象内容本身,并将该主键在原表中作外键关联,该大对象表存储在单独的表空间中;方法二:操作系统存储,将这些文件存储在操作系统空间中,大对象字段存储该文件的全路径名 比较:如果该大对象字段常被修改,那么采用方法一; 如果该大对象信息为静态,加载后基本不变,那么可以采用方法二,它有一个致命缺点就是信息存储在数据库外部,不安全,容易丢失。 |
字典信息表和需要使用增量同步的表必须增加如下属性:
属性名 | 类型 | 取值 | 说明 |
Status | Char(1) | Y/N :Y为激活N为作废,默认为Y | 标识该行是否使用。用于软删除,软删除需将主键和唯一约束列添加随机数后缀。 |
Create_time | Date | 默认为sysdate | 创建时间 |
Update_time | Date | 默认为sysdate | 最后修改时间 |
原则 | 依据表的DML频度而使用不同的表空间 |
衡量 | 表空间的规划由建库人员完成 |
方法 | 为了减少空间碎片问题,(1)将很少被DML(增删改)的静态表,放在一组表空间中;(2)将只发生INSERT的表放到一组表空间中,(3)而将常发生两种以上DML操作的动态表放在另一组表空间中,这三组表空间不能相交 |
实施 | 在上线前,依据需求分析确定动态表和静态表,将他们做最分离;上线运行之后,依据数据库性能分析得到的信息来区分动态表和静态表 |
原则 | 表和索引原则上应该使用不同的表空间存储,并且不同DML频度的表的索引,放在不同的表空间中 |
衡量 | 表空间的规划有数据组或者DBA实施 |
方法 | 绝大多数情况下,动态表的索引必然是动态的,静态表的索引必然是静态的,依据对表的分析来确定索引的动静性 |
实施 | 将动态表的索引放在一组表空间中,静态表的索引放在另一个表空间中,两组不相交。而且和表所在的表空间也不相交。 |
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/27573546/viewspace-761474/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/27573546/viewspace-761474/