ORACLE数据库中
表是最基本的内容
可以说
表设计的好坏直接跟数据库的性能相关
所以
在设计表的时候
除了要遵循其固有的数据库准则之外
还需要看个人的数据库管理经验
下面我就把这些经验分享一下
或许对大家有所帮助
一 表该存放在哪里?
我们都知道在ORACLE数据库中使利用空间这个概念来管理表对象的在数据库创建的时候数据库中已经建立了一些表空间那么当我们新建立表的时候这个新表的位置该放在什么地方呢?这就好像吃饭时的坐的位置一样是有讲究的一般来说我们在新建表的时候至少要遵循如下建议
一是在数据库创建的时候在数据库中已经有了一个SYSTEM的表空间一般情况下这个表空间中只包含数据字典及Oracle系统对象如果我们将我们的表建立在这个空间上的话那是要降低数据库的性能的所以一般我们是不建议用户把表格建立在这个空间上但是若我们不只一个人维护数据库如有八个人共同设计数据库系统时如何才能保证其他用户不在SYSTEM表空间中建立数据库表格呢?最好的办法就是通过权限控制如我们可以给每个数据库设计人员指定一个默认的表空间让他们只能在这个表空间中建立表格如此的话就能防止他们在SYSTEM表空间中建立自己的数据表格从而对数据库的运行性能产生不良影响所以若给每个用户设置默认表空间的话那么用户在建立具体的表时不用具体指定表空间了
二是我们在为某个应用设计数据库的时候最好先对表的空间进行规划一般情况下不要把数据表随意的分散到不同的表空间中去如我们在为一个ERP系统设计数据库的时候若把采购部门相关的表跟销售部门相关的表放到两个不同的表空间中去这是不明智的做法这么处理的话会降低某些数据库管理和维护操作的效率如数据的备份与恢复操作;而且也无法集中管理属于某个特定应用的数据所以我们一般建议在规划数据库表空间的时候把相同应用的表放在同一个表空间中去如果要区分不同部门或者不同模块的表的话我们可以在表的命名上动脑子如我们在设计ERP系统的数据库中可以根据其应用模块的不同在前面加上前缀来进行识别如跟系统基本配置相关的表我们可以用AD为前缀;而跟销售部门相关的表我们可以加上SA前缀等等如此的话这些表具体是属于哪个模块的就一清二楚了完全没有必要为此设置不同的表空间这是ORACLE数据库初学者经常会犯的错误主要是对ORACLE表空间的定义不是很熟悉所导致的
二 对预计存储数量比较大的表时要给与额外的重视
有些表非常的大我们这边说的大不一定是说结构复杂而是指在这个表格中预期会存储比较多的数据为了提高对这个表格的处理效率我们在事先要做出一定的安排否则的话后续对这些大表进行查询插入等操作的话速度会很慢所以我们就有必要在数据库设计的时候先预先估计一下表的数据存储量把一些数据量大的表格做一些额外的设置如在ERP软件的数据库设置中一般来说产品数据与物料清单数据这两个表的数据量会比较大;而从长远看的话销售订单采购订单生产订单记账凭证等这种单据类相关的表格其数据量也会比较大一年两年可能感觉不出来但是到十年后这个纪录数量就会很庞大而像ERP系统这种大型的信息化管理项目用个几十年时很正常的事情而且为了记录的完整性也不建议用户把以前的数据删除所以为这种应用进行数据库设计的时候要充分考虑这些大表的性能问题
具体的来说设计大表的时候可以考虑遵循如下的建议
一是不要为大表设置存储的限制在ORACLE数据库中可以为每张表格设置存储配额限制如此的话表最大容量就不能超过这个限制对于一些数据容量比较小的表格这么设置时合理的可以提高空间的利用率但是若数据量比较大的话就不建议事先设置表的存储空间了如ERP系统的销售订单表其刚开始可能记录量很小第一年预计只有G的记录容量但是估计在十年后这个记录容量就会达到G了在这种情况下我们怎么来给其设置存储空间呢?一开就设置G空间这也是不合理的而且设置存储空间就意味着有可能产生存储碎片从而影响到数据查询的效率所以在数据库表的设计过程中若某些应用的表可能会有比较大的数据容量时建议不要对其存储空间做出任何的限制
二是要为这大表分配足够的临时空间如我们使用ERP系统时要查询产品资料信息我们都知道产品信息的话有些企业这个纪录数非常的庞大而且在查询时我们还会经常的进行排序操作如有时候会按照产品编码对查询出来的数据进行排序当记录少的话还好;但是当记录多的话这个排序动作要求具有比较大的临时存储空间所以当某个表预计会有很大的记录数量的时候我们就要给其分配足够多的临时空间临时空间的存储参数设置取决于临时表空间的默认储存参数设置我们可以更改这些参数以达到我们对要求若没有给大表分配足够多的临时空间的话则排序的动作将会很慢而且很可能不成功
三是要考虑将表与表的索引分离存放大表所对应的索引通常也比较大一般来说索引的数量是随着表记录的数量增加而增加两者是接近于一个正比例的关系所以通常表的记录容量大的时候索引数量也会很庞大针对这种情况我们考虑突破我们上面讲的表空间的规则定义而考虑把表和他的索引分别存储于不同的表空间中甚至在条件允许的情况下分别存储于不同的硬盘中这么做的好处是什么呢?最大的好处是让索引比较容易的获得所需要的连续的存储空间从而提高输入输入的效率通俗的说就是可以提高数据的查询效率如不这么处理的话查询大容量的记录的话数据库可能需要花费秒;而如此设计的话就可能把时间缩短为秒这是一个很明显的性能改善
三 如何给表命名?
上面我在讲如何为表分配存储空间的时候已经讲到过这方面的问题下面我就将对这个问题进行详细的描述以帮助数据库管理员掌握一套好的数据库命名规则
首先毋庸置疑的在为标命名的时候要遵循ORACLE数据库的基本命名规则如不能以数字开头为表命名如不能利用数据库的关键字为表命名如表的名字不能重复等等这些是最基本的要求就不用我多费口舌了除了要遵循这些基本的命名规则外在实际工作中为了数据库后续的维护等方面出发我们还是要遵循一些额外的规则这些规则跟ORACLE定义的规则不同我们所讲的规则没有约束力可以说只是业界的一些共识而已你若不怎么处理ORACLE数据库也不会说你错误只是后续维护的时候会比较麻烦而已
一是在对数据库命名的时候最好能跟体现表的分类关系如最常见的我们在设计数据库的时候表都是按系统的具体模块来区分的如根据前端系统要求的不同数据库的表大致可以分为系统基本配置表销售模块表采购模块表报表模块表等等我们可以根据这些模块的不同分别给与不同的前缀来区分这么做的好处是很明显的如一看到表最大名字就可以知道这个表是属于哪个应用的哪个模块的这无疑可以提高数据库设计与前台软件开发的效率同时数据库中默认的排序规则是按名字来排序的所以为表格设置类别前缀的话可以把同一类的表格排在一起方便我们察看
二是对表格命名的时候要考虑可读性而不能随便阿狗阿猫的乱取名字最常见的是那些刚学数据库的人在表命名的时候如要建几张测试表就会随便命名如TESTTEST之类的虽然这只是测试但是也不符合我们的命名过则要做测试的话那就以TEST开头然后后面加上具体要测试的内容如此的话我们才可以通过表的名字知道该表具体的用途而不用打开表去看里面具体的结构或者注释才能知道我们需要的信息所以在设计表的名字的时候还要关注一下其的可读性