ORACLE数据库设计指南

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据库设计核心原则

罗代均

一、3NF第三范式

通常认为,第三范式在性能,扩展性和数据完整性方面达到了最好平衡. 通常认为,第三范式在性能,扩展性和数据完整性方面达到了最好平衡.

有以下几个要点。有以下几个要点。

1.一个表只描述一个单一的事物(实体)。一个表只描述一个单一的事物

2.表内的每一个值在整个数据库只出现一次(外键除外)

2.表内的每一个值在整个数据库只出现一次(外键除外)。表内的每一个值在整个数据库只出现一次

3.表内的每一行都应该被唯一的标识(有唯一主键)。

3.表内的每一行都应该被唯一的标识(有唯一主键)。表内的每一行都应该被唯一的标识

4.表内不存储与主键无关的信息。表内不存储与主键无关的信息

二、字段设计技巧

1.确保表中没有计算字段

计算字段的值,是由其他字段的值计算而来,当你更新其他字段的时候,很容易忽略同时更新这个计算字段,造成数据的错误。

2.确保这个字段的值只有一个

例如下表Users:

用户ID 用户名称电话号码

001 robin 1358888888/028-*******/…

电话号码的值就不只一个,因此电话字段不能放在users表中,解决办法是增加一个表Phone 电话号码ID 用户ID 电话号码

001 001 13588888 002 001 028-888888

这个表就是Users的从表,用户ID是外键. 还有地址address,和电话的情况类似。

3.尽可能地细分字段

如下雇员表(employee)

雇员ID 雇员名称地址

emp_id emp_name emp_address 001 Robin

四川省成都市高新区天泰路1号

这里的emp_address就可以细分,改进的表如下

雇员ID 雇员名称国家省/直辖市地/市

001 罗代均china 四川成都区/县高新区街道天泰路1号

这样更方便我们编辑和统计,有利于保证数据的完整性。

三数据表设计技巧

1.为表内的每一个字段添加表名缩写

例如客户表

customer cust_id cust_name cust_type cust_city ...

这样书写SQL语句时,很容易就知道这个字段属于哪个表,代表什么含义。

例如cust_city ,就不会和employee表的emp_city混淆了。

2.为每一个表添加如下字段

last_update_by 最后修改人

last_update_date 最后修改时间

这样方便以后数据错误时,查找相关责任人,以及错误发生时间。

3.添加删除标记字段

在关系数据库中,表之间的关系错综复杂,删除一条记录,往往会影响很多其他的表,建议添加删除标记字段,删除数据时,只是将这行标志为删除即可。

例如,客户表(customer)

cust_id cust_name status

001 罗代均A A:Active,活动的,有效的

002 罗曾英I I:Inactive ,无效的

其他的表,比如送货单,里面有cust_id,如果我们将002客户删除,那么这张送货单也就不能查看了.删除002客户时,只需要将其状态更改为I即可. 我们还可以编写单独的数据清除程序,将这些标记为删除的数据删除,或者移入历史数据库中等。

4.使用无业务含义的数字作为主键

首先,关系数据库中,一个表的主键往往会被其它表引用(外键).因此, 任何情况下,都不能允许主键字段被修改.否则,相关表的记录都要相应的修改,这真是噩梦.

而且,任何有业务含义的字段,都有被修改的可能,因此不能作为主键, 当然,为了保证数据的完整性,我们可以为必须唯一的字段(可能是一个,或者多个),添加唯一索引.

最后,从性能考虑,还有什么比数字查询效率更高呢?这点对于多表连接查询非常重要。例如,以前有些系统使用身份证号码作为主键,但是后来身份证由15 位升为18位,这些系统就面临噩梦了!

因此,建议为表添加无业务含义的数字作为主键,SQL Server,MySQL 可以用自增字段,Oracle可以用序列sequence.

5.别忘记为外键添加索引

大家都知道,系统会自动为主键添加唯一索引。但是外键,需要我们手动添加索引。

6.将表的公共部分,导出成一张表,作为其他模块交互的接口。

如果表的结构经常变化,那么将这个表中公共的部分抽取出来,单独作为一张表,这样,对表结构的修改,就不会影响到其它关联的模块。

例如:将客户表customer表拆分customer_basic和customer_other两张表。

有一张报表,需要客户的基本信息,那么只需要查询customer_basic. 如果业务变化,客户信息有变动,只需要修改customer_other表,不会影响到报表的正常运行。

(注:文档可能无法思考全面,请浏览后下载,供参考。可复制、编制,期待你的好评与关注)

相关文档
最新文档