时间绑定层次结构的最佳关系数据库表示

时间:2009-04-19 10:21:49

标签: sql database reporting hierarchy

大家认为什么是SQL中有时间限制的层次结构的最佳表示?

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

第1天......

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

第2天......

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

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

主要考虑因素:

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

我知道我目前是如何做到这一点的,但我对其他人如何做到这一点感到好奇:)

修改

我天真地假设了一些注意事项,因此会更明确......

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

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

4 个答案:

答案 0 :(得分:8)

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

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

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

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

  •   

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

更多问题而不是答案 - 但我希望指针有所帮助。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我可以考虑一些合理的解决方案,具体取决于您的数据使用方式及其变化方式。

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

的历史表
ItemId, ParentId, ValidFromDate, ValidToDate

每次更改层次结构时,都会在历史记录表中添加一个新行。

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

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

答案 3 :(得分:0)

table item(id, ...)

table item_link(parent_item, child_item, from_date, until_date)

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

此结构表示网络而不是普通层次结构,但它支持在层次结构中移动内容,但也可以回顾过去。在应用程序逻辑中需要检查的一些事情是禁止在同一时间在层次结构中的不同位置链接joe。

通过先前条款(在oracle中)连接报告相对容易

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