2009-08-20 84 views
8

我们使用第三方产品来管理我们的体育中心会员资格。我们有几种会员类型(如初级,学生,工作人员,社区)和若干成员身份(例如年度,活动,非活动,暂停)。不幸的是,该产品只记录了会员的当前会员类型和状态。我希望能够跟踪我们会员的类型和状态随时间变化的方式。数据库设计能够保存一个随时间变化的信息吗?

目前我们可以访问产品的数据库设计。它运行在SQL Server上,我们会定期对产品的表运行我们自己的SQL查询来生成我们自己的表。然后,我们将我们的表格链接到Excel中的数据透视表以生成图表。所以我们熟悉数据库设计和SQL。但是,我们坚持如何最好地解决这个问题。

该产品记录会员的会员购买及其开始和到期日期。因此,我们可以通过这些数据回溯,以确定任何时间点的会员类型和状态。例如,如果他们在2007年1月1日购买了初级会员,并于2007年12月31日到期,然后他们在2008年6月1日购买了学生会员资格,我们可以看到他们的状态从活跃状态变为非活跃状态(在Jan 2008年1月1日和2008年6月1日),他们的类型从初中到初中(2008年6月1日)。

本质上,我们希望将成员的类型和状态属性变成temporal propertieseffectivities a-la Fowler(或其他随时间变化的事物)。

我们的问题(终于:) - 鉴于以上:你会推荐什么样的数据库表的设计,我们使用持有该会员信息。我想它会有一个MemberID列,所以我们可以键入现有的成员表。它还需要存储一个成员的状态和类型以及他们的日期范围。我们希望能够轻松地针对此表编写查询以确定在给定时间点我们拥有的每种类型和状态的成员数量。

更新2009-08-25:去过扯到并没有机会尝试提出的解决方案呢。希望尽快这样做,并根据结果选择答案。

+0

时间序列数据模型的相关问题:http://stackoverflow.com/questions/4083464/design-database-relating-to-time-attribute/ – Vadzim 2015-05-22 16:35:32

回答

7

鉴于您的系统已经书面和到位,对这个问题最简单的方法(和影响现有数据库/代码的至少一个),是添加含有MEMBERID,状态,类型会员历史表和日期列。然后在主成员表中添加一个UPDATE和一个INSERT触发器。当这些触发器触发时,您将成员的新值(以及状态更改的日期)写入成员历史记录表中。然后,您可以查询此表以获取每个成员的历史记录。

这实现相当简单,根本不会影响现有系统。

我会为你写一个免费的会员资格。 :)

+0

Grin。感谢你的回答。我很乐意提供免费会员资格,但看起来你在美国,而且我们在澳大利亚,所以它可能对你没有多大价值。 – dave 2009-08-20 01:22:17

+1

我唯一的补充是这个答案是让历史表包含成员表中的所有字段 - 加上时间戳字段的变化日期/时间和可能的“用户”字段来记录谁更改了它。这样你记录所有的变化。 – 2009-08-20 01:27:13

+0

我在考虑游泳,所以你可能会比你想象的更早看到我。 – MusiGenesis 2009-08-20 01:27:28

0

我会把会员信息放在它自己的表中开始和结束日期。将客户保存在单独的表格中。如果您始终需要“当前”成员资格信息,这是一种痛苦,但有许多方法可以通过查询或触发器来避开。

1

我会创建一个组织成星型模式的报告数据库。会员维度将按时间安排,以便在不同时间点为同一会员设置不同的行。这样,事实表中的不同行可能与历史中的不同点有关。

然后我会创建定期更新报告数据库更新过程,说一个星期,从主数据库。这是主要工作将要到来的地方。

然后,我将驱动报告数据库的报告。使星型模式与数据透视表执行相同的事情很容易。如果有必要,我会在报告数据库前面找到某种OLAP工具。

这是一个很多工作,但它会随着时间的推移而得到回报。

2

我无法推荐您阅读Joe Celko的“Sql for Smarties - 高级sql编程”。他有关于时态数据库设计以及如何(有效且高效地)运行时态投影,选择和时态连接查询的整章。我甚至不会公正地试图解释他在这篇文章的章节中所说的话。

+0

刚刚阅读你的个人资料,并注意到你在悉尼以及伴侣:) – 2009-08-25 11:42:07

+0

我在悉尼。我会尽力追踪你建议的参考。一旦我结束了骨灰。 – dave 2009-08-25 12:15:21

+0

查看北悉尼的书 - 专用于电脑书籍。 Celko是任何数据库/ sql - 实现不可知的参考。我在书中做过的最好的投资。 – 2009-08-25 12:52:02