APP创业项目-数据库字段默认值的设计思想

喜欢这篇文章吗?分享给你的朋友吧~ 

本文讲述我们的常用Not Null和默认值设计规则。数据表中的一些字段不一定都必须有数据,例如一个内容管理系统(CMS)的文章表,有如下的字段:

20160413170323

id是自增的主键;

title和content表示标题和正文,不能为空值;

create_time是当前时间戳;

is_check表示是否审核,默认没有审核;

editor表示编辑人员,可以为空。

这些字段如何去设置它的Not Null和Default值呢?

首先先了解下NULL、空字符串、Not Null和默认值。

Null表示不存在、未知,无法进行正常的大小比较和索引。不存在并不代表不占用存储空间,Mysql仍然需要分配存储空间,参见官方说明:

“NULL columns require additional space in the row to record whether their values are NULL. For MyISAM tables, each NULL column takes one bit extra, rounded up to the nearest byte.”

空字符串”,两个单引号,里面没有任何空格,不占用存储空间。可以用于比较和索引。

Not Null与默认值,Not Null是指该字段不能为NULL,对于Not Null且未设置默认值的字段,在执行INSERT语句的时候必须显式写出该字段,例如:

INSERT INTO `article` (`title`, `content`, `create_time`, `is_check`, `editor`) VALUES (%s, %s, %s, %s, %s)

此处%s表示占位符。

title和content是必须的且没有默认值,如果INSERT时没有指定这两个字段,SQL将执行失败。而is_check、create_time虽然是Not Null,但是有默认值,因此INSERT的时候可以忽略。

editor是可以为空的,常理讲应该Not Null不勾上就可以了,但是,如果Not Null不勾上且不设置默认值,MySQL会将NULL作为其默认值。

INSERT的时候,我们不想写那么多没用的字段,例如is_check和create_time,很显然刚发布的文章是没有审核的,那么is_check肯定就是0(0表示没有审核,1表示已审核),因此将is_check默认值设置为0,那为什么Not Null要勾上呢?这是为了防止该字段为NULL,为NULL将会造成很多查询的麻烦,见下文。create_time是发布时间戳,可以将时间戳的交给数据库自动创建,也可以由程序创建好写入数据库,不管怎样如果你的业务涉及到时区,须将时区考虑进去。

说完以上几个内容后,我们考虑下数据库的字段Not Null和默认值该怎么设计呢?

1. 所有的字段都采用Not Null,防止字段值为Null。

Null并不会节省存储空间,反而会增加业务复杂度。假设is_check默认值为NULL,1表示已审核、0和NULL都表示未审核。那么我们要检索出所有未审核的文章,SQL应该怎么写?

SELECT * FROM `article` WHERE is_check<>1

可惜的是这条语句搜索不出来那些为NULL的记录,我们必须这么写:

SELECT * FROM `article` WHERE is_check=0 OR is_check IS NULL

为什么NULL不属于“不等于1”的范畴呢?因为MySQL在比较时会将NULL的记录全部忽略掉。因此,如果一个字段使用了NULL,将会导致判断条件混乱。

2. 默认值采用与数据类型相一致的初始值

例如is_check是INT整数类型,初始值为0。例如editor为VARCHAR字符串类型,初始值为空字符串。其中,Blob和TEXT类型没有默认值。

3. 必须有值的字段使用Not Null且不设置默认值

如果一个字段为Not Null且没有默认值,那么MySQL将报错,这样可以保证数据正常。

声明:本文谢绝转载。

版权声明:本博客所有内容,文尾声明谢绝转载的文章禁止转载,未声明谢绝转载的文章,遵循 CC BY-NC-ND 协议,分享-署名-非商业-禁止演绎。
原文链接:APP创业项目-数据库字段默认值的设计思想
来源站点:ComingX

0 Responses to “APP创业项目-数据库字段默认值的设计思想”


  • No Comments

Leave a Reply

使用新浪微博登陆