sqlserver建库建表规范
本规范旨在帮助开发人员逐步建立合理使用数据库的意识,对数据库相关的资源申请、业务规范使用等提供规范性的指导,从而为公司业务系统稳定、健康地运行提供保障。
对象命名规范
所有对象命名应该遵循下述原则:
- 凡是需要命名的对象,其标识符不能超过30个字符;
- 名称必须以英文字母开头,不得以 _(下划线) 作为起始和终止字母;
- 所有名称的字符范围为:a-z, 0-9 和_(下划线),禁用大写、特殊符号、保留字、汉字和空格;
- 采用英文单词或英文缩写作为名称,不使用无意义的字符或汉语拼音;
- 名称应该清晰明了,能够准确表达事物的含义,最好可读,遵循“见名知意”的原则;
新增数据库
数据库命名规范
- 数据库名称统一使用小写,采用下划线_分割,禁止以中划线-或小数点.分割,比如
platform-2.3; - 数据库以 xxx_ 开头,再加业务系统代号,再加上具体业务名称,比如支付网关:xxx_pay_gateway;
注:xxx 可以是公司的英文标识,请根据实际修改。
申请者提供信息
- 具体跑的什么业务,以便dba登记用途
- 上线后的压力情况,比如qps、最大并发如何
- 预计占用多大空间,每月增长速度。比如上线占用100G,每月增长10G
注:如果已有同类业务的sqlserver实例,则新库优先创建在已有实例上;
注:推荐一个业务线使用一个sqlserver实例,若sqlserver单实例超过20个数据库,则应拆分多个实例;
SQLServer建库示例
-- 建库
CREATE DATABASE xxx_pay_gateway COLLATE Chinese_PRC_CI_AS
-- 创建用户账号
USE master; CREATE LOGIN user_pay_gateway WITH PASSWORD = 'H69f40S3_QGd7FPV',CHECK_POLICY=ON
USE xxx_pay_gateway; CREATE USER user_pay_gateway FOR LOGIN user_pay_gateway
USE xxx_pay_gateway; EXEC sp_addrolemember N'db_datareader', N'user_pay_gateway'
USE xxx_pay_gateway; EXEC sp_addrolemember N'db_datawriter', N'user_pay_gateway'
-- 配置表级别的权限,比如给只读账号(user_bigdata_readonly)添加某张表(dbo.DroolsBu)的只读权限(SELECT)
USE xxx_pay_gateway; GRANT SELECT ON dbo.DroolsBu TO user_bigdata_readonly
示例解析
- 强制:排序规则Chinese_PRC_CI_AS
- 默认权限:db_datareader,db_datawriter
- 密码复杂度:长度16位、同时包含大小写、数字、特殊字符
新增数据表
数据表命名规范
- 以表的具体内容进行描述。如:用户基础信息的表名为 users
- 关联表可以使用两个表组合方式,比如 user_class
- 每个表/字段都要有注释,说明其含义,对于外键字段请说明参照哪个表
SQLServer建表示例
USE xxx_pay_gateway
GO
CREATE TABLE [dbo].[tb_user](
[id] [bigint] IDENTITY(1,1) NOT NULL,
[user_id] [bigint] NOT NULL,
[user_name] [nvarchar](10) NOT NULL,
[create_time] [datetime] NOT NULL DEFAULT (getdate()),
[update_time] [datetime] NOT NULL DEFAULT (getdate()),
[is_deleted] [bit] NOT NULL DEFAULT ((0)),
PRIMARY KEY CLUSTERED ([id] ASC))
ON [PRIMARY]
/*# Owner: 王伟; Manager: 王大朋 #*/
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description',@value=N'用户表',@level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE', @level1name=N'tb_user'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description',@value=N'用户id',@level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'tb_user', @level2type=N'COLUMN',@level2name=N'user_id'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description',@value=N'用户姓名',@level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'tb_user', @level2type=N'COLUMN',@level2name=N'user_name'
GO
--.准备测试数据
INSERT INTO tb_user([user_id],[user_name]) VALUES(1001,'sam');
INSERT INTO tb_user([user_id],[user_name]) VALUES(1001,'joy');
SELECT * FROM tb_user where id=2
示例解析
- 强制自增id为bigint(20),且为主键,业务不要使用
- 表中必须包含4个固定列:id, insert_time, update_time, is_deleted
- 若 is_deleted=1 则认为该行已删,不允许再变更
- 所有字段强制 NOT NULL+默认值,比如int默认0,varchar默认''
- 表和字段必须有comment注释
- 建新表必须填写创建人/负责人
- 禁止使用大字段,比如varchar(2000+)、text、image、blob,大字段建议存放到oss
新增索引
- 索引的命名可参考如下:
| 索引类型 | 命名规范 | 备注 |
|---|---|---|
| 主键 | pk_表名 | 主键具有唯一性,以表名命名 |
| 普通索引 | idx_表名_字段1[_字段n] | 建议加上表名 |
| 覆盖索引 | idx_表名_字段1@字段2 | @表示include |
| 唯一索引 | udx_表名_字段1[_字段n] | u表示unique,唯一 |
- 创建索引可参考如下:
-- 普通非聚集索引
CREATE NONCLUSTERED INDEX idx_users_userid ON users(userid) WITH(ONLINE=ON,FILLFACTOR=90)
-- 覆盖索引
CREATE NONCLUSTERED INDEX idx_users_userid@name ON users(userid) INCLUDE(name) WITH(ONLINE=ON)