将DB列用于“显示目的”是否可以?

时间:2015-05-21 21:11:53

标签: sql-server database database-design web-applications

我们有两个表需要在应用程序中以各种页面/屏幕显示字段,并且报告作为单独字段的CONCAT(在同一个表中连接)

1)客户表:FirstName +''+(第一个字符([MiddleName])+''如果不为null)+ LastName    预期结果:“John Doe” - 或 - “John M Doe”

(注意:与AddrLine1 + AddrLine2 + City + State + Zip + Zip4类似的情况)

2)车辆表:VYear +''+ VMake +''+ VModel +':'+ VName    预期结果:“2008 Ford F350:Blue” - 或 - “2008 Ford F350:#45”

我看到了两种方法来做这些类型的显示输出。

a)创建服务器端VB函数,从字段值中正确格式化显示(某些字段可能为null,请记住)

b)在每个表中都有一个DB列,例如[Name4Display]和[VName4Display],它们使用INSERT-和UPDATE-触发器进行适当更新。

当然,欢迎您提出意见,欢迎提出此问题的其他解决方案。

感谢...,J

5 个答案:

答案 0 :(得分:3)

如果您只想显示格式化数据,为什么不写一个符合您需要的视图?没有理由存储格式化的值;这是多余和凌乱的。

答案 1 :(得分:0)

我认为为显示数据设置专栏并不好,正如您所说,您必须拥有用于更新这些字段的触发器或函数,请记住这些操作会使您的代码变得复杂且代码很好而且#39 ;只是简单的

答案 2 :(得分:0)

我强烈建议您创建一个视图,而不是使用重复数据向表中添加字段。除了使用更多空间之外,将出现的问题是复制的数据可能并不总是与构成它的字段同步。例如,如果我在表格中有以下信息:

FirstName: 'Dave',
LastName: 'Jones',
FullName: 'Dave Jones'

然后我将他的姓更新为'Johnson',我现在在表中有这个:

FirstName: 'Dave'
LastName: 'Johnson'
FullName: 'Dave Jones'

还可以设置一个触发器,使用其他两个字段的结果自动填充FullName字段,但这会增加复杂性。通过使用视图,您可以使用所有逻辑来过滤掉空值并根据需要对其进行格式化。

编辑: 查看SQL Server String Concatenation with Null,了解如何在处理值时实现逻辑以检查空值。

答案 3 :(得分:0)

您有几个选择。建议不要创建其他数据字段。一种选择是使用添加的字段创建视图,如:

create view vw_customer as

select *, 
    isnull(FirstName + ' ','') + isnull(left(MiddleName,1) + ' ','') + isnull(LastName,'') as FullName
from Customer

您也可以在应用程序中没有视图的情况下使用此选择查询。您也可以像在提到的那样在应用程序中构建字符串。

另一种选择是创建为您的表添加计算字段,以便它始终可用。像这样:

CREATE TABLE #Customer(
    [CustomerID] int IDENTITY(1,1) NOT NULL,
    [FirstName] varchar(50) NOT NULL,
    [MiddleName] varchar(50) NOT NULL,
    [LastName] varchar(50) NOT NULL,
    [FullName] AS isnull(FirstName + ' ','') + isnull(left(MiddleName,1) + ' ','') + isnull(LastName,'')
) ON [PRIMARY]

答案 4 :(得分:0)

"查看"绝对是一个干净的解决方案。