"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" 绝对是干净的解决方案。
我们有两个 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" 绝对是干净的解决方案。