数据库规范

命名规范

一般性命名规则

1 数据库所有命名都使用驼峰式[Camel]命名规则
2 名称不能使用中文
3 名称长度范围[2,32]
4 名字必须具有意义
5 缩写的单词必须大写
6 特殊情况下,多个单词之间可以使用英文的下划线[_]连接

数据库命名(以lch为例)

正式库以 lch开头,测试库以lch_test开头,第几个库在后面使用[_]加库号,第0个库直接使用lch,第N库使用lch_N命名。

数据表命名

1 表名使用单词首写字母大写
2 表名都以[s]结尾。
3 表必须添加中文说明
如 正确的表名:ItemDetails, Members
不正确的表名:itemdetails, Member,Item_Details
表说明:新增设计表-属性,填写表说明。
EXEC sys.sp_addextendedproperty
@name=N’MS_Description’,
@value=N’品项详情’ ,
@level0type=N’SCHEMA’,
@level0name=N’dbo’,
@level1type=N’TABLE’,
@level1name=N’ItemDetails’

在这里插入图片描述

列命名

1 列名使用单词首写字母大写
2 列名必须添加中文说明
如 正确的列名:Id, MemberName,Code
不正确的列名:id, memberNmae,member_Name
EXEC sys.sp_addextendedproperty
@name=N’MS_Description’,
@value=N’代号’ ,
@level0type=N’SCHEMA’,
@level0name=N’dbo’,
@level1type=N’TABLE’,
@level1name=N’ItemDetails’,
@level2type=N’COLUMN’,
@level2name=N’Code’
在这里插入图片描述

索引命名

1 聚集索引以PK_表名 如PK_Members
2 索引中若使用多列,多个列名之间使用[_]连接
3 唯一索引以UX_开头 如UX_Code_OperDate
4 不唯一索引以IX_开头 如IX_Code_OperDate
5 如需要覆盖索引(包含列),在索引开头和列名之间添加_INCLUDE
如 正确的索引名:IX_INCLUDE__Code_OperDate, UX_INCLUDE_Code_OperDate

不唯一索引

CREATE NONCLUSTERED INDEX [IX_Code_OperDate] ON [dbo].[ItemDetails]
(
[Code] ASC,
[OperDate] ASC
)

存储过程命名

1,存储过程命名以USP_命名 如USP_GetAllMembers
不要使用SP_xxx作为命名约定,它会导致额外的搜索,增加I/O(因为系统存储过程的名字就是以SP_开头的),同时这么做还会增加与系统存储过程名称冲突的几率;可以使用USP_xxx

视图命名

1,存储过程命名以V_表名 如V_AllMembers

设计准则

常见的字段类型选择准则

1.字符类型建议采用varchar/nvarchar数据类型
2.金额货币建议采用money数据类型
3.科学计数建议采用numeric数据类型
4. 自增长标识采用bigint数据类型
5.时间类型建议采用为datetime数据类型
6.禁止使用text、ntext、image老的数据类型
7.禁止使用xml数据类型、varchar(max)、nvarchar(max)

表设计准则

1 每个表必须包含
Id bigint IDENTITY(1,1) NOT NULL,—自增长ID,默认情况为主键
CreateOperId bigint default (0), --创建用户
CreateDate datetime default (getdate()), --创建时间(默认取服务器当前时间)
OperId bigint default (0), --操作用户
OperDate datetime (default getdate()) --操作时间(默认取服务器当前时间,每次更新必须更新这个字段)
2 表必须包含主键(默认为Id)
3 表的索引列最多8个,最好在4个以下
4 表如有日期时间、关联表Idd等, 必须单独建索引。
5 表中的每列都不能为NULL,如null有特殊意义外,一般情况下遵循下列默认值
数值类型默认为0,
字符类型默认为’’,
日期类型默认为当前时间,
枚举类型默认为未知,
特殊情况下特殊处理。
7,不允许使用外键
外键增加了表结构变更及数据迁移的复杂性
外键对插入,更新的性能有影响,需要检查主外键约束
数据完整性由程序控制

索引设计准则

1 确保每个表都有主键
确保每个表都有聚集索引(表在磁盘上的物理存储是按照主键顺序排列的),使用主键检索表中的数据,或在主键字段上进行排序,或在where子句中指定任意范围的主键键值时,其速度都是非常快的。
2 充分利用唯一约束
唯一索引给SQL Server提供了确保某一列绝对没有重复值的信息,当查询分析器通过唯一索引查找到一条记录则会立刻退出,不会继续查找索引
3 尽量不要使用复合索引,如使用复合索引,索引包含的字段不超过5个
4 应该在那些select查询中常使用到的列上创建覆盖索引,但覆盖索引中包括过多的列也不行,因为覆盖索引列的值是存储在内存中的,这样会消耗过多内存,引发性能下降。
5 索引可以提高查询速度,但如果数据库是一个事务型数据库,大多数时候都是更新操作,更新数据也就意味着要更新索引,这个时候就要兼顾查询和更新操作了,因为在OLTP数据库表上创建过多的索引会降低整体数据库性能。

在下面这些列上创建非聚集索引:

1 搜索时( WHERE 子句)经常使用到的
2 经常用于连接表的
3 ORDER BY 子句中经常使用的
4 用于外键字段的
5 高选中性的
6 XML类型

不应在下面这些列上创建非聚集索引:

1 不应该对小型的表(仅使用几个页的表)创建索引,这是因为完全表扫描操作可能比使用索引执行的查询快
2 不要给选择性低的字段建单列索引

CREATE UNIQUE NONCLUSTERED INDEX [UX_Code_OperDate] ON [dbo].[ItemDetails]
(
[Code] ASC,
[OperDate] ASC
)

SQL查询准则

1 禁止在数据库做复杂运算
XML解析
字符串相似性比较
字符串搜索(Charindex)
复杂运算在程序端完成

2 禁止使用SELECT *
减少内存消耗和网络带宽
数据库不能利用“覆盖索引”的优点,因此查询缓慢
表结构变化时容易引起查询出错

3 不要在子查询中使用count()求和执行存在性检查
使用count()时,SQL Server不知道你要做的是存在性检查,它会计算所有匹配的值,要么会执行全表扫描,要么会扫描最小的非聚集索引;
当使用EXISTS时,SQL Server知道你要执行存在性检查,当它发现第一个匹配的值时,就会返回TRUE,并停止查询。类似的应用还有使用IN或ANY代替count()。

SELECT * FROM ItemDetails WHERE 0<(SELECT COUNT(*) FROM ItemDetails WHERE 1=1)--不使用
SELECT * FROM ItemDetails 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值