每日摘要的SQL架构

时间:2011-10-30 16:11:47

标签: sql database-design schema

我有一个数据库,以下列格式存储来自不同地方的ping:

|    Date    | Source | Language |   OS   | Version | more...
| 2011-10-30 | App1   | en       | XP     | 1.0     | ...
| 2011-10-30 | App2   | de       | 10.7.1 | 1.3     | ...

它可以很好地提取快照信息。我希望能够存储从上表生成的每日摘要,以便我可以获得信息随时间变化的图表。

示例:

  • 根据版本使用情况显示日期的图表
  • 显示操作系统版本日期的图表

问题是上表中的几个列(语言,操作系统,版本)可以具有可变数量的值。我没有太多的数据库设计教育,也无法理解如何存储这些信息以便于检索。

有人可以提出任何建议吗?

2 个答案:

答案 0 :(得分:1)

您可以很容易地从当前表结构中获取这些统计信息。 SQL关键字GROUP BY应该是您的朋友。

要获取每个日期的版本使用情况,请键入

SELECT Date, Version, count(*) as NumberOfEntries
FROM YourTable
GROUP BY Date, Version
ORDER BY Date, Version

ORDER BY Date, Version只是为了得到一个很好的排序输出)

如果您希望每个Source和Version组合都有统计信息,请将问题修改为

SELECT Date, Source, Version, count(*) as NumberOfEntries
FROM YourTable
GROUP BY Date, Source, Version
ORDER BY Date, Source, Version

如果您想在每个日期获得操作系统版本,请键入

SELECT Date, OS, count(*) as NumberOfEntries
FROM YourTable
GROUP BY Date, OS
ORDER BY Date, OS

如果您没有大量数据(例如数百万行),那么合适的索引不会出现任何性能问题。

答案 1 :(得分:1)

这里使用了数据库normalization。确保您的数据库位于3-NF

例如,在您的情况下,

创建表OS_TYPE表示它具有值

Id Value
1  Win XP
2  Win 7
3  Ubuntu Linux

等。

当您需要插入事务表而不是插入操作系统名称时,查找表并获取Id,然后将其与其他数据一起插入。在OS_TYPE表和DATA表之间保留一个foriegn键引用。因此,对于Win XP版本1或Win XP Service Pack 2,您将在DATA表中使用相同的条目 ID 1

通过这种方式,您可以获得可以分析和处理的一致数据。获得正确的数据后,使用SQL中的 GROUP BY,ORDER BY和HAVING子句来处理数据。