Oracle数据库表设计时的注意事项
表是Oracle数据库中最基本的对象之一。万丈高楼从平地起,这个基础对象对于数据库来说,非常重要。因为其设计是否合理,直接跟数据库的性能相关。从Oracle数据库菜鸟到数据库专家这个过程中,在表设计与管理上,或多或少,会犯一些错误。笔者今天就谈谈自己在这方面的经验与教训,或许能够给大家一些警示作用。
表是Oracle数据库中最基本的对象之一。万丈高楼从平地起,这个基础对象对于数据库来说,非常重要。因为其设计是否合理,直接跟数据库的性能相关。从Oracle数据库菜鸟到数据库专家这个过程中,在表设计与管理上,或多或少,会犯一些错误。笔者今天就谈谈自己在这方面的经验与教训,或许能够给大家一些警示作用。
经验一:在设计大型数据库时,把允许NULL的列放在表的后面。
在数据库表设计过程中,有些字段要求必须为非空,如表的关键字,单据编号字段等等。在数据库表创建的时候,往往需要把这些字段设置为非空。如此的话,就可以强制用户输入数据,以增强数据的一致性。
同时,在一张表中,也会有不少的字段,如员工信息表中,员工爱好、注释等字段,就可能允许为空。利用数据库专业术语来说,这些没有内容的字段就是“NULL”字段。
在数据库表设计的时候,对于这种类型的空字段要特别的留意。一方面,这个NULL字段,不是说其里面存储的是空格。若利用“’’”这个符号去查询空字段的记录的话,往往查不到我们想要的结果。因为在数据库存储的时候,若字段为NULL,则这个值根本没有存储。另一方面,正因为上面这种特性,所以,在表设计的时候,最好把允许NULL的字段放在表的末尾,当数据库比较大或者空字段比较多的话,则可以大大的减少数据库的存储空间。
另外,在数据库创建表的时候,是按照列建立的时间来排序的。所以,当某个列建立好之后,除非重新删除再建立,否则无法调整列的顺序。这就要求数据库管理员在创建表之前,就要对列、以及是否为空有一个明确的定义。只有如此,才能够合理安排列的顺序。
经验二:养成勤于写注释的习惯。
判断一个人是否是数据库专家,从一个“注释”的小习惯中就可以 看得出来。若一个人在数据库开发的时候,勤与写注释,如在建立表或者字段的时候,能够利用comment命令对表与字段进行注释,则可以从一定程度上判断他是这方面的行家。相反,若其开发的数据库,注释没有多少,则基本可以判断,他是一个刚入门的菜鸟。或者说,其没有参加过大型数据库的设计。
这主要是因为,在数据库开发过程中,往往不是一个人可以完成的。如在开发一个ERP数据库的时候,可能有些人专门负责开发基础表,而有些人负责维护视图,等等。大家都是分工合作。同时,在前台也有程序员需要调用后台的数据库表与字段。所以,中大型的数据库与应用系统往往是大家协作的结果。
为此,为了提高表与字段的可读性,一个数据库管理人员开发的表格,大家都可以看的懂,就需要给表与字段设置比较详尽的注释。在Oracle数据库中,为了给其他伙伴提供有意义的帮助信息,就可以利用Comment命令来描述表、字段的作用以及一些引用的注意事项。这个小小的命令,可以大大提高表与字段的可读性,提高数据库与程序开发团队的协作性。
经验三:选择合适的数据类型与长度。
虽然数据库系统在处理数据时,某些数据类型是兼容的,或者会对相关的数据类型进行自动的转换。如对于一些日期类型的字段,其也可以赋值给字符类型的字段;整数型的字段跟浮点型的数据类型也是兼容的。但是,数据库设计人员不能因为数据库系统的这个特性,就放宽了对数据类型的把关。因为有时候,如在基础数据导入或者数据成批更新的时候,虽然最后可以成功完成任务。但是,数据库在这个过程中,需要进行数据类型的转换,就额外的增加了数据库的负担。
另外,在数据库设计的时候,也需要考虑字段的长度。若在建立表的时候,字段设计的太长,则会浪费存储空间。相反,若设计的太短的话,会影响前台系统的使用。所以,数据库管理员对于字段的长度,也要引起足够的重视。
再者,若在创建字段的时候,不能够确认字段长度的话,则最好采用变长的数据类型。如以字符型数据类型为例,就有CHAR与VARHAR2两种。其中,CHAR字符类型主要用来存储固定长度的字符串,允许的最大长度为2000字节。若实际存储的信息内容不到定义的位数的话,则系统会在这些列值为部添加空格,直到其长度到为止。可见,若采用固定长度字段类型的话,即使数据没有这么多,也会占用这么多的存储空间。所以,这种方式下,存储空间的浪费会比较大。后者主要用来存储可变长度的字符数据。当在VARCHAR2列中插入的数据,如果没有到其最大位数的话,则数据库不会在尾部添加空格。从而可以让空间利用最大化。
所以,在表设计的时候,数据库管理员要选择合适的数据类型,并且为其设置合适的长度。
经验四:确定表需要采用的完整性约束与默认值。
有些数据库管理员在数据库设计的时候,喜欢边设计边开发。如在设计表的时候,一开始不确定那些字段要添加约束,哪些字段不能为空,哪些字段需要什么默认值等等。等到需要的时候,再随意添加。这种做事方式,往往会给数据库带来不稳定的隐患。
如某个数据库管理人员在建立表的时候,一开始没有给某个字段设置为默认值。后来前台程序开发人员说需要给这个字段添加某个默认值。但是,此时这个表中已经有了跟系统相关的基础数据。有了数据的表格后,往往不允许再重新设置默认值。否则的话,会给数据库造成一定的负面影响。
所以,笔者认为,数据库管理员在建立表之前,需要确定表所需要的完整性。如哪些列作为主键;哪些列作为外键;哪些列需要唯一性等等。
经验五:确定表需要采用的类型。
在Oralce数据库中,存储用户数据可以使用标准表、索引表、筑表和分区表。有时候,基于不用的应用,选择不同类型的数据表,往往可以大大的提高数据库的性能,特别是数据查询的效率。
如在合适的情况下,数据库管理员可以使用筑表节省存储空间并提高特定类型的SQL语句的性能。不过,我们平时利用的比较多的出了基本表之外,就是索引表了。因为索引表在某些特殊的应用下,可以表现出很好的性能。如在索引表中,可以通过溢出存储功能提高常用列的查询速度;如果经常需要通过主键来查询整条记录的话,则利用索引表可以明显提高查询效率。当然,索引表也不能够乱用。若索引表所存储的数据,变化比较频繁的话,则采用索引表这种类型的表格,反而会事倍功半。
所以,为数据库表选择合适的类型,可以大幅度的提高数据库的性能。当数据库的记录数量越大,这种优势就越明显。
总之,笔者认为,在Oracle数据库设计中,表的建立虽然是一项基础工作。但是,有时候对于数据库的性能,比其他内容影响更加深远。所以,我们要重视表的设计,从基础做起,为提升数据库的性能而努力。
Oracle数据库表设计时的注意事项的更多相关文章
- 数据库表设计时一对一关系存在的必要性 数据库一对一、一对多、多对多设计 面试逻辑题3.31 sql server 查询某个表被哪些存储过程调用 DataTable根据字段去重 .Net Core Cors中间件解析 分析MySQL中哪些情况下数据库索引会失效
数据库表设计时一对一关系存在的必要性 2017年07月24日 10:01:07 阅读数:694 在表设计过程中,我无意中觉得一对一关系觉得好没道理,直接放到一张表中不就可以了吗?真是说,网上信息什么都 ...
- SQL Server性能优化(5)表设计时的注意事项
一. 是否需要冗余列 现在一些项目的数据库设计中,为了提高查询速度,把基本表的一些列也放到了数据表里,导致数据冗余.例如在热表的数据库里,原始数据表Measure_Heat里加了如房间号,单元号,楼号 ...
- Oracle 数据库表同步方法浅议
总结一下Oracle数据库表级别的复制同步 一.通过触发器进行表的复制 原理,是监听表上都某一字段进行的DML操作,然后得到DML操作的数据,重新在另一个表上执行DML操作. 优点: 简单,编写一个触 ...
- Innodb IO优化 — 数据库表设计 转
数据库表设计这块学问比较多,我这里单从互联网角度出发同时结合Innodb的特性给出一些设计方法供大家参考.本文构建大概分两分部分:Innodb的特性及设计中如何利用这种特性. Innodb特性: In ...
- Oracle数据库表分区
一.Oracle数据库表分区概念和理解 1.1.已经存在的表没有方法可以直接转化为分区表. 1.2.不在分区字段上建立分区索引,在别的字段上建立索引相当于全局索引.效率 ...
- 在oracle数据库表中没有添加rowid字段为什么会出现?
rowid 是 oracle 数据库表中的伪列, rowid 首先是一种数据类型,它唯一标识一条记录物理位置, 基于64位编码的18个字符显示.因为 rowid 是伪列, 所以并未真的存储在表中,但可 ...
- oracle数据库表空间追加数据库文件方法
oracle数据库表空间追加数据库文件方法 针对非大文件方式表空间,允许追加文件进行表空间的扩展,单个文件最大大小是32G 第一种方式:表空间增加数据文件 www.2cto.com 1 ...
- Java创建Oracle数据库表
我们通常只用java执行DML(即:insert, update, delete, select)操作,很少用来执行DDL(create, drop, alert)操作.今天试了下如何用java来创建 ...
- springmvc 项目完整示例01 需求与数据库表设计 简单的springmvc应用实例 web项目
一个简单的用户登录系统 用户有账号密码,登录ip,登录时间 打开登录页面,输入用户名密码 登录日志,可以记录登陆的时间,登陆的ip 成功登陆了的话,就更新用户的最后登入时间和ip,同时记录一条登录记录 ...
随机推荐
- Spring MVC 读取静态资源时404错误
背景:web.xml配置时拦截策略是拦截所有请求: <servlet> <servlet-name>springmvc</servlet-name> <ser ...
- 我和NLP的故事(转载)
正值ACL录用结果发布,国内的老师和同学们又是一次大丰收,在这里再次恭喜所有论文被录用的老师和同学们!我人品爆发,也收获了自己硕士阶段的第二篇ACL论文.本来只是想单纯分享下自己中论文的喜悦,但没成想 ...
- 数数字 (Digit Counting,ACM/ICPC Danang 2007,UVa 1225)
思路: 利用java 特性,将数字从1 一直加到n,全部放到String中,然后依次对strring扫描每一位,使其carr[str.charAt(i)-'0']++; 最后输出carr[i],即可. ...
- ASP.NET 生成二维码(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
最近做项目遇到生成二维码的问题,发现网上用的最多的是ThoughtWorks.QRCode和QrCode.Net两种方式.访问官网看着例子写了两个Demo,使用过程中发现两个都挺好用的,Thought ...
- zstu.4194: 字符串匹配(kmp入门题&& 心得)
4194: 字符串匹配 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 206 Solved: 78 Description 给你两个字符串A,B,请 ...
- Nginx下安装PIP监控软件
wget http://pypi.python.org/packages/source/s/setuptools/setuptools-0.6c11.tar.gztar zxvf setuptools ...
- iphone数据存储之-- Core Data的使用(一)
http://www.cnblogs.com/xiaodao/archive/2012/10/08/2715477.html 一.概念 1.Core Data 是数据持久化存储的最佳方式 2.数据最终 ...
- ref游标(动态游标)
参照变量--用于存放数值指针的变量 游标变量(ref cursor) 使用游标时,当定义游标时不需要指定相应的select语句,但是当使用 游标时(open时)需要指定select语句 ...
- hibernate.cfg.xml配置文件和hbm.xml配置文件 模板
hibernate.cfg.xml配置文件格式 <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE ...
- linux expect 简单讲解
来自http://blog.csdn.net/winstary/archive/2009/08/08/4422156.aspx使用expect实现自动登录的脚本,网上有很多,可是都没有一个明白的说明, ...