3

我有一个需要创建的新数据库表...
它在逻辑上包含一个ID、 aname和 a "value"
该值字段本质上可以是数字或字符串。

我不认为我只想将字段设为 a varchar,因为我还希望能够使用诸如此类的过滤器进行查询WHERE value > 0.5

在 SQL Server 2005 中对该概念建模的最佳方法是什么?

编辑: 我不反对在这里创建多个字段(一个用于数字,一个用于非数字),但由于它们都是同一个概念,我不确定这是一个好主意。
我想我可以创建单独的字段,然后有一个视图将它们合并到一个逻辑列中。

对此有何看法?

我想要实现的非常简单......通常这些数据只会盲目地显示在网格类型的视图中。
我还希望能够过滤该网格中的数值。这张表最终会在几千万条记录中,所以我不想把自己画到查询性能的角落里。
查询性能是我主要关心的问题。

4

9 回答 9

3

获得所需查询支持的一个好方法是拥有两列:存储数字的 numvalue 和存储字符的 textvalue。它们应该是可空的,或者至少有一些不代表任何值的默认值。然后,您的应用程序可以决定哪一列存储它的值,哪一列没有值。

于 2008-08-29T14:58:00.517 回答
2

混合数据的问题可能是 Sql 2005 如何对文本数据进行排序。这不是一种“自然”的方式。

如果你有一个 varchar 字段并且你这样做:

where value > '20.5'

诸如“5”之类的值将出现在您的结果中(因为在基于字符的排序中,“5”在“20.5”之后)

使用单独的列进行存储会更好。

如果您需要将它们合并到结果中,请使用 Coalesce 将它们合并为一列:

select [ID], [Name], Coalesce( [value_str], [value_num] )
from [tablename]
于 2008-08-29T15:44:36.673 回答
0

如果您想将数字和字符串值存储在同一列中,我不确定在将该列用作查询过滤器时是否可以避免进行大量强制转换和转换。

于 2008-08-29T14:56:54.013 回答
0

两列。

Table: (ValueLable as char(x), Value as numerica(p,s))
于 2008-08-29T14:58:17.347 回答
0

我认为不可能有一个同时具有 varchar 和 int 类型的列。您可以将您的值保存为 varchar 并在查询期间将其转换为 int 。但是,如果您的值确实包含任何字符,那么您可能会遇到异常。你想达到什么目的?

于 2008-08-29T14:58:19.937 回答
0

如果你希望它能够保存一个字符串,我认为你必须使列 varchar 或类似的。

另一种方法是使用 2 或 3 列而不是一个值列。也许有三列,value_type(“number”和“string”之间的枚举),number_value,string_value。然后你可以将该查询重建为

WHERE value_type = 'number' AND number_value > 0.5
于 2008-08-29T14:58:30.187 回答
0

我认为您无法使用 VARCHAR 或 NVARCHAR 作为数据类型。对于您所描述的混合数据,当您将字段从数据库中拉出并根据数据类型执行适当的 CAST 或 CONVERT 时,您必须测试该值。

于 2008-08-29T15:01:38.150 回答
0

我想我可以创建单独的字段,然后有一个视图将它们合并到一个逻辑列中。对此有何看法?

这取决于数据的来源。如果您以某种自由格式的方式从用户(或其他系统)获取数据并且并不真正关心它是什么类型的数据,那么存储它的最佳方式是最通用的方式(varchar 等) . 如果传入的数据更加结构化并且您关心该结构,那么通过使用单独的字段将该结构保留在数据库中更有意义。

从 SELECT 的角度来看,这并不重要。您可以以任何一种方式存储它并将其作为相同的模式读取。一旦你进入过滤器(正如你提到的那样),事情就会变得有点毛茸茸,但仍然很容易做到。但是,您没有提及是否需要能够更新此数据,如果需要,是否需要对数据强制执行任何验证。

从它的声音来看,您需要根据所存储值的“类型”进行不同类型的搜索。因此,添加一个 Type 字段可能很有意义,这样任何过滤器都可以快速限制为您关心的值的类型。请注意,我所说的类型是指更合乎逻辑的应用范围,类型;不是存储的实际数据类型。

如果您需要轻松支持更新,我的建议是使用带有类型列的单个字段,或者如果只需要选择和过滤,则使用多个字段(或表,如果它们是完全不同的数据集)。

于 2008-08-29T16:09:59.127 回答
0

您可以考虑使用两列,一列“字符串”和一列“数字”(无论它们的任何变体都是合适的),其中“字符串”列 NOT NULL 和“数字”列允许 NULL 值。插入值时,始终填充类型的“字符串”列独立,但是如果该值是数字,也将其存储在“数字”列中。现在你有一个关于类型的内置指示器(如果“数字”列被填充,它是数字,如果不是,它是一个字符串),总是可以从“字符串”列中提取值进行显示,并且可以使用计算中的“数字”值或根据需要进行正确的数字排序/比较。您始终可以添加指示值类型的第三列,但这种方法消除了对它的需要。

于 2008-08-29T16:22:43.197 回答