每隔15分钟,我们会阅读250个XML文件。每个XML文件都是元素。每个元素(xml文件)由5个子元素组成,每个子元素有400个计数器。
所有这些计数器将用于公式和聚合。将这些数据存储到表中的最有效方法是什么,在本例中是t-sql表?
数据可能如下所示。这是一个XML文件,有249个更像这样:
[Element 1]
- [Element 1-1]
- [Counter 1]: 54
- [Counter 2]: 12
- [Counter 3]: 6
- ...
- [Counter 400]: 9
- [Element 1-2]
- [Counter 1]: 43
- [Counter 2]: 65
- [Counter 3]: 98
- ...
- [Counter 400]: 12
- [Element 1-3]
- [Counter 1]: 43
- [Counter 2]: 23
- [Counter 3]: 64
- ...
- [Counter 400]: 1
- [Element 1-4]
- [Counter 1]: 4
- [Counter 2]: 2
- [Counter 3]: 8
- ...
- [Counter 400]: 12
- [Element 1-5]
- [Counter 1]: 43
- [Counter 2]: 98
- [Counter 3]: 2
- ...
- [Counter 400]: 12
答案 0 :(得分:0)
常规表中的最大列数为1024(请参阅here),因此您不能在一个表中放置2,000列。
基本上有两个选择:
一般来说,我倾向于为每个子元素存储一行。如果满足以下条件,则尤其如此:
如果列通常不同,那么我会考虑EAV模型或混合模型。
是否需要Elements
和Subelements
的单独表格取决于结果的使用方式。对于完整的数据模型,您可能希望包含它们。如果您“只是”对加载数据中的度量进行数值分析而不将数据用于其他目的(归档,报告),则可能不需要这些实体。
答案 1 :(得分:0)
看起来你可以使用整数
我会在时间读取和写一行
element int
subelement tinyint
counterID smallint
counterValue smallint
如果您需要将counterID限制为1-400,则可以使用触发器或FK
来执行此操作select element, subelement, count(*) as count, min(counterValue ), max(counterValue )
from table
group by element, subelement
答案 2 :(得分:0)
A(注意:不是"")正确的方法,将层次结构映射到具有约束的关系:
Element { elementid, elementnumber }
列的组合是唯一的,id是PK。如果您需要历史跟踪数据,可以使用id的时间戳,例如smalldatetime。
Subelement { elementid, elementnumber, subelementnumber }
在整个集合中独一无二,前两列是FK,它们的组合形成PK。
Counter { elementid, elementnumber, subelementnumber, counternumber, counter }
在整个集合中独一无二,前三列为FK,它们的组合形成PK。
所有核心数据都存在于计数器中,并受到其他表格的约束。值。如果填写," root to leaf," PK / FKs会很满意,你会有更小的表来分组和加入,如果你想要扼杀一大堆价值观,那么在Counter上的查询,以及几个WHERE子句,将得到这份工作完成。
如果您知道自己的元素数量从不超过250个,则tinyint应该为元素编号和子元素编号执行,smallint处理计数器编号。