概述 : 表字段的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/