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)
Copyright © www.sqlfans.cn 2021 - 2026 All Right Reserved更新时间: 2026-06-03 15:21:26

results matching ""

    No results matching ""