《大话数据库》 -- 第四章 创建与维护表

一、小经验

1、有些表可以把用户不常填写的列剥离出来,分成基本信息表和详细信息表。

比如用户表里身份证号、居住地、邮编、爱好等等,可以放到详细表中,这样如果用户不愿意填写,详细表就可以少存一条记录。

2、很多时候为表设置一个逻辑主键更合适。

逻辑主键和用户业务无关,但是为编程和数据库维护提供方便。大多数这样的逻辑主键有以下两种:

(1)整数做主键,设置为自增长标识列,好处是方便。

(2)GUID字符串做主键,设置默认值为newid(),用于:分布式数据库数据整合。

 详见:《主键的补充说明int vs guid》

3、数据库表里的行的先后顺序一般都不重要,大多数情况列的先后顺序不重要

4、数据库表里的行代表一个实体的对象个体,表代表这类个体的集合。

5、应该尽量避免简单地将列设置为可null,因为数据库系统会为可null列的每一行分配一个额外的字节,查询时会带来更多系统开销,另外将列设为可null使编码变得复杂,因为程序每次访问这些列都必须先检查是不是null值。

  一般的做法是:(1)先确定哪些列不能为null,即先设置not null列,对于这些列该设置默认值的最好设置默认值。

         (2)再确定哪些列可以为null,对于实在不确定的列,不妨先设置为可null,如果需要重构再来处理。或者在程序中保证非null值。

 

 

二、从E-R图和概念数据模型(CDM),到物理数据模型(PDM)

1、E-R图

构成实体-联系图的基本要素是:实体(矩形)、属性(椭圆)、联系(菱形)。

其中联系的连线两端必须写明几对几(如1:1, 1:n, m:n)。也就是1对1;1对多;多对多关系。

 

2、使用powerdesigner设计软件画“概念数据模型”CDM图,可以生成“物理数据模型”PDM图,最后后者导出生成数据库的sql脚本

 

 

三、创建普通表

1、创建虚拟列。代码如下

最后一列S_AGE是虚拟列,也就是说给表插入行时,不允许给该列插入值。但是可以检索该列,列值是生日列和检索时系统日期的差值(年)。

注意该虚拟列没办法固化,因为该列每次计算时需要结合当前系统日期。也就是说每次的计算结果不固定。

 

2、虚拟列的固化(固化后仍然是虚拟列,不允许插入值)

既然可以为虚拟列指定计算函数,那么也可以指定表达式,如加减乘除。

有的虚拟列还可以固化,也就是计算出来,并物理化地把结果添加到那个列中去,每次查询不再计算了,直接取值。如下例:(persisted关键字)

虚拟列固化的限制:首先虚拟列值的计算不能是非确定性的。(也就是说每一行每次计算都必须是一致的)

 

3、标识列identity(1,1)注意

(1)一个表只能有一个使用identity属性定义的列,且必须通过使用decimal、int、numeric、smallint、bigint、tinyint数据类型来定义该列。

(2)标识列只能是非null,而且不允许有default默认值。

(3)已删除的标识值不再重新使用。

 

4、guid列

尽管identity(1,1)标识列在一个表内自动编号(系统保证不重复),但是如果应用程序插入一行,希望在分布在全球的所有数据库中保证行的唯一性。就必须用GUID了。

SQLServer中guid列是:设置列为uniqueidentifier数据类型和用newid()函数做default默认值。然后将表的rowguidcol属性指定为该列。

 

四、关系型数据库三大完整性

详见《五、上午  《06、实体完整性》--《08、引用完整性》》

 

posted on 2017-09-26 10:44  困兽斗  阅读(131)  评论(0)    收藏  举报

导航