关于SQL SERVER数据库表主键问题.doc

关于SQL SERVER数据库表主键问题.doc

ID:31869621

大小:24.50 KB

页数:5页

时间:2019-01-23

关于SQL SERVER数据库表主键问题.doc_第1页
关于SQL SERVER数据库表主键问题.doc_第2页
关于SQL SERVER数据库表主键问题.doc_第3页
关于SQL SERVER数据库表主键问题.doc_第4页
关于SQL SERVER数据库表主键问题.doc_第5页
资源描述:

《关于SQL SERVER数据库表主键问题.doc》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、关于数据库的逻辑设计,是一个很广泛的问题。本文主要针对开发应用中遇到在MSSQLServer上进行表设计时,对表的主键设计应注意的问题以及相应的解决办法。主键设计现状和问题关于数据库表的主键设计,一般而言,是根据业务需求情况,以业务逻辑为基础,形成主键。比如,销售时要记录销售情况,一般需要两个表,一个是销售单的概要描述,记录诸如销售单号、总金额一类的情况,另外一个表记录每种商品的数量和金额。对于第一个表(主表),通常我们以单据号为主键;对于商品销售的明细表(从表),我们就需要将主表的单据号也放入到商品的明细表中,使其关联

2、起来形成主从关系。同时该单据号与商品的编码一起,形成明细表的联合主键。这只是一般情况,我们稍微将这个问题延伸一下:假如在明细中,我们每种商品又可能以不同的价格方式销售。有部分按折扣价格销售,有部分按正常价格销售。要记录这些情况,那么我们就需要第三个表。而这第三个表的主键就需要第一个表的单据号以及第二个表的商品号再加上自身需要的信息一起构成联合主键;又或者其他情况,在第一个主表中,本身就是以联合方式构成联合主键,那么也需要在从表中将主表的多个字段添加进来联合在一起形成自己的主键。数据冗余存储:随着这种主从关系的延伸,数据库

3、中需要重复存储的数据将变得越来越庞大。或者当主表本身就是联合主键时,就必须在从表中将所有的字段重新存储一次。SQL复杂度增加:当存在多个字段的联合主键时,我们需要将主表的多个字段与子表的多个字段关联以获取满足某些条件的所有详细情况记录。程序复杂度增加:可能需要传递多个参数。效率降低:数据库系统需要判断更多的条件,SQL语句长度增加。同时,联合主键自动生成联合索引WEB分页困难:由于是联合主键方式(对于多数的子表),那么在WEB页面上要进行分页处理时,在自关联时,难于处理。解决方案从上面,我们已经看到现有结构存在着相当多的

4、弊端,主要是导致程序复杂、效率降低并且不利于分页。为解决上述问题,本文提出:当应用系统后台数据库表间存在主从关系时,数据库表额外增加一非业务字段作为主键,该字段为数值型;或者当该表需要在应用中进行分页查询时,也应考虑如此设计。一般地,我们也可以几乎为任何表增加一个与业务逻辑无关的字段作为该表的主键字段。由于该字段要作为表的主键,那么其首要条件是要保证在该表中要具有唯一性。同时,结合SQLServer数据库自身的特性,可以为其建立一个自增列: createTABLET_PK_DEMO(U_ID BIGINT NOTNULL

5、IDENTITY(1,1),–唯一标识记录的IDCOL_OTHER VARchar(20)NOTNULL ,–其他列CONSTRAINTPK_T_PK_DEMOPRIMARYKEY NONCLUSTERED(U_ID)–定义为主键) 但是,SQLServer中的自增列却存在一个比较尴尬的事实,那就是该字段一旦定义和使用,用户无法直接干预该字段的值,完全由数据库系统自身控制:完全数据库系统控制,用户无法修改值在数据库的发布和订阅时,使用自增列会比较麻烦恢复部分数据时,使用自增列会比较麻烦该列的值必须在插入数据后

6、才能获取鉴于此,建议不以自增列的方式来定义,而是参考Oracle数据库系统中序列,在SQLServer系统中实现类似Oracle数据库系统序列功能。这个具体在下面的小节中介绍。我们只需要按照普通字段的定义方式修改表定义为: createTABLET_PK_DEMO(U_ID BIGINTNOTNULL,–唯一标识记录的IDCOL_OTHER VARchar(20)NOTNULL,–其他列CONSTRAINTPK_T_PK_DEMOPRIMARYKEY NONCLUSTERED(U_ID)–定义为主键)参照Oracle序列

7、的功能,我们需要在SQLServer数据库中创建一个新表,以管理序列值: createTABLET_DB_SEQ(SEQ_NAMEVARchar(50)NOTNULL ,–序列名称SEQ_OWNER VARchar(50)NOTNULLDEFAULT’DBO’,–序列所有者(SYSTEM_USER)SEQ_CURRENTBIGINT NOTNULLDEFAULT0,–序列当前值SEQ_MINBIGINT NOTNULLDEFAULT0,–序列最小值SEQ_MAXBIGINT NOTNULLDEFAULT0,–序列最小值S

8、EQ_MAXBIGINT NOTNULLDEFAULT0,–序列最大值SEQ_STEPINTNOTNULLDEFAULT1,–序列增长步长IF_CYCLEINTNOTNULLDEFAULT0,–是否循环(0,不循环;1,循环)CONSTRAINTT_DB_SEQPRIMARYKEY CLUSTERED(SEQ_NAM

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。