8

我们使用第三方产品来管理我们的体育中心会员资格。我们有多种会员类型(例如初级、学生、员工、社区)和多种会员状态(例如年度、活跃、非活跃、暂停)。不幸的是,该产品仅记录会员当前的会员类型和状态。我希望能够跟踪我们成员的类型和状态随时间变化的方式。

目前,我们已经接触到了产品的数据库设计。它在 SQL Server 上运行,我们定期对产品的表运行我们自己的 SQL 查询以生成我们自己的表。然后,我们将表格链接到 Excel 中的数据透视表以生成图表。所以我们熟悉数据库设计和SQL。然而,我们被困在如何最好地解决这个问题上。

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

本质上,我们希望将成员的类型和状态属性转换为时间属性有效性a-la Fowler(或其他随时间变化的东西)。

我们的问题(最后:) - 鉴于上述情况:您建议我们使用哪种数据库表设计来保存此成员信息。我想它会有一个 MemberID 列,所以我们可以键入现有的 Member 表。它还需要存储成员的状态和类型以及他们被保留的日期范围。我们希望能够轻松地针对此表编写查询,以确定在给定时间点我们拥有的每种类型和状态的成员数量。

2009 年 8 月 25 日更新:已被搁置,还没有机会尝试提出的解决方案。希望尽快这样做,并将根据结果选择答案。

4

4 回答 4

8

鉴于您的系统已经编写好并就位,解决此问题的最简单方法(也是对现有数据库/代码影响最小的方法)是添加一个包含 MemberID、状态、类型和日期列的成员资格历史表。然后向主成员表添加一个 UPDATE 和一个 INSERT 触发器。当这些触发器触发时,您将成员的新值(连同状态更改的日期)写入成员历史记录表。然后,您可以查询此表以获取每个成员的历史记录。

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

我会为你写这篇文章以获得免费会员资格。:)

于 2009-08-20T01:12:08.913 回答
2

我不能推荐你阅读 Joe Celko 的“Sql for smarties - advanced sql programming”。他有一整章介绍了时间数据库设计以及如何(有效地)运行时间投影、选择和时间连接查询。我什至不会试图解释他在这篇文章的章节中所说的话。

于 2009-08-25T11:40:48.053 回答
1

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

然后我会创建更新程序来定期更新报告数据库,比如每周一次,从主数据库。这是主要工作的地方。

然后,我会将报告从报告数据库中删除。让星型模式做与数据透视表相同的事情非常容易。如有必要,我会在报告数据库前面安装某种 OLAP 工具。

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

于 2009-08-20T05:31:36.940 回答
0

我会将会员信息放在它自己的表格中,其中包含开始日期和结束日期。将客户放在单独的表中。如果您一直需要“当前”会员信息,这会很痛苦,但是有很多方法可以通过查询或触发器来解决这个问题。

于 2009-08-20T01:21:56.827 回答