表字段的NOT NULL设计

概述 : 表字段的NOT NULL 和 NULL 的设计,DBA还是比较在意的,关于这个有以下几个原则,需要程序员了解

(1)一个字段如果实际上就是一个NOT NULL,就把它设计为NOT NULL,而不要因为怕麻烦设计为NULL
举例来说:注册会员一定会有一个email,那么此时email就应该是NOT NULL的设计 。虽然 NULL是不太会错,但是我们依然要求让他NOT NULL

(2)一个字段,如果是一个核心字段(比较重要,使用场景很多),那么建议把它设计为NOT NULL,存在NULL的情况使用默认值处理
举例来说:注册会员,要不然是一个买家、要不然是一个卖家,那么买家有买家状态,卖家有卖家状态,作为买家注册的时候,卖家状态 可能NULL,作为卖家注册的时候,卖家状态可能NULL,那么这两个字段就可能是NULL。设计的时候,我们可以任务无论是买家还是卖家,另外一方的状态都是 = 0 初始状态 ,这就可以把2个字段都设计为NOT NULL。会员的状态字段还是非常重要的,我们使用场景也很多,建议使用NOT NULL设计

(3)一个字段,如果是一个搜索列,或者是一个关联列,那么建议把它设计为NOT NULL,存在NULL的情况使用默认值处理
举例来说: 对于一个订单表,如果这个订单被退单了,就会有个退单编号,但是订单没有被退单,是不会有退单编号的。此时退单编号就会被设计为 NULL。这里建议退单号依然使用 NOT NULL的设计,如果没有退单编号,就可以 使用 0 ,这里的0表示的就是没有退单编号。

(4)关于金额、数量 的设计,建议只要可以都使用NOT NULL
NULL值在计算上实际上有很多的坑,一不小心就会错误。而金额、数量 又是计算比较多的字段,所以建议所有和金额、数量有关的字段设计都使用NOT NULL。不要使用NULL,避免带来不必要的麻烦
当然,了解了以上的原则后,很多的开发同事依然会追问,为什么呢?为什么呢?NULL值这个内容是一个非常复杂的内容,并且已经有很多的前辈总结过了。这里找了一个2008年业界比较资深的DBA的帖子,帖子中对NULL的这个问题做了很全面的分析,疑问很多的糖糖可以慢慢的阅读,这里就不再多说了 [精华]  Oracle中的NULL  http://www.itpub.net/thread-932786-1-1.html

对于NULL值,我需要简单给大家传递的3点:

(1) B树索引不存储索引列全为空的记录。举例来说:如果这个字段是一个 NULL,仅仅在这个字段上创建一个索引,那么NULL值的那些记录不会使用索引访问,where a is null,很有可能全表扫描。
(2)NULL值的统计信息是无法确定的,有可能影响oracle对于sql的执行计划的偏差,说白了就是SQL性能不稳定。 【 http://newwiki.vemic.com/pages/viewpage.action?pageId=9046974
(3)无论ORACLE数据库还是MYSQL数据库,对于NULL值都是一样的原则

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/617982/viewspace-2135939/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/617982/viewspace-2135939/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值