[数据库环境介绍]web
一般来说,各个互联网公司的数据库分为5个数据库环境:sql
1. dev : 开发环境, 开发可读写,可修改表结构; 经常使用的163的数据库表; 开发人员能够修改表结构, 能够随意修改其中的数据; 可是须要保证不影响其余开发同事; 数据库
2. qa : 测试环境, 开发可读写, 开发人员能够经过工具修改表结构; 网络
3. sim: 模拟环境, 开发可读写, 经过web平台;发起上线请求时,会先在这个环境上进行预执行, 这个环境也可供部署上线演练或压力测试使用 能够读写;工具
4. real: 生产数据库从库(准实时同步),只读环境,不容许修改数据,不容许修改表结构; 供线上问题查找,数据查询等使用;post
5. online: 线上环境;开发人员不容许直接在线上环境进行数据库操做,若是须要操做必须找DBA进行操做并进行相应记录;测试
这些环境的机器,必定要作到权限划分明确,读写账号分离,而且有辨识度,能区分具体业务。例如用户名w_wap, r_wap 能看出来,读写账号是wap应用的。ui
[数据库命名规范]spa
1. 尽可能简洁明义,可以一眼看出来这个数据库是用来作什么的;unix
2. 使用名词做为数据库名称,而且只用英文,不用中文拼音;
3. 使用英文字母,所有小写,控制在3-7个字母之内;
4. 若是有多个单词,则使用下划线隔开,不建义驼峰命名;
例如,每一个公司都有crm业务,那就叫作xx_crm, 字符集统一utf8。字符集踩过的坑不少,为了通用性统一utf8。
create database xx_crm default character set=utf8;
[表命名规范]
1. 具有统一前缀,对相关功能的表应当使用相同前缀,如acl_xxx,house_xxx,ppc_xxx;其中前缀一般为这个表的模块或依赖主实体对象的名字,一般来说表名为:业务_动做_类型,或是业务_类型;
2. 表名使用英文小写单词,若是有多个单词则使用下划线隔开;
3.表名简介,使用常见单词,避免使用长单词和生僻词;
4. 表引擎取决于实际应用场景及当前数据库中的已经存在的存储引擎;日志及报表类表建议用myisam,与交易,审核,金额相关的表建议用innodb引擎。整体来说数据库默认innodb;
5. 数据表必须有主键,且建议均使用auto_increment的id做为主键(与业务无关),和业务相关的要作为惟一索引;
6. 默认使用utf8字符集(因为数据库定义使用了默认,数据表能够再也不定义,但为保险起见,建议都写上);
7. 全部的表都必须有备注,写明白这个表中存放的数据内容;
8. 预估表数据量,若是数据量较大(超过500w)则须要考虑分表策略。能够等量均衡分表或根据业务规则分表都可。要分表的数据表必须与DBA商量分表策略;
9. 职责相近的表,命名规则应该相同;如合同申请,帐户信息,交友相关等;
举个例子,一张在线冲值记录表:user_bank_deposit 这个就很是符合标准,若是叫作userBankDeposit或是user_chongzhi,就很是不友好。
CREATE TABLE `house_refresh_log` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增ID', `fangid` int(11) NOT NULL COMMENT '房贴子ID', `refresh_time` int(11) NOT NULL COMMENT '刷新时间', PRIMARY KEY (`id`), UNIQUE KEY `fangid` (`fangid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='房刷新记录表'
[字段命名规范]
1. 数据库字段命名与表名命名相似:
2. 使用小写英文单词,若是有多个单词使用下划线隔开;
3. 使用简单单词,避免生僻词;
4. 字段应当有注释,描述该字段的用途及可能存储的内容,如枚举值则建议将该字段中使用的内容都定义出来;
5. 是别的表的外键均使用xxx_id的方式来代表;
6. 表的主键通常都约定成为id,自增类型;
7. 时间字段,除特殊状况一概采用int来记录unix_timestamp;
8. 网络IP字段,除特殊状况一概用bigint来记录inet_aton值;
9. 全部字段,均为非空,最好显示指定默认值;
10. 有些驱动对tinyint支持不够好,一般建义按容量来选择字段;
11. text字段尽可能少用,或是拆到冗余表中;
CREATE TABLE `wanted_post` ( `id` int(10) NOT NULL AUTO_INCREMENT, `puid` int(10) unsigned NOT NULL, `user_id` int(10) NOT NULL COMMENT '发贴用户的id', `username` varchar(50) NOT NULL COMMENT '发贴用户的用户名', `city` smallint(4) NOT NULL COMMENT '所在城市', `ip` bigint(14) NOT NULL COMMENT '发帖人的ip', `district_id` tinyint(2) NOT NULL COMMENT '所在区域的id', `district_name` varchar(20) NOT NULL COMMENT '行政区名字', `street_id` tinyint(2) NOT NULL COMMENT '所在街道(地标)的id', `street_name` varchar(20) NOT NULL COMMENT '小区名字', `title` varchar(255) NOT NULL COMMENT '帖子的标题', `description` text NOT NULL COMMENT '帖子详情描述', `post_at` int(11) NOT NULL COMMENT '用户发帖时间,数据建立的时间,使用整型存储', `refresh_at` int(11) NOT NULL COMMENT '帖子被修改的时间,整型存储', `show_time` int(11) NOT NULL COMMENT '帖子显示时间', `age_max` int(11) NOT NULL DEFAULT '0' COMMENT '招聘最小年龄', `age_min` int(11) NOT NULL DEFAULT '0' COMMENT '招聘最大年龄', `post_refresh_at` int(11) NOT NULL COMMENT '刷新时间', PRIMARY KEY (`id`), UNIQUE KEY `idx_puid` (`puid`), KEY `user_id_index` (`user_id`), KEY `post_at_index` (`post_at`), KEY `refresh_at_index` (`refresh_at`), KEY `show_time_index` (`show_time`) ) ENGINE=InnoDB AUTO_INCREMENT=55295 DEFAULT CHARSET=utf8 COMMENT='招聘帖子表'