《大话数据库》 -- 第四章 创建与维护表
一、小经验
1、有些表可以把用户不常填写的列剥离出来,分成基本信息表和详细信息表。
比如用户表里身份证号、居住地、邮编、爱好等等,可以放到详细表中,这样如果用户不愿意填写,详细表就可以少存一条记录。
2、很多时候为表设置一个逻辑主键更合适。
逻辑主键和用户业务无关,但是为编程和数据库维护提供方便。大多数这样的逻辑主键有以下两种:
(1)整数做主键,设置为自增长标识列,好处是方便。
(2)GUID字符串做主键,设置默认值为newid(),用于:分布式数据库数据整合。
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、引用完整性》》
浙公网安备 33010602011771号