数据库设计核心原则

介绍几种数据库设计的原则(基于Oracle):

第一:3NF第三范式。 

  通常认为,第三范式在性能,扩展性和数据完整性方面达到了最好平衡.有以下几个要点。


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


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


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


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


第二:字段设计技巧。

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

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

  例如下表Users:
  用户ID   用户名称    电话号码
  001      kyle       1388888888/020-8888888/…
   电话号码的值就不只一个,因此电话字段不能放在users表中,解决办法是增加一个表Phone
  电话号码ID       用户ID   电话号码
   001              001      13198765
   002              001      021-866666
  这个表就是Users的从表,用户ID是外键. 还有地址address,和电话的情况类似。


3.尽可能地细分字段
如下雇员表(employee)
雇员ID  雇员名称   地址
emp_id    emp_name    emp_address
001                kyle            北京市二环路38号


这里的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       谢红蕾         II: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表,不会影响到报表的正常运行。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值