您的位置:威尼斯官方网站 > 威尼斯官方网站登录 > 在Name字段上创建独一约束

在Name字段上创建独一约束

发布时间:2019-08-10 23:48编辑:威尼斯官方网站登录浏览(138)

    在安排多少个新类其余Table Schema的时候,不独有供给满足职业逻辑的目迷五色需求,并且亟需思考怎么规划schema技巧越来越快的立异和查询数据,缩小维护资金财产。

    宪章多个景色,有如下Table Schema:

    Product(ID,Name,Description)
    

    在绸缪思路上,ID是自增的Identity字段,用以唯一标志一个Product;在工作逻辑上供给Name字段是天下无双的,通过Name能够显著一个Product。业务上和布置上具有争持难于避免,解决抵触的法门其实很简短:将ID字段做主键,并创建clustered index;在Name字段上创办独一约束,有限支撑Product Name是并世无两的。

    那样的Table Schema 设计看似完美:ID字段具备做clustered index的本来的风貌:窄类型,自增,不会变动;Name上的独一约束,能够满足职业逻辑上的必要。不过,借使业务职员操作失误,将Product 的 Name 写错,要求将其删除,最简便易行的格局是行使delete 命令,直接将数据行删除,不过这种艺术带来的祸患特别大:若是业务人士一一点都不小心将主要的数量删除,那么,苏醒数据的资金大概那些高。若是数据库非常的大,仅仅为恢复生机一条数据,大概需求N个小时执行还原操作。如何统一希图Table Schema,技能制止在保卫安全系统时出现被动的景观?

    delete Product
    where Name='xxx'
    

    设计目标:在长时间内复苏被误删除的多少,以使系统尽快恢复生机

    在事实上的成品境况中,数据删除操作有两种方式:软删除和硬删除,也称作Logic Delete 和 Physical Delete。硬删除是指使用delete命令,从table中向来删除数据行;软删除是在Table Schema中追加贰个bit类型的column:IsDeleted,暗中认可值是0,设置IsDeleted=1,表示该数据行在逻辑上是已去除的。

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

    软删除实际上是二个Update 操作,将IsDeleted字段更新为1,在逻辑中将数据删除,并不曾将数据行从情理上删除。使用软删除,能够保留少数的多少删除的历史记录,以便audit,但是,那也许引致外键关系援引被逻辑删除的数据;即使历史记录太多,那又会导致数据表中有效数据行的密度减少,降低查询速度。

    1,能够神速苏醒被误删除的多寡

    用户的删减操作是将IsDeleted设置为1,在逻辑上象征删除数据,假如用户由于误操作,将重大数据行删除,那么只必要将IsDeleted重新初始化为0,就会苏醒数据。

    update Product
    set IsDeleted=1
    where Name='xxx'  -- or  use ID=yyyy as filter
    

    2,每一回援引该表时,必须安装filter

    另外援引该表的查询语句中,必须设置Filter:IsDeleted=0,为来幸免遗漏filter,能够创设视图,不直接引用该表,而是直接援用视图。

    --view definition
    select ID,Name,Content
    from Product
    where IsDeleted=0
    

    3,手动管理外键关系

    如若在该表上创立外键关系,那么恐怕存在外键关系引用被逻辑删除的数码,形成数据的差别性,那或者是很难开掘的bug:假使须求保持关键关系的一致性,须求做特殊的管理。在将数据行逻辑删除之时,必须在贰个事情中,将外键关系总体删减。

    4,不能被作为历史表

    数据表是用来存款和储蓄数据的,不是用来用户操作的历史记录。要是供给存储用户操作的历史记录,必须采纳别的多少个HistoryOperation来囤积。

    上述Product表中Name字段上设有几个独一约束,若是用户将同样Name的Product重新插入到table中,Insert 操作因为违反独一约束而小败,针对这种气象,软删除操作必须附加开始展览叁遍判定:

    if exists(
        select null 
        from Product 
        where name ='xxx' and IsDeleted=1
    )
    update 
        set IsDeleted=0,
            ...
    from Product 
    where name ='xxx' and IsDeleted=1
    else 
    insert Product(...) 
    values(....)
    

    威尼斯官方网站,若果Product表的数据量一点都十分的大,额外的查询操作,会扩大插入操作的延迟,同期,"无效"的历史数据降充斥在数额表中,也会稳中有降数据查询的进度。

    独自从工作要求上思量,软删是主推的design,按期清理软删的冗余数据,也能够巩固多少查询的速度,可是,在清理数据时,可能会发生大批量的目录碎片,形成并发性减弱等主题材料。

    5,将去除的数码存款和储蓄到History表

    采用软删除设计,扩张IsDelete=1 字段,实际上收缩了平价数据的密度,在应用软删除时,必须稳重思考那点。立异的删除数据的规划是:在一个作业中,将去除的数码存款和储蓄到别的四个History表中。

    delete from Product 
    output deleted.ID,
        deleted.Name,
        deleted.Content,
        'Delete' as CommandType 
        '' as UpdatedBy,
        getdate() as UpdatedTime
    into History_table
    where Name ='xxx' -- or use Id=yyy as filter
    

    还原误删的数目,只须求到History表找到呼应的数码,将其再度插入到Prodcut 表中,况且,History 表中不但能够存款和储蓄用户删除操作的历史记录,何况能够存款和储蓄用户更新的历史记录,对于系统的维护,消除用户争论和故障排除,十二分有协理。

    Product(ID,Name,Content)
    OperationHistory(ID,ProductID,ProductName,ProductContent,CommandType,UpdatedBy,UpdatedTime)
    

    为设计Product 表的删减操作,需求多个Table,对于OperationHistory表,可以做的更通用一些。一得之见,提供三个思路,作者就不做扩大了。

     

    本文由威尼斯官方网站发布于威尼斯官方网站登录,转载请注明出处:在Name字段上创建独一约束

    关键词:

上一篇:Studio工具的补丁来缓慢解决那几个难题

下一篇:没有了