正文
在数据表的设计中,有时会倾向于使用特殊值,如下:
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`type` smallint(6) NOT NULL DEFAULT '30' COMMENT '用户类型:10、超级管理员;20:管理员;30:普通用户',
`username` varchar(255) NOT NULL COMMENT '用户账户',
`auth_key` varchar(32) NOT NULL COMMENT '认证key',
`password_hash` varchar(255) NOT NULL COMMENT '密码',
`password_reset_token` varchar(255) DEFAULT NULL,
`nickname` varchar(255) NOT NULL COMMENT '用户姓名',
`phone` varchar(24) NOT NULL DEFAULT '' COMMENT '用户手机号码',
`email` varchar(255) NOT NULL DEFAULT '' COMMENT '用户邮箱',
`status` smallint(6) NOT NULL DEFAULT '10' COMMENT '用户状态:10、正常;0:禁用',
`created_time` int(11) NOT NULL COMMENT '添加时间',
`created_user_id` int(11) NOT NULL DEFAULT '0' COMMENT '添加用户',
`updated_time` int(11) NOT NULL COMMENT '更新时间',
`updated_user_id` int(11) NOT NULL DEFAULT '0' COMMENT '更新用户',
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`),
UNIQUE KEY `password_reset_token` (`password_reset_token`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
这里的status用了特殊值0,初看挺合理的,0就代表无的含义,然而在实际编码中会发现有时需要用其他值替代0, 特别是在前后端js交互中。
0就代表无的含义,但0还代表失败的含义,0还代表为空的含义等等。所以0是一个含义比较多重的特殊字符,程序开发中要针对0辨别它确切的含义, 这会增加开发的复杂度,代码含义也不清晰,增加日后维护的成本。所以在数据库设计与程序开发中,尽量不要使用一词多意的特殊字词,做到一词一意。 比如原来0、1表示否、是,可改为10表示是、20表示否。
数据库本来就只是储存数据的,数据没有区别,所以不要用有特殊含义的特殊值。
这里status中可以用99表示禁用。