摘要:当前研发工作中经常出现因数据库表、数据库表字段格式不规则而影响开发进度的问题,在后续开发使用原来数据库表时,也会因为数据库表的可读性不够高,表字段规则不统一,造成数据查询,数据使用效率低的问题,所以有必要整理出一套合适的数据库表字段命名规范来解决优化这些问题。
本文是一篇包含了数据库命名、数据库表命名、数据库表字段命名及SQL语言编码的规范文档,针对研发中易产生的问题和常见错误做了一个整理和修改,为日后涉及到数据库相关的研发工作做好准备。
一、数据库命名规范
采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线'_'组成,命名简洁明确,多个单词用下划线'_'分隔,一个项目一个数据库,多个项目慎用同一个数据库。
二、数据库表命名规范
2.1数据表命名规范
- 表必须填写描述信息(使用SQL语句建表时)。
- 采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线'_'组成,命名简洁明确,多个单词用下划线'_'分隔。
- 全部小写命名,禁止出现大写。
- 禁止使用Mysql保留关键字,如:name,time,datetime,password等。
- 数据库对象的命名要能做到见名识义,并且最好不要超过32个字符。
- 表名尽量要用英文单词的全拼,而不要自己对英文单词进行缩写。也不要使用汉语拼音和小众的英文缩写。可以使用常见的其意义被大众熟知的英文缩写或英文字典中定义的缩写。
- 表的名称一般使用名词或者动宾短语(动宾逻辑顺序统一)。
- 表名称不应该取得太长(一般不超过三个英文单词)。
- 用单数形式表示名称,例如,使用 employee,而不是 employees。
- 模块_+功能点,示例:alllive_log、alllive_category。
- 功能点,示例:live、message。
- 通用表要加前缀“all_”,示例:all_user。
- 明细表的名称为:主表的名称+字符dtl(detail缩写),例如:采购定单的名称为:po_order,则采购定单的明细表为:po_orderdtl。
- 临时库/表必须以tmp为前缀并以日期为后缀。
- 备份库/表必须以bak为前缀并以日期为后缀。
2.2待优化命名示例
1.冗余
错误示例:yy_alllive_video_recomment、yy_alllive_open_close_log。
说明:去除项目名,简化表名长度,去”yy_”。
2.相同类别表命名存在差异,管理性差
错误示例:yy_all_live_category、yy_alllive_comment_user。
说明:去除项目名,统一命名规则,均为”yy_alllive_”开头即可。
3.命名格式存在差异
错误示例:yy_showfriend、yy_user_getpoints、yy_live_program_get。
说明:去除项目名,统一命名规则,动宾短语分离且动宾逻辑顺序统一。
三、数据库字段命名规范
3.1字段命名规范
- 字段必须填写描述信息。
- 所有表中存储相同数据的字段名和字段类型必须一致。
- 采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线'_'组成,命名简洁明确,多个单词用下划线'_'分隔。
- 全部小写命名,禁止出现大写。
- 命名要能做到见名识义,禁止使用Mysql保留关键字。
- 字段名称一般采用名词或动宾短语。名词示例:user_id、user_name、sex;动宾短语示例:is_friend、is_good。
- 命名字段时要用英文单词的全拼,而不要自己对英文单词进行缩写。也不要使用汉语拼音和小众的英文缩写。可以使用常见的其意义被大众熟知的英文缩写或英文字典中定义的缩写。
- 命名字段时采用的名称必须是易于理解,一般不超过三个英文单词。
- 禁止在命名字段时,重复表的名称,例如,在名employe的表中禁止使用名为employee_lastname的字段。
- 禁止在命名字段时,包含数据类型。
3.2待优化命名示例
1.大小写规则不统一
错误示例:user_id、houseID。
说明:使用统一规则,修改为“user_id”、“house_id”。
2.加下划线规则不统一
错误示例:username、userid、isfriend、isgood。
说明:使用下划线进行分类,提升可读性,方便管理,修改为“user_name”、 “user_id”、 “is_friend”、 “is_good”。
3.字段表示不明确
错误示例:uid、pid。
说明:使用完整名称,提高可读性,修改为“user_id”、“person_id”。
3.3字段类型规范
- 所有字段在设计时,除以下数据类型timestamp、image、datetime、smalldatetime、uniqueidentifier、binary、sql_variant、varbinary外,必须有默认值,字符型的默认值为一个空字符值串‘’,数值型的默认值为数值0,逻辑型的默认值为数值0。
- 系统中所有逻辑型中数值0表示为“假”,数值1表示为“真”,datetime、smalldatetime类型的字段没有默认值,必须为NULL。
- 用合适的字段类型节约空间。字符转化为数字(能转化的最好转化,同样节约空间、提高查询性能)。能使用int就不要使用varchar和char;能用varchar(16)就不要使varchar(256)。能使用tinyint就不要使用smallint和int。少用text类型(尽量使用varchar代替text字段)。
- IP地址使用int类型。
- 固定长度的类型最好使用char,例如:邮编(postcode)。
- 避免使用NULL字段(NULL字段很难查询优化、NULL字段的索引需要额外空间、NULL字段的复合索引无效)。
四、数据库基本设计规范:
- 尽量遵守第三范式的标准(3NF):表内的每一个值只能被表达一次;表内的每一行都应当被唯一的标示;表内不应该存储依赖于其他键的非键信息。
- 所有表必须使用Innodb存储引擎,5.6以后的默认引擎,支持事务,行级锁,更好的恢复性,高并发下性能更好。
- 数据库和表要使用统一的字符集(如:UTF8),统一字符集可以避免由于字符集转换产生的乱码,MySQL中的UTF8字符集汉字点3个字节,ASCII码占用1个字节。
- 所有表和字段都需要添加注释,使用comment从句添加表和列的备注,从一开始就进行数据字典的维护。
- 尽量控制单表数据量的大小,建议控制在500万以内,500万并不是MySQL数据库的限制,可以用历史数据归档,分库分表等手段来控制数据量的大小。
- 谨慎使用MySQL分区表,因为分区表在物理上表现为多个文件,在逻辑上表现为一个表。谨慎选择分区键,跨分区查询效率可能更低,(大表)建议采用物理分表的方式管理大数据。尽量做到冷热数据分离,减小表的宽度,减少磁盘IO,保证热数据的内存缓存命中率。更有效的利用缓存,避免读入无用的冷数据。
- 经常一起使用的列放到一个表中。
- 禁止在表中建立预留字段。预留字段的命名很难做到见名识义,预留字段无法确认存储的数据类型,所以无法选择合适的类型。对预留字段类型的修改,会对表进行锁定。(修改一个字段的成本,大于新增字段)。
- 禁止在数据库中存储图片,文件等二进制数据。
- 禁止在线上做数据库压力测试(会产生大量垃圾数据)。
- 禁止从开发环境,测试环境直接连接生产环境数据库。
- 如果字段事实上是与其它表的关键字相关联而未设计为外键引用,需建索引。
- 如果字段与其它表的字段相关联,需建索引。
- 如果字段需做模糊查询之外的条件查询,需建索引。
- 除了主关键字允许建立簇索引外,其它字段所建索引必须为非簇索引。
- 限制每张表上的索引数量,建议单张表索引不超过5个,索引并不是越多越好!索引可以提高效率同样可以降低效率。
- 禁止给表中的每一列都建立单独的索引。
五、SQL语言编码规范
5.1大小写规范
- 所有关键字必须大写,如:INSERT、UPDATE、DELETE、SELECT及其子句,IF……ELSE、CASE、DECLARE等。
- 所有函数及其参数中除用户变量以外的部分必须大写。
- 在定义变量时用到的数据类型必须小写。
5.2注释
注释可以包含在批处理中,在触发器、存储过程中包含描述性注释将大大增加文本的可读性和可维护性,本规范建议:
- 注释以英文为主,实际应用中,发现以中文注释的SQL语句版本在英文环境中不可用,为避免后续版本执行过程中发生某些异常错误,建议使用英文注释。
- 注释尽可能详细、全面创建每一数据对象前,应具体描述该对象的功能和用途,传入参数的含义应该有所说明,如果取值范围确定,也应该一并说明,取值有特定含义的变量(如boolean类型变量),应给出每个值的含义。
- 注释语法:单行注释、多行注释。单行注释:注释前有两个连字符(--)对变量、条件子句可以采用该类注释。多行注释:符号之间的内容为注释内容,对某项完整的操作建议使用该类注释。
- 注释简洁,同时应描述清晰。
- 函数注释:编写函数文本--如触发器、存储过程以及其他数据对象时,必须为每个函数增加适当注释,该注释以多行注释为主,主要结构如下:CREATE PROCEDURE sp_xxx
六、mysql5.7的关键字和保留字的表
mysql5.7官方文档地址:
https://dev.mysql.com/doc/refman/5.7/en/keywords.html
(R)是保留关键字
ACCESSIBLE (R) | ACCOUNT[a] | ACTION |
ADD (R) | AFTER | AGAINST |
AGGREGATE | ALGORITHM | ALL (R) |
ALTER (R) | ALWAYS[b] | ANALYSE |
ANALYZE (R) | AND (R) | ANY |
AS (R) | ASC (R) | ASCII |
ASENSITIVE (R) | AT | AUTOEXTEND_SIZE |
AUTO_INCREMENT | AVG | AVG_ROW_LENGTH |
BACKUP | BEFORE (R) | BEGIN |
BETWEEN (R) | BIGINT (R) | BINARY (R) |
BINLOG | BIT | BLOB (R) |
BLOCK | BOOL | BOOLEAN |
BOTH (R) | BTREE | BY (R) |
BYTE | CACHE | CALL (R) |
CASCADE (R) | CASCADED | CASE (R) |
CATALOG_NAME | CHAIN | CHANGE (R) |
CHANGED | CHANNEL[c] | CHAR (R) |
CHARACTER (R) | CHARSET | CHECK (R) |
CHECKSUM | CIPHER | CLASS_ORIGIN |
CLIENT | CLOSE | COALESCE |
CODE | COLLATE (R) | COLLATION |
COLUMN (R) | COLUMNS | COLUMN_FORMAT |
COLUMN_NAME | COMMENT | COMMIT |
COMMITTED | COMPACT | COMPLETION |
COMPRESSED | COMPRESSION[d] | CONCURRENT |
CONDITION (R) | CONNECTION | CONSISTENT |
CONSTRAINT (R) | CONSTRAINT_CATALOG | CONSTRAINT_NAME |
CONSTRAINT_SCHEMA | CONTAINS | CONTEXT |
CONTINUE (R) | CONVERT (R) | CPU |
CREATE (R) | CROSS (R) | CUBE |
CURRENT | CURRENT_DATE (R) | CURRENT_TIME (R) |
CURRENT_TIMESTAMP (R) | CURRENT_USER (R) | CURSOR (R) |
CURSOR_NAME | DATA | DATABASE (R) |
DATABASES (R) | DATAFILE | DATE |
DATETIME | DAY | DAY_HOUR (R) |
DAY_MICROSECOND (R) | DAY_MINUTE (R) | DAY_SECOND (R) |
DEALLOCATE | DEC (R) | DECIMAL (R) |
DECLARE (R) | DEFAULT (R) | DEFAULT_AUTH |
DEFINER | DELAYED (R) | DELAY_KEY_WRITE |
DELETE (R) | DESC (R) | DESCRIBE (R) |
DES_KEY_FILE | DETERMINISTIC (R) | DIAGNOSTICS |
DIRECTORY | DISABLE | DISCARD |
DISK | DISTINCT (R) | DISTINCTROW (R) |
DIV (R) | DO | DOUBLE (R) |
DROP (R) | DUAL (R) | DUMPFILE |
DUPLICATE | DYNAMIC | EACH (R) |
ELSE (R) | ELSEIF (R) | ENABLE |
ENCLOSED (R) | ENCRYPTION[e] | END |
ENDS | ENGINE | ENGINES |
ENUM | ERROR | ERRORS |
ESCAPE | ESCAPED (R) | EVENT |
EVENTS | EVERY | EXCHANGE |
EXECUTE | EXISTS (R) | EXIT (R) |
EXPANSION | EXPIRE | EXPLAIN (R) |
EXPORT | EXTENDED | EXTENT_SIZE |
FALSE (R) | FAST | FAULTS |
FETCH (R) | FIELDS | FILE |
FILE_BLOCK_SIZE[f] | FILTER[g] | FIRST |
FIXED | FLOAT (R) | FLOAT4 (R) |
FLOAT8 (R) | FLUSH | FOLLOWS[h] |
FOR (R) | FORCE (R) | FOREIGN (R) |
FORMAT | FOUND | FROM (R) |
FULL | FULLTEXT (R) | FUNCTION |
GENERAL | GENERATED[i] (R) | GEOMETRY |
GEOMETRYCOLLECTION | GET (R) | GET_FORMAT |
GLOBAL | GRANT (R) | GRANTS |
GROUP (R) | GROUP_REPLICATION[j] | HANDLER |
HASH | HAVING (R) | HELP |
HIGH_PRIORITY (R) | HOST | HOSTS |
HOUR | HOUR_MICROSECOND (R) | HOUR_MINUTE (R) |
HOUR_SECOND (R) | IDENTIFIED | IF (R) |
IGNORE (R) | IGNORE_SERVER_IDS | IMPORT |
IN (R) | INDEX (R) | INDEXES |
INFILE (R) | INITIAL_SIZE | INNER (R) |
INOUT (R) | INSENSITIVE (R) | INSERT (R) |
INSERT_METHOD | INSTALL | INSTANCE[k] |
INT (R) | INT1 (R) | INT2 (R) |
INT3 (R) | INT4 (R) | INT8 (R) |
INTEGER (R) | INTERVAL (R) | INTO (R) |
INVOKER | IO | IO_AFTER_GTIDS (R) |
IO_BEFORE_GTIDS (R) | IO_THREAD | IPC |
IS (R) | ISOLATION | ISSUER |
ITERATE (R) | JOIN (R) | JSON[l] |
KEY (R) | KEYS (R) | KEY_BLOCK_SIZE |
KILL (R) | LANGUAGE | LAST |
LEADING (R) | LEAVE (R) | LEAVES |
LEFT (R) | LESS | LEVEL |
LIKE (R) | LIMIT (R) | LINEAR (R) |
LINES (R) | LINESTRING | LIST |
LOAD (R) | LOCAL | LOCALTIME (R) |
LOCALTIMESTAMP (R) | LOCK (R) | LOCKS |
LOGFILE | LOGS | LONG (R) |
LONGBLOB (R) | LONGTEXT (R) | LOOP (R) |
LOW_PRIORITY (R) | MASTER | MASTER_AUTO_POSITION |
MASTER_BIND (R) | MASTER_CONNECT_RETRY | MASTER_DELAY |
MASTER_HEARTBEAT_PERIOD | MASTER_HOST | MASTER_LOG_FILE |
MASTER_LOG_POS | MASTER_PASSWORD | MASTER_PORT |
MASTER_RETRY_COUNT | MASTER_SERVER_ID | MASTER_SSL |
MASTER_SSL_CA | MASTER_SSL_CAPATH | MASTER_SSL_CERT |
MASTER_SSL_CIPHER | MASTER_SSL_CRL | MASTER_SSL_CRLPATH |
MASTER_SSL_KEY | MASTER_SSL_VERIFY_SERVER_CERT (R) | MASTER_TLS_VERSION[m] |
MASTER_USER | MATCH (R) | MAXVALUE (R) |
MAX_CONNECTIONS_PER_HOUR | MAX_QUERIES_PER_HOUR | MAX_ROWS |
MAX_SIZE | MAX_STATEMENT_TIME[n] | MAX_UPDATES_PER_HOUR |
MAX_USER_CONNECTIONS | MEDIUM | MEDIUMBLOB (R) |
MEDIUMINT (R) | MEDIUMTEXT (R) | MEMORY |
MERGE | MESSAGE_TEXT | MICROSECOND |
MIDDLEINT (R) | MIGRATE | MINUTE |
MINUTE_MICROSECOND (R) | MINUTE_SECOND (R) | MIN_ROWS |
MOD (R) | MODE | MODIFIES (R) |
MODIFY | MONTH | MULTILINESTRING |
MULTIPOINT | MULTIPOLYGON | MUTEX |
MYSQL_ERRNO | NAME | NAMES |
NATIONAL | NATURAL (R) | NCHAR |
NDB | NDBCLUSTER | NEVER[o] |
NEW | NEXT | NO |
NODEGROUP | NONBLOCKING[p] | NONE |
NOT (R) | NO_WAIT | NO_WRITE_TO_BINLOG (R) |
NULL (R) | NUMBER | NUMERIC (R) |
NVARCHAR | OFFSET | OLD_PASSWORD[q] |
ON (R) | ONE | ONLY |
OPEN | OPTIMIZE (R) | OPTIMIZER_COSTS[r] (R) |
OPTION (R) | OPTIONALLY (R) | OPTIONS |
OR (R) | ORDER (R) | OUT (R) |
OUTER (R) | OUTFILE (R) | OWNER |
PACK_KEYS | PAGE | PARSER |
PARSE_GCOL_EXPR[s] | PARTIAL | PARTITION (R) |
PARTITIONING | PARTITIONS | PASSWORD |
PHASE | PLUGIN | PLUGINS |
PLUGIN_DIR | POINT | POLYGON |
PORT | PRECEDES[t] | PRECISION (R) |
PREPARE | PRESERVE | PREV |
PRIMARY (R) | PRIVILEGES | PROCEDURE (R) |
PROCESSLIST | PROFILE | PROFILES |
PROXY | PURGE (R) | QUARTER |
QUERY | QUICK | RANGE (R) |
READ (R) | READS (R) | READ_ONLY |
READ_WRITE (R) | REAL (R) | REBUILD |
RECOVER | REDOFILE | REDO_BUFFER_SIZE |
REDUNDANT | REFERENCES (R) | REGEXP (R) |
RELAY | RELAYLOG | RELAY_LOG_FILE |
RELAY_LOG_POS | RELAY_THREAD | RELEASE (R) |
RELOAD | REMOVE | RENAME (R) |
REORGANIZE | REPAIR | REPEAT (R) |
REPEATABLE | REPLACE (R) | REPLICATE_DO_DB[u] |
REPLICATE_DO_TABLE[v] | REPLICATE_IGNORE_DB[w] | REPLICATE_IGNORE_TABLE[x] |
REPLICATE_REWRITE_DB[y] | REPLICATE_WILD_DO_TABLE[z] | REPLICATE_WILD_IGNORE_TABLE[aa] |
REPLICATION | REQUIRE (R) | RESET |
RESIGNAL (R) | RESTORE | RESTRICT (R) |
RESUME | RETURN (R) | RETURNED_SQLSTATE |
RETURNS | REVERSE | REVOKE (R) |
RIGHT (R) | RLIKE (R) | ROLLBACK |
ROLLUP | ROTATE[ab] | ROUTINE |
ROW | ROWS | ROW_COUNT |
ROW_FORMAT | RTREE | SAVEPOINT |
SCHEDULE | SCHEMA (R) | SCHEMAS (R) |
SCHEMA_NAME | SECOND | SECOND_MICROSECOND (R) |
SECURITY | SELECT (R) | SENSITIVE (R) |
SEPARATOR (R) | SERIAL | SERIALIZABLE |
SERVER | SESSION | SET (R) |
SHARE | SHOW (R) | SHUTDOWN |
SIGNAL (R) | SIGNED | SIMPLE |
SLAVE | SLOW | SMALLINT (R) |
SNAPSHOT | SOCKET | SOME |
SONAME | SOUNDS | SOURCE |
SPATIAL (R) | SPECIFIC (R) | SQL (R) |
SQLEXCEPTION (R) | SQLSTATE (R) | SQLWARNING (R) |
SQL_AFTER_GTIDS | SQL_AFTER_MTS_GAPS | SQL_BEFORE_GTIDS |
SQL_BIG_RESULT (R) | SQL_BUFFER_RESULT | SQL_CACHE |
SQL_CALC_FOUND_ROWS (R) | SQL_NO_CACHE | SQL_SMALL_RESULT (R) |
SQL_THREAD | SQL_TSI_DAY | SQL_TSI_HOUR |
SQL_TSI_MINUTE | SQL_TSI_MONTH | SQL_TSI_QUARTER |
SQL_TSI_SECOND | SQL_TSI_WEEK | SQL_TSI_YEAR |
SSL (R) | STACKED | START |
STARTING (R) | STARTS | STATS_AUTO_RECALC |
STATS_PERSISTENT | STATS_SAMPLE_PAGES | STATUS |
STOP | STORAGE | STORED[ac] (R) |
STRAIGHT_JOIN (R) | STRING | SUBCLASS_ORIGIN |
SUBJECT | SUBPARTITION | SUBPARTITIONS |
SUPER | SUSPEND | SWAPS |
SWITCHES | TABLE (R) | TABLES |
TABLESPACE | TABLE_CHECKSUM | TABLE_NAME |
TEMPORARY | TEMPTABLE | TERMINATED (R) |
TEXT | THAN | THEN (R) |
TIME | TIMESTAMP | TIMESTAMPADD |
TIMESTAMPDIFF | TINYBLOB (R) | TINYINT (R) |
TINYTEXT (R) | TO (R) | TRAILING (R) |
TRANSACTION | TRIGGER (R) | TRIGGERS |
TRUE (R) | TRUNCATE | TYPE |
TYPES | UNCOMMITTED | UNDEFINED |
UNDO (R) | UNDOFILE | UNDO_BUFFER_SIZE |
UNICODE | UNINSTALL | UNION (R) |
UNIQUE (R) | UNKNOWN | UNLOCK (R) |
UNSIGNED (R) | UNTIL | UPDATE (R) |
UPGRADE | USAGE (R) | USE (R) |
USER | USER_RESOURCES | USE_FRM |
USING (R) | UTC_DATE (R) | UTC_TIME (R) |
UTC_TIMESTAMP (R) | VALIDATION[ad] | VALUE |
VALUES (R) | VARBINARY (R) | VARCHAR (R) |
VARCHARACTER (R) | VARIABLES | VARYING (R) |
VIEW | VIRTUAL[ae] (R) | WAIT |
WARNINGS | WEEK | WEIGHT_STRING |
WHEN (R) | WHERE (R) | WHILE (R) |
WITH (R) | WITHOUT[af] | WORK |
WRAPPER | WRITE (R) | X509 |
XA | XID[ag] | XML |
XOR (R) | YEAR | YEAR_MONTH (R) |
ZEROFILL (R) |
|
|