将列数据存储为行MS SQL的最佳方法

use*_*198 9 c# sql sql-server sql-server-2008

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

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

CID     Name          Type
1      Speed         Double
2      Input1        Bool
3      Message       String
.......
.......
Run Code Online (Sandbox Code Playgroud)

现在我已经想到了存储这个动态列数据的两种方法.第一种方法是

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
Run Code Online (Sandbox Code Playgroud)

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

CID      Datas
1        12
2        True
3        test
1        5
1        15
Run Code Online (Sandbox Code Playgroud)

如果从数据库规范化的角度来看,第二种方式似乎是好的.但我认为这可能会在数据检索中产生问题.因为我想过滤像"Speed> 10"这样的数据.因此,如果我采取第二种方式(我将所有值存储为字符串)我认为表达式将需要更多时间来评估如果我首先使用表达式然后首先我需要确定我需要评估表达式的列.防爆.对于表达速度> 10,首先我必须检查速度是哪种数据类型(字符串,bool等),然后再次执行"data_double> 10"的表达式

两者都有其自身的缺点.有人可以指出哪种方式会让我在将来减少头痛.请记住,此表将在后期增加数百万条记录.

我感谢您的观点和时间.谢谢.

dot*_*NET 1

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

主表

ID 整数 PK

ValueID int 非空

类型tinyint不为空

子表

ID 整数 PK

值字符串不为空

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