澳门十大赌场最新排名 > 澳门十大赌场 > 数据删除设计,窗口函数

原标题:数据删除设计,窗口函数

浏览次数:95 时间:2019-07-11

从SQL Server 2005起,SQL Server开始支持窗口函数 (Window Function),以及到SQL Server 2012,窗口函数功能增强,目前为止支持以下几种窗口函数:

在设计一个新系统的Table Schema的时候,不仅需要满足业务逻辑的复杂需求,而且需要考虑如何设计schema才能更快的更新和查询数据,减少维护成本。

图片 1

  1. 排序函数 (Ranking Function) ;

  2. 聚合函数 (Aggregate Function) ;

  3. 分析函数 (Analytic Function) ;

  4. NEXT VALUE FOR Function, 这是给sequence专用的一个函数;

模拟一个场景,有如下Table Schema:

此短信平台,支持法国wavecom短信猫.有VB及DELPHI示例程序

 

Product(ID,Name,Description)

 

一. 排序函数(Ranking Function)

在设计思路上,ID是自增的Identity字段,用以唯一标识一个Product;在业务逻辑上要求Name字段是唯一的,通过Name能够确定一个Product。业务上和设计上有所冲突在所难免,解决冲突的方法其实很简单:将ID字段做主键,并创建clustered index;在Name字段上创建唯一约束,保证Product Name是唯一的。

错误说明
0 成功
-1 连接短信平台失败
-2 命令执行失败
-3 无可读短信

帮助文档里的代码示例很全。

这样的Table Schema 设计看似完美:ID字段具有做clustered index的天赋:窄类型,自增,不会改变;Name上的唯一约束,能够满足业务逻辑上的需求。但是,如果业务人员操作失误,将Product 的 Name 写错,需要将其删除,最简单的方式是使用delete 命令,直接将数据行删除,但是这种方式带来的隐患特别大:如果业务人员一不小心将重要的数据删除,那么,恢复数据的成本可能非常高。如果数据库很大,仅仅为恢复一条数据,可能需要N个小时执行还原操作。如何设计Table Schema,才能避免在维护系统时出现被动的情况?

function ConnectToServer(aServerName, aLogID, aPass: pchar): integer; stdcall;
函数说明:
连接平台的后台数据库
参数说明:
aServerName 平台的后台数据库所在的服务器名称
aLogID 登陆数据库服务器所需的用户名
aPass 登陆数据库服务器所需的密码

排序函数中,ROW_NUMBER()较为常用,可用于去重、分页、分组中选择数据,生成数字辅助表等等;

delete Product
where Name='xxx'

function DisConnectToServer: integer; stdcall;
函数说明:
断开平台的后台数据库连接

排序函数在语法上要求OVER子句里必须含ORDER BY,否则语法不通过,对于不想排序的场景可以这样变通;

设计目的:在短时间内恢复被误删除的数据,以使系统尽快恢复

function CreateIniDb: integer; stdcall;
函数说明:
初始化平台的后台数据库脚本

drop table if exists test_ranking

create table test_ranking
( 
id int not null,
name varchar(20) not null,
value int not null
) 

insert test_ranking 
select 1,'name1',1 union all 
select 1,'name2',2 union all 
select 2,'name3',2 union all 
select 3,'name4',2

select id , name, ROW_NUMBER() over (PARTITION by id ORDER BY name) as num
from test_ranking

select id , name, ROW_NUMBER() over (PARTITION by id) as num
from test_ranking
/*
Msg 4112, Level 15, State 1, Line 1
The function 'ROW_NUMBER' must have an OVER clause with ORDER BY.
*/

--ORDERY BY后面给一个和原表无关的派生列
select id , name, ROW_NUMBER() over (PARTITION by id ORDER BY GETDATE()) as num
from test_ranking

select id , name, ROW_NUMBER() over (PARTITION by id ORDER BY (select 0)) as num
from test_ranking

在实际的产品环境中,数据删除操作有两种方式:软删除和硬删除,也称作Logic Delete 和 Physical Delete。硬删除是指使用delete命令,从table中直接删除数据行;软删除是在Table Schema中增加一个bit类型的column:IsDeleted,默认值是0,设置IsDeleted=1,表示该数据行在逻辑上是已删除的。

function SendASms(aPhone, aContent, aremark: pchar): integer; stdcall;
函数说明:
写短信到平台的后台数据库
参数说明:
aPhone 接收短信的人
aContent 短信的内容
aremark 备注

 

Product(ID,Name,Content,IsDeleted,DeletedBy)

function ReadASms(var aPhone, aContent, aSendDateTime: pchar): integer; stdcall;
函数说明:
从平台的后台数据库中读取一条未读短信
参数说明:
aPhone 发送短信的人
aContent 短信的内容
aSendDateTime 短信发送的时间

二. 聚合函数 (Aggregate Function)

软删除实际上是一个Update 操作,将IsDeleted字段更新为1,在逻辑上将数据删除,并没有将数据行从物理上删除。使用软删除,能够保留有限的数据删除的历史记录,以便audit,但是,这可能导致外键关系引用被逻辑删除的数据;如果历史记录太多,这又会导致数据表中有效数据行的密度降低,降低查询速度。

function GetSmsParams(var SendSmsCnt, HaveNotSendCnt, ReciveSmsCnt,
HaveNotReadSmsCnt: integer): integer; stdcall;
函数说明:
得到平台的相关参数
参数说明:
SendSmsCnt 发件箱的总短信数
HaveNotSendCnt 未发的短信数量
ReciveSmsCnt 收件箱中已收到短信的数量
HaveNotReadSmsCnt 未读短信的数量

SQL Server 2005中,窗口聚合函数仅支持PARTITION BY,也就是说仅能对分组的数据整体做聚合运算;

1,能够快速恢复被误删除的数据

 

SQL Server 2012开始,窗口聚合函数支持ORDER BY,以及ROWS/RAGNE选项,原本需要子查询来实现的需求,如: 移动平均 (moving averages), 总计聚合 (cumulative aggregates), 累计求和 (running totals) 等,变得更加方便;

用户的删除操作是将IsDeleted设置为1,在逻辑上表示删除数据,如果用户由于误操作,将重要数据行删除,那么只需要将IsDeleted重置为0,就能恢复数据。

本文由澳门十大赌场最新排名发布于澳门十大赌场,转载请注明出处:数据删除设计,窗口函数

关键词:

上一篇:MySQL查询显示连续的结果,CentOS7安装MySQL并配置账

下一篇:没有了