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

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

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

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

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

2009 年 8 月 25 日更新:已经偏离轨道,还没有机会尝试建议的解决方案。希望尽快这样做,并将根据结果选择答案。

有帮助吗?

解决方案

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

这实现起来相当简单,并且完全不会影响现有系统。

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

其他提示

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

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

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

然后,我会将报告从报告数据库中删除。让星型模式执行与数据透视表相同的操作非常容易。如果有必要,我会在报告数据库前使用某种 OLAP 工具。

这是一项艰巨的工作,但随着时间的推移,它会得到回报。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top