数据库设计规范sqlserver

132 阅读6分钟

1. 数据库设计规范简介 (Database Design Introduction)****

1.1 约定****

是指对数据库、数据库对象如表、字段、索引、序列、存储过程等的命名约定

命名使用富有意义的英文词汇,尽量避免使用缩写,多个单词组成的,以每个单词前缀大写作为分隔

避免使用数据库系统的保留字如LEVEL、关键词如TYPE(见各数据库系统保留字与关键词)

各表之间相关列名尽量同名

除数据库名称长度为1-8个字符,其余为1-30个字符,Database link名称也不要超过30个字

命名只能使用英文字母,数字和底线

文字字段不允许Null,可设定默认值为空字符串

1.2 数据表****

规则如下:

命名规则为XXX_YYY_TableName。XXX表示子模块的名称,由三个大写字母构成;YYY表示子系统中的子模块的名称(选用);TableName为表含义

TableName规则如下:

使用英文单词或词组作为表名 

用名词和名词短语作表名

不使用复数

正确的命名,例如:

TB_SYS_User

TB_BIZ_Order

1.3 存储过程****

规则如下:

命名规则为SP_XXX_YYY_StoredProcedureName。XXX表示子系统的名称,由三个大写字母构成;YYY表示子系统中的子模块的名称(选用);StoredProcedureName为预存程序含义

StoredProcedureName规则如下:

用动词或动词短语来命名,并带有宾语

尽量谨慎地使用缩写

尽量不要和关键词重合

StoredProcedureName内不使用底线

预存程序正确的命名,例如:

SP_SYS_InsertUser

SP_SYS_SearchUserByUserID

SP_SYS_DeleteUserByUserID

1.4 视图****

规则如下:

检视的命名采用VW_XXX_YYY_ViewName_v。XXX表示子系统的名称,由三个大写字母构成;YYY表示子系统中的子模块的名称(选用);ViewName部分表示检视的含义。

ViewName规则如下:

用名词和名词短语,

不使用复数

尽量谨慎地使用缩写

尽量不要和关键词重合

ViewName中使用底线

检视正确的命名,例如:

VW_SYS_UserView

VW_BIZ_UserOrderView

1.5 索引 (Index)****

l 规则如下:

IX_TableName_ColumnName

多单词组成的Column Name,取前几个单词首字母,加末单词组成Column Name

例如:

TST_Sample表MemberId上的索引: IX_TST_Sample_MemberId

TB_SYS_News表Title上的索引: IX_TB_SYS_News_Titile

1.6 序列 (Sequence)****

规则如下:

SEQ_TableName

如:

TST_Sample表的序列: SEQ_TST_Sample

1.7 主键 (Primary Key)****

主键命名:PK_TableName

如:

TST_Sample表的主键: PK_TST_Sample

1.8 外键 (Foreign Key)****

外键命名:FK_TableName_ColumnName

多单词组成的Column Name,取前几个单词首字母,加末单词组成Column Name

如:

TST_Sample表UserId字段的外键: FK_TST_Sample_UserId

TST_Sample表TypeId字段的外键: FK_TST_Sample_TypeId

2. 设计规范 (Design  Guideline)****

2.1 规范约定****

  1. 遵守数据的设计规范3NF 规定

表内的每一个值都只能出现一次。

表内的每一行都应该被唯一的值。

  1. 每个数据表(Table)都必须包含五个必要字段:标识符(ID)、建檔人员(Creater)、建檔时间(CreateTime)、最后修改人员(Modifier)、最后修改时间(ModifyTime)及删除标志(IsDelete)其含义如下:

标识符是系统内每笔数据的唯一标识符

建文件人员是是指数据库记录建文件人识别文字

建文件时间是指数据库记录建文件时间,依不同数据库系统预设可能为SYSDATE、GetDate()

最后修改人员是是指数据库最后记录修改人员

最后修改时间是指数据库记录最后修改时间

删除标志是本条记录是否已删除的标志(0:未删除;1:已删除),数据中的数据不做真正删除,只设置这个标志

这五个字段的命名规则如下

实体Table+域名,如UserId、Creater、CreateTime、Modifier、ModifyTime、IsDelete

这五个字段的类型和长度规则如下:

标识符:数值型态,依预期数据量决定长整数、整数、短整数等类型

建檔人员:文字型态,存入可用于识别建文件人员之信息。如:员工编号、姓名

建檔时间:日期时间型态

最后修改人员:文字型态,存入可用于识别最后修改人员之信息。如:员工编号、姓名

最后修改时间:日期时间型态

删除标志:最小数值型态,如:bit、NUMBER(1)

2.2 字段规范****

一行记录必须表内唯一,表必须有主键(PK)。

列举类型使用 NUMBER,且需要说明列举类型的各个不同取值的含义,或将各列笔类型对应含义定义于Code Table

ID结尾的字段为仅由数字组成,Code结尾的字段为仅由字母或数字组成

用Bit或NUMBER(1)表示布尔值:「是」,「否」

不固定长度的文字字段应尽量使用VARCHAR2或VARCHAR代替CHAR类型

可能存入Unicode文字的字段应使用NVARCHAR或NCHAR等支持Unicode的类型

文字字段一般最多4000字符;特殊需求需与DBA讨论后决议

DATETIME精确到毫秒

使用NUMBER或DECIMAL数值类型时请给定长度,例如:NUMBER(5,2)表示整数部分最大3位,小数部分为2位

非上述常用数据型态需与DBA讨论后决议

3 使用规范( Usage S pecification)****

3.1 综合****

如果开发过程中需要建立索引,需要提交书面的更改请求,说明所需索引的定义(名称、字段列表、顺序、索引类型)以及建立的理由。DBA统一维护索引并将提交的请求更改

数据库各表的初始数数据(包含各Code Table、Config Table)需要提交给数据库管理员

尽量不要使用触发程序

涉及到数据库多表数据的更改(Insert/Delete/Update)必须使用数据库事务进行控制,并且必须有完整事务开始和commit/rollback机制

尽量避免Union操作的使用,需要使用时,请向数据库管理员咨询使用Union操作的影响

3.2 查询****

在表查询中,一律不要使用* 作为查询的字段列表,需要哪些字段必须显式写明

在表查询中,必须有Where条件,除非此表为非增长表

在表查询中,一次最多回传的记录笔数仅量不要超过1000条或记录内容不要大于1MB

在表查询中,作Order By排序时,优先使用主键列,索引列

多表关联查询时,优先使用Where条件,再作表关联,并且需要保证被关联的字段需要有索引

异动性不高的数据表查询时应加入不锁定指令,如NoLock

避免在WHERE字句中对列施以函数

错误:
Select ServiceId, ServiceName
From TST_ServicePromotion(NoLock)
Where Convert(Char(10), OrderDate, 112) = ‘2001-09-01’;

正确:
Select ServiceId, ServiceName
From TST_ServicePromotion(NoLock)
Where OrderDate = Convert(DateTime, ‘2001-09-01’);

避免使用数据库的类型自动转换功能:

错误:
Select CategoryId, CategoryName
From TST_Category(NoLock)
Where CategoryId = ‘123’; -- id’s type is number

正确:
Select CategoryId, CategoryName
From TST_Category(NoLock)
Where CategoryId = 123; -- id’s type is number

3.3 删除****

删除记录时,必须有Where唯一条件

当有主从表时,要先删除从表记录,在删除主表记录

3.4 修改****

修改记录时,必须有Where唯一条件