我们使用第三方产品来管理我们的体育中心会员资格。我们有几种会员类型(例如,初级,学生,员工,社区)和几种会员身份(例如,年度,活动,非活动,暂停)。不幸的是,该产品仅记录会员当前的会员类型和状态。我希望能够跟踪成员的类型和状态随时间变化的方式。
目前,我们可以访问该产品的数据库设计。它在SQL Server上运行,我们定期针对产品表运行自己的SQL查询,以生成我们自己的表。然后,我们将表格链接到Excel中的数据透视表以生成图表。所以我们熟悉数据库设计和SQL。但是,我们仍然坚持如何最好地解决这个问题。
该产品记录会员的会员购买情况及其开始和到期日期。因此,我们可以通过该数据来确定成员在任何时间点的类型和状态。例如,如果他们在2007年1月1日购买了初级会员并且在2007年12月31日到期,然后他们在2008年6月1日购买了学生会员资格,我们可以看到他们的状态从活动状态变为非活动状态到活动状态(1月1日)分别于2008年1月和2008年6月1日),他们的类型从大三到学生(2008年6月1日)。
基本上我们想将会员的类型和状态属性转换为temporal properties或effectivities a-la Fowler(或其他随时间变化的事物)。
我们的问题(最后:) - 鉴于上述情况:您建议我们使用哪种数据库表设计来保存此成员信息。我想它会有一个MemberID列,所以我们可以键入现有的Member表。它还需要存储成员的状态和类型以及他们所持有的日期范围。我们希望能够轻松地针对此表编写查询,以确定在给定时间点我们拥有的每种类型和状态的成员数。
更新2009-08-25:已经进行了侧面跟踪,但还没有机会尝试提出的解决方案。希望尽快这样做,并根据结果选择答案。
答案 0 :(得分:8)
鉴于您的系统已经编写并且到位,解决此问题的最简单方法(以及影响现有数据库/代码的最简单方法)是添加包含MemberID,状态,类型和日期列。然后将UPDATE和INSERT触发器添加到主成员表。当这些触发器触发时,您将成员的新值(以及状态更改的日期)写入成员历史记录表中。然后,您可以只查询此表以获取每个成员的历史记录。
这实现起来相当简单,根本不会影响现有系统。
我会为你写这个免费会员资格。 :)
答案 1 :(得分:2)
我不能建议你阅读Joe Celko的“Sql for smarties - 高级sql编程”。他有一整章关于时态数据库设计以及如何(有效地)运行时间投影,选择和时间连接查询。我甚至不会公正地试图解释他在这篇文章的章节中所说的内容。
答案 2 :(得分:1)
我会创建一个组织成星型模式的报告数据库。会员维度将在时间上排列,以便在不同的时间点为同一成员存在不同的行。这样,事实表中的不同行可能与历史中的不同点有关。
然后我将创建更新程序,用于定期更新报告数据库,例如每周一次,从主数据库更新。这是主要工作的来源。
然后,我会将报告从报告数据库中删除。制作星型模式很容易做到数据透视表所做的事情。如有必要,我会在报告数据库前面找到某种OLAP工具。
这是一项很多工作,但随着时间的推移它会得到回报。
答案 3 :(得分:0)
我会将会员信息放在它自己的表中,包含开始日期和结束日期。将客户保持在单独的表中。如果您一直需要“当前”会员信息,这会很痛苦,但有很多方法可以通过查询或触发器来解决这个问题。