2011-02-08 127 views
2

我们的数据库是(专门的)桌面应用程序的一部分。 主要目标是保留有关某些事件的数据。数据库设计

活动每隔几分钟发生。

收集的关于事件的数据随着新的数据组被添加进来并且旧的数据几乎每月换出(数据出现在确定的组中),频繁变化。

我不得不把一个数据库来跟踪的事件。第一次刺激可能是只有一个大表,其中每一行都是一个事件,这基本上是我们的数据看起来像,但这似乎是不受欢迎的,因为我们不断变化的数据组(即列的数量要么不断增长,否则我们会不断地让这个月的数据库与上个月的数据库不兼容 - 唉!)。因此,即使创建了循环引用,我仍然朝着以下方向发展。 (但也许这是一个愚蠢的想法)

表活动的第1个月
本月2
表集团
表集团...

表活动具有创建表:
删除级联以删除引用它的外键的行的主键
每个数据组表

每个数据分组表有:
主键,它的缺失级联到空出来的外键引用它
列的数据组中
非空的外键回到事件

这仍然使您不断发展,变化的事件表(因为您需要为每个新数据组添加新的外键列),这一切都不那么激烈。然而,它似乎比一张巨大的桌子更加模块化。这是一个很好的解决方案吗?如果不是,那是什么?

有什么建议吗?

P.S.我们使用SQL Express或SQL精简(我们目前正在尝试用哪一个适合我们最好的)

+1

请举例说明一些示例数据? – 2011-02-08 17:53:13

+0

几乎完全是直线数字数据。只有一列或两列包含文字。其他一切都是原始的数字数据。 – 2011-02-08 19:13:28

回答

0

你不应该在事件表中的每个数据分组表的外键。

事件表已经有一个event_id的是在每个数据组表。所以你可以从事件中获取子表格。此外,事件表中的旧行不在最新的数据组表中。所以你真的不能拥有一个外键。

这就是说,我想知道数据组表中是否有其他结构可用于清理设计。不知道他们看起来像什么,我不能说。但如果有的话,请考虑利用它! (每个月更改的架构是一种非常糟糕的代码异味。)

1

为什么不能在一个XML列基本使用单个表方法和存储改变事件数据作为XML?您甚至可以使用XSD模式来说明变化的数据类型,并且如果需要在某些XML数据上实现快速查询性能,则可以在XML数据上添加索引。

永久改变DB模式不会真的是一种选择,如果我要实现这样的数据库。

0

将数据存储在尽可能细化的级别。这可能是这么简单:

的EventSource INT FK
事件类型INT FK
时间INT
OccuredOn日期时间

获取数据的权利,并尽可能在第一时间一样简单,然后

  1. 通过视图或查询进行聚合。你的直觉对于列的不断变化的本质是正确的 - 在T-SQL中比在DDL中更好地控制它。

  2. 几年前,我遇到了这个问题,其中涉及到媒体播放器的大规模军队的日志文件,最终我最终得到这些数据并创建了一个OLAP多维数据集。 OLAP是数据库设计的另一种方法,重要的是要优化报告和“分片性”。这听起来像你在这条轨道上,能够看到一个月的数据视图,然后是一个季度,然后再回到一个星期的数据将是非常有用的。这是OLAP的用途。

微软的技术是Analysis Services,它是Sql Server的一部分。如果你不想全部投入(OLAP有一个非常陡峭的学习曲线),你也可以考虑做一个有选择性的非规范化数据库,每晚使用源数据库中的ETL进行填充。

HTH。