【问题标题】:Database design to hold a person's information that changes with time?数据库设计来保存一个人随时间变化的信息?
【发布时间】:2009-08-20 00:46:32
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

标签: sql sql-server database-design temporal-database


【解决方案1】:

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

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

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

【讨论】:

  • 咧嘴一笑。感谢你的回答。我很乐意提供免费会员资格,但您似乎在美国,而我们在澳大利亚,所以它对您来说可能没有多大价值。
  • 我对这个答案的唯一补充是使历史记录表包含成员资格表中的所有字段 - 加上更改日期/时间的时间戳字段以及可能的“用户”字段记录谁改变了它。这样您就可以记录所有更改。
  • 我正在考虑学习游泳,所以你可能会比你想象的更早见到我。
【解决方案2】:

我无法推荐您阅读 Joe Celko 的“聪明人的 Sql - 高级 sql 编程”。他有一整章介绍了时间数据库设计以及如何(有效地)运行时间投影、选择和时间连接查询。而且我什至不会试图解释他在这篇文章的章节中所说的话。

【讨论】:

  • 刚看了你的个人资料,发现你也在悉尼,伙计:)
  • 我在悉尼。我将尝试追踪您建议的参考。一旦我克服了灰烬。
  • 查看北悉尼的书具 - 专门用于计算机书籍。 Celko 是任何数据库/sql 中的参考 - 与实现无关。我在一本书上做过的最好的投资。
【解决方案3】:

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

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

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

这是一项繁重的工作,但随着时间的推移会有所回报。

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2011-03-15
      • 2011-03-01
      • 1970-01-01
      • 2018-03-05
      • 2012-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多