如何在SQL Server 2005中为可同时包含数字和字符串值的字段建模?
我有一个新的数据库表需要创建...
它在逻辑上包含一个" ID",一个"名称"和一个"值"。
该值字段本质上可以是数字,也可以是字符串。
我不认为我只想将字段设为" varchar",因为我还希望能够使用" WHERE value> 0.5"之类的过滤器进行查询。
在SQL Server 2005中对此概念建模的最佳方法是什么?
编辑:
我不反对在此处创建多个字段(一个用于数字,一个用于非数字),但是由于它们实际上是相同的概念,因此我不确定这是一个好主意。
我想我可以创建单独的字段,然后有一个视图将它们合并为一个逻辑列。
有什么意见吗?
我想要实现的实际上非常简单...通常,这些数据只会在网格类型的视图中盲目显示。
解决方案
回答
我还希望能够过滤该网格中的数值。该表最终将存储在数千万条记录中,因此我不想将自己的查询性能降低到一个角落。
查询性能是我主要关心的问题。
回答
如果要将数字和字符串值存储在同一列中,我不确定将该列用作查询过滤器时可以避免进行大量的转换和转换。
回答
获得所需查询支持的一种好方法是具有两列:存储数字的numvalue和存储字符的textvalue。它们应该可以为空,或者至少具有一些不代表任何值的默认值。然后,应用程序可以确定要存储其值的列,以及保留无值的列。
Table: (ValueLable as char(x), Value as numerica(p,s))
回答
两列。
回答
我认为不可能同时具有varchar和int类型的列。我们可以将值另存为varchar,并在查询期间将其强制转换为int。但是,如果值确实包含任何字符,则可以通过这种方式获得异常。我们想达到什么目的?
如果我们希望它能够容纳一个字符串,我认为我们必须将列设为varchar或者类似内容。
WHERE value_type = 'number' AND number_value > 0.5
回答
另一种选择是使用2或者3列而不是一个value列。也许有三列,value_type("数字"和"字符串"之间的枚举),number_value,string_value。然后我们可以将该查询重构为
回答
我认为我们将无法使用VARCHAR或者NVARCHAR作为数据类型。使用我们要描述的混合数据,当我们将字段从数据库中拉出并根据数据类型执行适当的CAST或者CONVERT时,必须测试该值。
我们与混合数据有关的问题可能是Sql 2005如何对文本数据进行排序。这不是"自然"的排序。
where value > '20.5'
如果我们有一个varchar字段,则可以执行以下操作:
像" 5"这样的值将出现在结果中(因为在基于字符的排序中," 5"排在" 20.5"之后)
使用单独的列进行存储会更好。
select [ID], [Name], Coalesce( [value_str], [value_num] ) from [tablename]
回答
I guess I could create separate fields, then have a view that sort of coalesces them into a single logical column. Any opinions on that?
如果需要将它们合并到结果中,请使用Coalesce将它们合并为一列:
这取决于数据源。如果我们以某种自由格式从用户(或者其他系统)获取数据,而实际上并不在乎数据是哪种类型,那么最好的存储方法就是最通用的方法(varchar等)。 。如果输入的数据结构更合理,并且我们关心该结构,那么通过使用单独的字段将该结构保留在数据库中就更有意义了。
从SELECT的角度来看,这并不重要;我们可以以任何一种方式存储它,并将其读取为相同的架构。一旦进入过滤器(如前所述),事情就会变得有些毛茸茸,但是仍然很容易实现。但是,我们没有提及是否需要更新此数据,如果需要,则是否需要对数据进行任何验证。
从它的声音来看,我们需要根据要存储的值的"类型"进行不同类型的搜索。因此,添加"类型"字段可能很有意义,以便可以将所有过滤器快速限制为我们关心的值的类型。注意,"类型"是指更逻辑的应用程序范围"类型";而不是实际存储的数据类型。
回答
我的建议是,如果我们需要轻松地支持UPDATE的话,则将单个字段与Type列一起使用;如果只需要SELECT和过滤,则可以使用多个字段(或者表,如果它们是完全不同的数据集)。
段落数量不匹配