【问题标题】:Best Relational DataBase Representation Of Time Bound Hierarchies时间限制层次结构的最佳关系数据库表示
【发布时间】:2009-04-19 10:21:49
【问题描述】:

在大家看来,SQL 中时限层次结构的最佳表示是什么?

我的意思是:
- 在任何给定日期,您都有正常的树层次结构
- 此层次结构可以每天更改
- 在任何给定日期,每个孩子仍然只有一个父母

第 1 天...

Business
 |
 |-Joe
 |  |-Happy
 |  |-Sneezy
 |  |-Doc(*)
 |
 |-Moe
    |-Bashfull
    |-Sleepy

第 2 天...

Business
 |
 |-Joe
 |  |-Happy
 |  |-Sneezy
 |
 |-Moe
    |-Doc(*)
    |-Bashfull
    |-Sleepy

任何时候,孩子都可以第一次加入层次结构,也可以完全离开层次结构。 (例如,新员工和退休员工。)

主要考虑:

  • 更新层次结构
  • 查看整个日期范围内的整个层次结构
  • 报告层次结构中的整个子树
  • 报告整个日期范围内的整个子树

我知道我目前是怎么做的,但我很想知道其他人会怎么做:)

编辑

我天真地假设了一些考虑因素,所以会更明确......

  • 每个“团队”或“人员”在其他地方的维度表中都有唯一的 ID
  • 其他事实表将使用这些 ID(例如,存储性能指标)
  • 结构需要促进跨日期范围的历史报告
  • 使用 ETL 或触发器来维护替代结构是一种选择

通用性是最重要的(仅形成通用关系模式的一部分),结合易于使用的驾驶报告(适用于任何日期范围内的树的任何部分)和可靠更新的能力。

【问题讨论】:

  • 你在乎时间吗?您是否需要知道这棵树在一天中特定时间的样子,还是它只是每天都在移动?
  • “跨日期范围”报告是什么意思?假设我要的是 3 月 1 日 - 3 月 31 日,而且每天的等级都不一样,那你会展示什么?
  • “你会展示什么?”这取决于报告的需要。它可能是某个汇总值(如果报告整个 3 月的“Moe”,那么它可能是与他的团队成员相关的某个指标的 SUM())可能会显示整个子树,显示每个指标的指标节点,以一种表示随时间变化的方式。这取决于报告。重要的是,模型会以相对容易查询的方式跟踪随时间的变化。

标签: sql database reporting hierarchy


【解决方案1】:

这里有几本不同的相关书籍 - 一组用于“时态数据库”,另一组用于“RDBMS 中的层次结构”。

在我看来,您问题的棘手部分是:

  • 查看整个日期范围内的整个层次结构

  • 在一个日期范围内报告整个子树

其他项目,如果不是直截了当的,那么可以使用书中概述的技术以及其他答案中建议的方式进行管理。部分问题在于理解这两个要点的含义。在某种意义上,它们是“相同的”; “整个层次结构”只是“整个子树”的一个特例。但更深层次的问题是“你想如何展示——可视化、表示——随着时间的推移层次结构的变化?”您是要比较开始和结束时间的状态,还是要查看中间变化?您想如何在层次结构中表示个人的移动?

问题多于答案 - 但我希望这些指针能有所帮助。

【讨论】:

    【解决方案2】:

    这里可以使用几张平板。对于每一行,我们需要列 ID、Name、ParentID 和 InactivatedDatetime(默认为 null)。为属于 Joe 的旧 Doc 设置日期时间,指示该记录不再有效并将其移至存档表(为了清洁),然后为新 Doc 创建一个新行(原始行的近似副本)以 Moe 的 ID 作为 ParentID。这种方法的缺点是被移动的人必须获得一个新的 ID,这可能不方便。

    【讨论】:

    • 新 ID 确实是个问题。这些 ID 将成为描述人员/团队的维度表以及包含绩效指标等信息的事实表的关键。同样,删除和归档记录会影响历史报告。如果我要求提供有关“上个月”的报告并且一些记录已存档,我需要在运行查询之前将它们合并回来...
    【解决方案3】:

    我可以想到几个合理的解决方案,具体取决于您的数据的使用方式和变化方式。

    1) 假设今天的等级制度是最重要的。我会在每条记录中使用传统的 ParentId 列存储今天的层次结构。对于以前版本的层次结构,我有一个历史表

    ItemId, ParentId, ValidFromDate, ValidToDate
    

    每当层次结构发生变化时,您都会在历史表中添加一个新行。

    2)如果任何/所有层次结构都同等重要,我将存储一个基线层次结构,然后实现一个层次结构事务表。

    TransactionId, ItemId, Action (Move/Delete/Add), DateTime, OldParentId, NewParentId
    

    【讨论】:

    • 不能假设今天的层次结构是最重要的,这样做会影响“在一个日期范围内报告整个子树”的能力
    • 事务表会不会使跨日期范围的报告变得“困难”?如果我想要一份“上个月”的报告,如何高效地完成?
    【解决方案4】:
    table item(id, ...)
    
    table item_link(parent_item, child_item, from_date, until_date)
    

    链接将存储树的表示一段时间

    这个结构代表一个网络而不是一个简单的层次结构,但它支持在层次结构中移动事物,而且还可以回顾时间。在应用程序逻辑中需要检查的一些事情是不允许 joe 同时链接到层次结构中的不同位置。

    通过前面的子句连接(在 oracle 中)报告相对容易

    如果要在关系上指定附加数据,其他详细信息可以与项目甚至项目链接相关。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-26
      • 2011-10-15
      • 1970-01-01
      相关资源
      最近更新 更多