将400个柜台保存到表格中?

时间:2014-04-21 15:41:30

标签: sql tsql database-design data-warehouse business-intelligence

每隔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

3 个答案:

答案 0 :(得分:0)

常规表中的最大列数为1024(请参阅here),因此您不能在一个表中放置2,000列。

基本上有两个选择:

  1. 分别存储每个子元素,包含400列(以及其他标识信息,例如elemnt,数据/时间等)。
  2. 使用实体 - 属性 - 值模型(EAV)模型,每个元素,子元素和值都有一行。
  3. 一般来说,我倾向于为每个子元素存储一行。如果满足以下条件,则尤其如此:

    • 每个子元素的列表示相同的内容(“具有相同的名称”)。
    • 每个子元素的列具有相同的类型。
    • 子元素总是有400列。

    如果列通常不同,那么我会考虑EAV模型或混合模型。

    是否需要ElementsSubelements的单独表格取决于结果的使用方式。对于完整的数据模型,您可能希望包含它们。如果您“只是”对加载数据中的度量进行数值分析而不将数据用于其他目的(归档,报告),则可能不需要这些实体。

答案 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处理计数器编号。