9

我有一些数据,其中列是动态的,列数据的数量可以随时增加/减少。所以我打算将它们存储在行而不是列格式中。

我放置了列的主表,它指示列使用的数据类型。我正在绘制下面的主表供您参考

CID     Name          Type
1      Speed         Double
2      Input1        Bool
3      Message       String
.......
.......

现在我想到了两种存储此动态列数据的方法第一种方法是

CID      Data_bool       Data_String      Data_Double
1        NULL            NULL             12
2        True            NULL             NULL
3        NULL            test             NULL
1        NULL            NULL             5
1        NULL            NULL             15

第二种方法是有一个通用的 varchar 列并将每个值作为字符串存储在那里,所以它看起来像

CID      Datas
1        12
2        True
3        test
1        5
1        15

如果您从数据库规范化的角度来看,那么第二种方法似乎很好。但我认为它会在数据检索中产生问题。因为我想过滤像“速度> 10”这样的数据。因此,如果我采用第二种方式(我将所有值存储为字符串),我认为表达式将需要更多时间来评估如果我采用第一种方式进行表达式,那么首先我需要确定我需要评估表达式的列. 前任。对于表达式 Speed > 10,首先我必须检查 Speed 属于哪种数据类型(字符串、布尔等),然后再次执行“data_double > 10”的表达式

两者都有自己的缺点。有人可以指出哪种方式将来会让我不那么头痛。请记住,此表将在后期增长数百万条记录。

我很欣赏你在这里的观点和时间。谢谢你。

4

4 回答 4

2

I' m not shure how you are accessing the data, maybe SQL_Variant may be a option for you in combination with SQL_VARIANT_PROPERTY.

Declare @a table(id int, cont sql_variant)
insert into @a select 1,'test'
insert into @a select 1,Cast('20130101' as DateTime)
insert into @a select 1,Cast('20130201' as Datetime)
insert into @a select 1,Cast(1 as Bit)
insert into @a select 1,Cast(0 as Bit)
Select * from
(
Select *  from @a
where SQL_VARIANT_PROPERTY(cont,'BaseType')='datetime'
) x
Where cont>Cast('20130101' as DateTime)
于 2013-07-25T06:23:15.107 回答
1

一种方法是为您感兴趣的每种数据类型使用一个表。这些表中的每一个都只有两个字段。一个 int 类型的 PK 和一个对应类型的列来存储数据。在主表中,您可以只有一个 int 类型的 FK 链接到一个特定类型的表和另一个 tinyint 类型的字段,该字段决定 FK 属于哪个子表。

主表

ID int PK

ValueID int 非空

输入 tinyint 非空

子表

ID int PK

值字符串不为空

ValueID 是从子表到主表的 FK。可以为其他类型创建类似的子表。

于 2013-07-25T06:04:42.427 回答
0

我知道这并不能回答您关于这两个选项中哪个更好的问题,但我希望它无论如何都会有用。

我不会选择这两个选项中的任何一个。我宁愿尝试看看我是否可以将这些放入列中(拥有 50 或 100 列甚至更多列的表并不少见)和/或不同的表。

我建议您安装 TFS 或 Dynamics CRM 并查看它们如何存储数据。他们构建了应用程序代码,以便能够在数据库中添加/删除列,并且他们有一组表来跟踪这些元数据。

如果确实存在与我尝试使用 XML 数据类型不同的值。

于 2013-07-25T11:27:27.620 回答
0

我曾多次看到并处理过此类问题,尤其是在应用程序必须允许用户配置字段名称和数据类型的情况下。

在这些情况下的解决方案是 Key-Value(即 2 列)表,它使用 varchars 来表示所有键 [显然],但也适用于所有值。

这是一个非常强大的解决方案,它掩盖了它的简单性!

尽管这是最简单和可扩展的选项,但它可能不是性能最高的。为每种数据类型创建一个键值表会有所帮助,但编程起来有点困难。或者,在同一个表中为每个数据类型包含一个类型字段和列(但这不是我最喜欢的,因为这会浪费空间)。

我处理的基于数据库的应用程序使用 varchar Value 方法,执行时没有明显的缓慢;然而,它们实际上只使用简单的基于键的查找进行操作。您的情况可能会有所不同,尤其是当您对数据进行更复杂的查询时。显而易见,但是,将主键应用于 Key 字段将提高查找速度。

补充说明:

很抱歉回收我在各种论坛上阅读的内容,但我没有在自己的数据库中使用变体类型。我读过:

1) 在 SQL Server 2005 及更高版本中,使用变体类型而不是 varchar 类型 - 在这种情况下,对于 Value 列 - 将导致更快的操作,

2) 它们不适用于 WHERE 子句中的 LIKE,

3) OLE DB 和 ODBC 提供程序自动将变体转换为 nvarchar(4000)。

于 2013-07-26T01:48:34.097 回答