"display purposes" 有数据库列可以吗?

Is it OK to have DB columns for "display purposes"?

我们有两个 table 需要在应用程序中以各种 pages/screens 形式显示字段,并在报告中显示为不同字段的 CONCAT(在同一 table 中进行连接)

1) Customer-table: FirstName+' '+(first-character([MiddleName])+' ' if not-null)+LastName 预期结果:"John Doe" - 或 - "John M Doe"

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

2) Vehicle-table: VYear+' '+VMake+' '+VModel+' : '+VName 预期结果:“2008 福特 F350:蓝色” - 或 - “2008 福特 F350:#45”

我看到有两种方法可以执行这些类型的显示输出。

a) 创建服务器端 VB 函数以根据字段值正确格式化显示(记住某些字段可能为空)

b) 在这些 table 中的每一个中都有一个数据库列,例如 [Name4Display] 和 [VName4Display],它们使用插入和更新触发器进行适当更新。

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

谢谢...J.

我认为仅用于显示数据的列并不好,正如您所说,您必须具有更新这些字段的触发器或函数,请记住这些操作会使您的代码变得复杂,好的代码只是简单

我强烈建议创建一个视图,而不是向具有重复数据的 table 添加字段。除了使用 more space 之外,将会出现的问题是重复的数据可能并不总是与构成它的字段同步。例如,如果我在 table:

中有以下信息
FirstName: 'Dave',
LastName: 'Jones',
FullName: 'Dave Jones'

然后我将他的姓氏更新为 'Johnson',我现在在 table:

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

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

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

如果您只想显示格式化的数据,为什么不写一个 view 来满足您的需求呢?没有理由实际存储格式化值;它是多余的和混乱的。

你有几个选择。不建议创建另一个数据字段。一种选择是使用添加的字段创建视图,例如:

create view vw_customer as

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

您也可以只使用这个 select 查询,而无需在您的应用程序中查看。您也可以像您提到的那样在您的应用程序中构建字符串。

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

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]

"View" 绝对是干净的解决方案。