数据表设计中字段不要用特殊值


数据表设计中字段不要用特殊值


正文

在数据表的设计中,有时会倾向于使用特殊值,如下:

  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表示禁用。






参考资料


返回