回到关系型数据库理论创立者E F Codd的时代一个普遍原理出现了永远都不要保存能够被计算的(内容)这一原理回避了这样一个问题我们应该在什么地方计算这个已经计算出来的结果呢?那么缺省的答案是在前端应用程序里
想像一下一个含有SubTotal和TaxRate列的表格根据这一原则TaxAmount和Total这两个列应该是虚拟的所以要将它们作为查看表或者存储过程的一部分创建或者换种方法让前端应用程序来生成它们并把它们呈现给用户
这个原则的一个替换方法叫做计算数据列(computed column)有了这种表示方法你可以将计算数据列声明为CREATE TABLE陈述式的一部分尽管这可能会被发布给数据库(不论是通过图形用户界面还是直接作为数据定义语言的指令)
现在让我们来假设有一个数据库它包含有对房屋粉刷工作的估价忽略诸如房间里门窗数量这样的细节(并假设所有的墙都刷上相同的颜色)就会带来两个问题我们要把天花板涂上相同的颜色吗(一般情况下答案是不会)我们要涂几层(一般情况下答案是两层)?
如果没有计算数据列的话我们就没有更好的办法来处理这些问题这样就只有把这些结果的计算推给前端应用程序而有了计算数据列我们就可以把方程式嵌入到数据库里创建一个虚拟的数据列供任何前端使用
你可以用下面这个陈述式来创建表格
CREATE TABLE [TestComputedColumns] (
[PK] [int] IDENTITY ( ) NOT NULL
[Length] [int] NOT NULL
[Width] [int] NOT NULL
[Height] [int] NOT NULL
[Coats] [int] NOT NULL CONSTRAINT [DF_TestComputedColumns_Coats] DEFAULT
()
[IncludeCeiling] [bit] NOT NULL CONSTRAINT
[DF_TestComputedColumns_IncludeCeiling] DEFAULT ()
[Area] AS (( * ([Height] * [Length] + [Height] * [Width]) + [Length] *
[Width] * [IncludeCeiling]) * [Coats])
CONSTRAINT [PK_TestComputedColumns] PRIMARY KEYCLUSTERED
(
[PK]
)ON [PRIMARY]
) ON [PRIMARY]
GO
你可以使用前端插入一些数据行看看它是如何工作的例如使用Access +创建一个指向你数据库的访问数据工程(Access Data ProjectADP)选择表格然后创建一个AutoForm输入一两个数据行然后通过你的输入翻回到前面你会看到计算数据列得到了正确的值