您目前的位置 : 首页 >> 如何做蛋包饭 >> 正文

yy资深站长SQLServer中多行多列连接成为单行单列英超积分榜

日期:2016-7-13(原创文章,禁止转载)

2010-06-23 16:54

来源:赛迪

编辑:Googler【纠错】人评论

A-A+

怎样开淘宝店 站优化方法 创业如何取得投资

小米note顶配版评测

最新LOL活动

关于数据库的逻辑设计,是一个很广泛的问题。本文主要针对开发运用中遇到在MS SQL Server上进行表设计时,对表的主键设计应注意的问题和相应的解决办法。

主键设计现状和问题

关于数据库表的主键设计,一般而言成年人癫痫病如何治疗,是根据业务需求情况,以业务逻辑为基础,构成主键。

比如,销售时要记录销售情况,一般需要两个表,一个是销售单的概要描写,记录诸如销售单号、总金额一类的情况,另外一个表记录每种商品的数量和金额。对第一个表(主表),通常我们以单据号为主键;对商品销售的明细表(从表)癫痫病小发作预防,我们就需要将主表的单据号也放入到商品的明细表中,使其关联起来构成主从关系。同时该单据号与商品的编码一起,构成明细表的联合主键。这只是一般情况,我们略微将这个问题延伸一下:假设在明细中,我们每种商品又可能以不同的价格方式销售。有部份按折扣价格销售,有部份按正常价格销售广西有治癫痫病的医院吗。要记录这些情况,那末我们就需要第三个表。而这第三个表的主键就需要第一个表的单据号和第二个表的商品号再加上本身需要的信息一起构成联合主键;又或其他情况,在第一个主表中,本身就是以联合方式构成联合主键,那末也需要在从表中将主表的多个字段添加进来联合在一起构成自己的主键。

数据冗余存储:随着这类主从关系的延伸,数据库中需要重复存储的数据将变得愈来愈庞大。或当主表本身就是联合主键时,就必须在从表中将所有的字段重新存储一次。

SQL复杂度增加:当存在多个字段的联合主键时,我们需要将主表的多个字段与子表的多个字段关联以获得满足某些条件的所有详细情况记录。

程序复杂度增加:可能需要传递多个参数。

效力下降:数据库系统需要判断更多的条件,SQL语句长度增加。同时,联合主键自动生成联合索引

WEB分页困难:由因而联合主键方式(对多数的子表),那末在WEB页面上要进行分页处理时,在自关联时,难于处理。

解决方案

从上面,我们已看到现有结构存在着相当多的弊端,主要是致使程序复杂、效力下降并且不利于分页。

为解决上述问题,本文提出:当运用系统后台数据库表间存在主从关系时,数据库表额外增加1非业务字段作为主键,该字段为数值型;或当该表需要在运用中进行分页查询时,也应斟酌如此设计。一般地,我们也可以几近为任何表增加一个与业务逻辑无关的字段作为该表的主键字段。

由于该字段要作为表的主键,那末其重要条件是要保证在该表中要具有唯一性。同时,结合SQL Server数据库本身的特性,可以为其建立一个自增列:

create TABLE T_PK_DEMO(U_ID

BIGINT NOT NULL IDENTITY(11)唯一标识记录的IDCOL_OTHER VARchar(20) NOT NULL 其他列CONSTRAINT PK_T_PK_DEMO PRIMARY KEY NONCLUSTERED(U_ID)定义为主键)

但是,SQL Server中的自增列却存在一个比较为难的事实,那就是该字段一旦定义和使用,用户没法直接干预该字段的值,完全由数据库系统本身控制:

完全数据库系统控制,用户没法修改值

在数据库的发布和定阅时,使用自增列会比较麻烦

恢复部份数据时,使用自增列会比较麻烦

该列的值必须在插入数据后才能获得

鉴于此,建议不以自增列的方式来定义,而是参考Oracle数据库系统中序列,在SQL Server系统中实现类似Oracle数据库系统序列功能。这个具体在下面的小节中介绍。我们只需要依照普通字段的定义方式修改表定义为:

create TABLE T_PK_DEMO(U_ID

BIGINT NOT NULL 唯一标识记录的IDCOL_OTHER VARchar(20) NOT NULL 其他列CONSTRAINT PK_T_PK_DEMO PRIMARY KEY NONCLUSTERED (U_ID)定义为主键)

1

2

下一页

查看全文

友情链接:

拔山超海网 | 装修忌讳什么 | 北京企业管理培训 | 瘟疫公司困难攻略 | 宝马国外售价 | 乔丹女运动服 | 青岛吉他培训