桂林骏程网络有限公司  
桂林网站建设 | 加入收藏 | 设为首页
全国统一服务热线:18077392768  
服务 Q Q:    
 
用户中心登录  
用户名:
密 码:
验证码:
 服务热线:18077392768
 在线QQ:503124658  QQ:422606575
  网站建设  

域名注册 虚拟主机
网站报价 网站推广
优惠套餐 网站改版
  服务中心  
  常见问答
  建站流程
  关于我们
  支付方式
  建站常识  
  通用网址与网络实名的区别
  如何给你的网站起一个好域名
  企业上网用网络实名
  什么是域名?
  百度新的网站排名工具-百度..
  中小企业网络建设原理以及规..
  企业准备网站建设资料如何下..
  桂林中小企业网站建设该注意..
  桂林网站建设--建一个网站..
  为什么要选择骏程网络呢
  自助建站平台建设企业网站的..
  网站改版的理由!
  手工设计建站与模板网站的区..
  网站建设中的“12要”与“..
  提高网站PR值的若干方法
  网站建设流程及域名相关知识
  对网站进行准确定位是网站成..
  建站基础,什麽是静态网页
 
当前位置:首页 > 建站常识
 
     

SQL Server上进行表设计时表的主键设计问题

 来源:桂林网络公司   发布时间: 2010/7/15 18:06:01   点击率: 2585 次

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

主键设计现状和问题

关于数据库表的主键设计,一般而言,是根据业务需求情况,以业务逻辑为基础,形成主键。

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

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

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

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

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

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

解决方案

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

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

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

create TABLE T_PK_DEMO
(
U_ID  BIGINT NOT NULL IDENTITY(1,1),
–唯一标识记录的ID
COL_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 ,–唯一标识记录的ID
COL_OTHER VARchar(20) NOT NULL ,–其他列
CONSTRAINT PK_T_PK_DEMO PRIMARY KEY NONCLUSTERED (U_ID)–定义为主键
)




公司简介 | 公司动态 | 常见问答 | 建站流程 | 付款信息 | 联系方式 | 在线留言 | 主机域名管理 | 桂林域名注册 | 加入收藏 | 设为首页 |
 
Copyright © 2006-2019 Web0773 All Rights Reserved.桂林骏程网络有限公司 版权所有
公司地址:桂林市叠彩区中山北路406号中北花园1-2栋6层   邮编:541004   电话:18077392768
电子邮件:kefu0773@163.com   服务 Q Q:503124658  QQ:422606575 中国信息产业部备案号:桂ICP备07006900
本站关键字:桂林网站建设 桂林网站推广 桂林网站设计 桂林网络公司 桂林seo优化 桂林域名注册 桂林虚拟主机 桂林建站 桂林400电话